From 6d0304904c4c174fe91aca20ea01ea1287534d9e Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 20 Apr 2012 11:15:51 +0200 Subject: [PATCH] compositor: factor out RGB shader. Simplify RGB shader code and split off common code that could be reused. This is preparatory work for YUV shaders. Signed-off-by: Gwenole Beauchesne --- src/compositor-wayland.c | 2 +- src/compositor.c | 41 +++++++++++++++++++++++++--------------- src/compositor.h | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index 9df72287..c2a84c44 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -177,7 +177,7 @@ draw_border(struct wayland_output *output) { struct wayland_compositor *c = (struct wayland_compositor *) output->base.compositor; - struct weston_shader *shader = &c->base.texture_shader; + struct weston_shader *shader = &c->base.texture_shader_rgba; GLfloat *v; int n; diff --git a/src/compositor.c b/src/compositor.c index 4da2d550..4284c678 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -763,7 +763,7 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer) if (wl_buffer_is_shm(buffer)) { es->pitch = wl_shm_buffer_get_stride(buffer) / 4; - es->shader = &ec->texture_shader; + es->shader = &ec->texture_shader_rgba; ensure_textures(es, 1); glBindTexture(GL_TEXTURE_2D, es->textures[0]); @@ -787,7 +787,7 @@ weston_surface_attach(struct wl_surface *surface, struct wl_buffer *buffer) ec->image_target_texture_2d(GL_TEXTURE_2D, es->images[0]); es->pitch = buffer->width; - es->shader = &ec->texture_shader; + es->shader = &ec->texture_shader_rgba; } } @@ -2760,23 +2760,34 @@ static const char vertex_shader[] = " v_texcoord = texcoord;\n" "}\n"; -static const char texture_fragment_shader[] = +/* Declare common fragment shader uniforms */ +#define FRAGMENT_SHADER_UNIFORMS \ + "uniform float alpha;\n" \ + "uniform float texwidth;\n" \ + "uniform vec4 opaque;\n" + +/* Common fragment shader init code (check texture bounds) */ +#define FRAGMENT_SHADER_INIT \ + " if (v_texcoord.x < 0.0 || v_texcoord.x > texwidth ||\n" \ + " v_texcoord.y < 0.0 || v_texcoord.y > 1.0)\n" \ + " discard;\n" + +#define FRAGMENT_SHADER_EXIT \ + " if (opaque.x <= v_texcoord.x && v_texcoord.x < opaque.y &&\n" \ + " opaque.z <= v_texcoord.y && v_texcoord.y < opaque.w)\n" \ + " gl_FragColor.a = 1.0;\n" \ + " gl_FragColor = alpha * gl_FragColor;\n" + +static const char texture_fragment_shader_rgba[] = "precision mediump float;\n" "varying vec2 v_texcoord;\n" "uniform sampler2D tex;\n" - "uniform float alpha;\n" - "uniform float texwidth;\n" - "uniform vec4 opaque;\n" + FRAGMENT_SHADER_UNIFORMS "void main()\n" "{\n" - " if (v_texcoord.x < 0.0 || v_texcoord.x > texwidth ||\n" - " v_texcoord.y < 0.0 || v_texcoord.y > 1.0)\n" - " discard;\n" + FRAGMENT_SHADER_INIT " gl_FragColor = texture2D(tex, v_texcoord)\n;" - " if (opaque.x <= v_texcoord.x && v_texcoord.x < opaque.y &&\n" - " opaque.z <= v_texcoord.y && v_texcoord.y < opaque.w)\n" - " gl_FragColor.a = 1.0;\n" - " gl_FragColor = alpha * gl_FragColor;\n" + FRAGMENT_SHADER_EXIT "}\n"; static const char solid_fragment_shader[] = @@ -3135,8 +3146,8 @@ weston_compositor_init_gl(struct weston_compositor *ec) glActiveTexture(GL_TEXTURE0); - if (weston_shader_init(&ec->texture_shader, - vertex_shader, texture_fragment_shader) < 0) + if (weston_shader_init(&ec->texture_shader_rgba, + vertex_shader, texture_fragment_shader_rgba) < 0) return -1; if (weston_shader_init(&ec->solid_shader, vertex_shader, solid_fragment_shader) < 0) diff --git a/src/compositor.h b/src/compositor.h index 8e3225f8..533de3fa 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -270,7 +270,7 @@ struct weston_compositor { EGLContext egl_context; EGLConfig egl_config; GLuint fbo; - struct weston_shader texture_shader; + struct weston_shader texture_shader_rgba; struct weston_shader solid_shader; struct weston_shader *current_shader; struct wl_display *wl_display;