diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-04-20 11:15:51 +0200 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-05-18 17:38:30 +0200 |
commit | 60ebc27e64f80f41fb03fd2d37d98371b6bb3bab (patch) | |
tree | c853a0d9b17eb08b9f166abc950ffb105f95f82e | |
parent | f641798ffdfd1be18c2efcae6d03302fe480cb5b (diff) |
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 <gwenole.beauchesne@intel.com>
-rw-r--r-- | src/compositor-wayland.c | 2 | ||||
-rw-r--r-- | src/compositor.c | 54 | ||||
-rw-r--r-- | src/compositor.h | 2 |
3 files changed, 35 insertions, 23 deletions
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index bbacea4..34fb08c 100644 --- a/src/compositor-wayland.c +++ b/src/compositor-wayland.c @@ -174,7 +174,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 4f4d4ab..27d7bee 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -787,7 +787,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]); @@ -810,7 +810,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; } } @@ -2368,29 +2368,41 @@ 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 bright;\n" \ + "uniform float saturation;\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" + +/* Common fragment shader exit code (saturation, brightness, global alpha) */ +#define FRAGMENT_SHADER_EXIT \ + " float gray = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));\n" \ + " vec3 range = (gl_FragColor.rgb - vec3 (gray, gray, gray)) * saturation;\n" \ + " gl_FragColor = vec4(vec3(gray + range), gl_FragColor.a);\n" \ + " gl_FragColor = vec4(vec3(bright, bright, bright) * gl_FragColor.rgb, gl_FragColor.a);\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" + +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 bright;\n" - "uniform float saturation;\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;" - " float gray = dot(gl_FragColor.rgb, vec3(0.299, 0.587, 0.114));\n" - " vec3 range = (gl_FragColor.rgb - vec3 (gray, gray, gray)) * saturation;\n" - " gl_FragColor = vec4(vec3(gray + range), gl_FragColor.a);\n" - " gl_FragColor = vec4(vec3(bright, bright, bright) * gl_FragColor.rgb, gl_FragColor.a);\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[] = @@ -2683,8 +2695,8 @@ weston_compositor_init(struct weston_compositor *ec, struct wl_display *display) 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 44ac923..24630b4 100644 --- a/src/compositor.h +++ b/src/compositor.h @@ -203,7 +203,7 @@ struct weston_compositor { EGLContext context; EGLConfig 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; |