summaryrefslogtreecommitdiff
path: root/sway/desktop/fx_renderer.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/desktop/fx_renderer.c')
-rw-r--r--sway/desktop/fx_renderer.c69
1 files changed, 33 insertions, 36 deletions
diff --git a/sway/desktop/fx_renderer.c b/sway/desktop/fx_renderer.c
index 80ede4d3..a5ad0dab 100644
--- a/sway/desktop/fx_renderer.c
+++ b/sway/desktop/fx_renderer.c
@@ -22,8 +22,6 @@
#include "corner_frag_src.h"
#include "quad_frag_src.h"
#include "quad_round_frag_src.h"
-#include "quad_round_tl_frag_src.h"
-#include "quad_round_tr_frag_src.h"
#include "tex_frag_src.h"
static const GLfloat verts[] = {
@@ -98,9 +96,9 @@ static void matrix_projection(float mat[static 9], int width, int height,
mat[8] = 1.0f;
}
-static GLuint compile_shader(GLuint type, const GLchar **srcs, size_t srcs_len) {
+static GLuint compile_shader(GLuint type, const GLchar *src) {
GLuint shader = glCreateShader(type);
- glShaderSource(shader, srcs_len, srcs, NULL);
+ glShaderSource(shader, 1, &src, NULL);
glCompileShader(shader);
GLint ok;
@@ -114,24 +112,14 @@ static GLuint compile_shader(GLuint type, const GLchar **srcs, size_t srcs_len)
return shader;
}
-static GLuint link_program(const GLchar *frag_src, enum fx_gles2_shader_source source) {
+static GLuint link_program(const GLchar *frag_src) {
const GLchar *vert_src = common_vert_src;
- GLuint vert = compile_shader(GL_VERTEX_SHADER, &vert_src, 1);
+ GLuint vert = compile_shader(GL_VERTEX_SHADER, vert_src);
if (!vert) {
goto error;
}
- GLuint frag;
- if (source != WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE) {
- static char frag_preamble[1024];
- snprintf(frag_preamble, sizeof(frag_preamble),
- "#define SOURCE %d\n", source);
-
- const GLchar *frag_srcs[2] = { frag_preamble, frag_src };
- frag = compile_shader(GL_FRAGMENT_SHADER, frag_srcs, 2);
- } else {
- frag = compile_shader(GL_FRAGMENT_SHADER, &frag_src, 1);
- }
+ GLuint frag = compile_shader(GL_FRAGMENT_SHADER, frag_src);
if (!frag) {
glDeleteShader(vert);
goto error;
@@ -162,11 +150,13 @@ error:
}
static bool link_tex_program(struct fx_renderer *renderer,
- struct gles2_tex_shader *shader, enum fx_gles2_shader_source source) {
- GLuint prog;
- const GLchar *frag_src = tex_frag_src;
+ struct gles2_tex_shader *shader, enum fx_tex_shader_source source) {
+ GLchar frag_src[2048];
+ snprintf(frag_src, sizeof(frag_src),
+ "#define SOURCE %d\n%s", source, tex_frag_src);
- shader->program = prog = link_program(frag_src, source);
+ GLuint prog;
+ shader->program = prog = link_program(frag_src);
if (!shader->program) {
return false;
}
@@ -187,18 +177,25 @@ static bool link_tex_program(struct fx_renderer *renderer,
return true;
}
-// initializes a provided rounded quad shader and returns false if unsuccessful
-bool init_rounded_quad_shader(struct rounded_quad_shader *shader, GLuint prog) {
- shader->program = prog;
+static bool link_rounded_quad_program(struct fx_renderer *renderer,
+ struct rounded_quad_shader *shader, enum fx_rounded_quad_shader_source source) {
+ GLchar quad_src[2048];
+ snprintf(quad_src, sizeof(quad_src),
+ "#define SOURCE %d\n%s", source, quad_round_frag_src);
+
+ GLuint prog;
+ shader->program = prog = link_program(quad_src);
if (!shader->program) {
return false;
}
+
shader->proj = glGetUniformLocation(prog, "proj");
shader->color = glGetUniformLocation(prog, "color");
shader->pos_attrib = glGetAttribLocation(prog, "pos");
shader->size = glGetUniformLocation(prog, "size");
shader->position = glGetUniformLocation(prog, "position");
shader->radius = glGetUniformLocation(prog, "radius");
+
return true;
}
@@ -269,7 +266,7 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) {
GLuint prog;
// quad fragment shader
- prog = link_program(quad_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
+ prog = link_program(quad_frag_src);
renderer->shaders.quad.program = prog;
if (!renderer->shaders.quad.program) {
goto error;
@@ -279,21 +276,21 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) {
renderer->shaders.quad.pos_attrib = glGetAttribLocation(prog, "pos");
// rounded quad fragment shaders
- prog = link_program(quad_round_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
- if (!init_rounded_quad_shader(&renderer->shaders.rounded_quad, prog)) {
+ if (!link_rounded_quad_program(renderer, &renderer->shaders.rounded_quad,
+ SHADER_SOURCE_QUAD_ROUND)) {
goto error;
}
- prog = link_program(quad_round_tl_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
- if (!init_rounded_quad_shader(&renderer->shaders.rounded_tl_quad, prog)) {
+ if (!link_rounded_quad_program(renderer, &renderer->shaders.rounded_tl_quad,
+ SHADER_SOURCE_QUAD_ROUND_TOP_LEFT)) {
goto error;
}
- prog = link_program(quad_round_tr_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
- if (!init_rounded_quad_shader(&renderer->shaders.rounded_tr_quad, prog)) {
+ if (!link_rounded_quad_program(renderer, &renderer->shaders.rounded_tr_quad,
+ SHADER_SOURCE_QUAD_ROUND_TOP_RIGHT)) {
goto error;
}
// Border corner shader
- prog = link_program(corner_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
+ prog = link_program(corner_frag_src);
renderer->shaders.corner.program = prog;
if (!renderer->shaders.corner.program) {
goto error;
@@ -311,7 +308,7 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) {
renderer->shaders.corner.half_thickness = glGetUniformLocation(prog, "half_thickness");
// box shadow shader
- prog = link_program(box_shadow_frag_src, WLR_GLES2_SHADER_SOURCE_NOT_TEXTURE);
+ prog = link_program(box_shadow_frag_src);
renderer->shaders.box_shadow.program = prog;
if (!renderer->shaders.box_shadow.program) {
goto error;
@@ -326,15 +323,15 @@ struct fx_renderer *fx_renderer_create(struct wlr_egl *egl) {
// fragment shaders
if (!link_tex_program(renderer, &renderer->shaders.tex_rgba,
- WLR_GLES2_SHADER_SOURCE_TEXTURE_RGBA)) {
+ SHADER_SOURCE_TEXTURE_RGBA)) {
goto error;
}
if (!link_tex_program(renderer, &renderer->shaders.tex_rgbx,
- WLR_GLES2_SHADER_SOURCE_TEXTURE_RGBX)) {
+ SHADER_SOURCE_TEXTURE_RGBX)) {
goto error;
}
if (!link_tex_program(renderer, &renderer->shaders.tex_ext,
- WLR_GLES2_SHADER_SOURCE_TEXTURE_EXTERNAL)) {
+ SHADER_SOURCE_TEXTURE_EXTERNAL)) {
goto error;
}