[PATCH 2/4] compositor: factor out RGB shader.
Gwenole Beauchesne
gb.devel at gmail.com
Fri May 18 10:23:31 PDT 2012
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 at intel.com>
---
src/compositor-wayland.c | 2 +-
src/compositor.c | 54 ++++++++++++++++++++++++++++-----------------
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;
--
1.7.5.4
More information about the wayland-devel
mailing list