[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