summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-05-19 18:21:06 +0200
committerBenjamin Otte <otte@redhat.com>2010-05-20 11:02:49 +0200
commit065969d78f23c634ebcb2b931cbb1fe184f2cedf (patch)
treef39c4389a10270d59d7a9a426f72c42c0d6a3beb
parentc53f7778bcf274f64f801ef9ee1641a088842f60 (diff)
gl: Separate binding to shaders from setting operands
That way we only need to bind to shaders when creating them, but not everytime we switch shaders on text output.
-rw-r--r--src/cairo-gl-composite.c156
-rw-r--r--src/cairo-gl-shaders.c2
2 files changed, 79 insertions, 79 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c
index 61bac273..76ae6cdd 100644
--- a/src/cairo-gl-composite.c
+++ b/src/cairo-gl-composite.c
@@ -539,31 +539,86 @@ _cairo_gl_composite_set_clip_region (cairo_gl_context_t *ctx,
}
static void
-_cairo_gl_set_tex_combine_constant_color (cairo_gl_context_t *ctx,
- cairo_gl_composite_t *setup,
- int tex_unit,
- GLfloat *color)
+_cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx,
+ cairo_gl_shader_t *shader,
+ cairo_gl_operand_t *operand,
+ const char *name)
{
- if (setup->shader) {
- const char *uniform_name;
+ char uniform_name[50];
+ char *custom_part;
- if (tex_unit == 0)
- uniform_name = "source_constant";
- else
- uniform_name = "mask_constant";
+ strcpy (uniform_name, name);
+ custom_part = uniform_name + strlen (name);
+ switch (operand->type) {
+ default:
+ case CAIRO_GL_OPERAND_COUNT:
+ ASSERT_NOT_REACHED;
+ case CAIRO_GL_OPERAND_NONE:
+ case CAIRO_GL_OPERAND_SPANS:
+ case CAIRO_GL_OPERAND_TEXTURE:
+ break;
+ case CAIRO_GL_OPERAND_CONSTANT:
+ strcpy (custom_part, "_constant");
_cairo_gl_shader_bind_vec4 (ctx,
- setup->shader,
- uniform_name,
- color[0],
- color[1],
- color[2],
- color[3]);
-
- return;
+ shader,
+ uniform_name,
+ operand->constant.color[0],
+ operand->constant.color[1],
+ operand->constant.color[2],
+ operand->constant.color[3]);
+ break;
+ case CAIRO_GL_OPERAND_LINEAR_GRADIENT:
+ strcpy (custom_part, "_matrix");
+ _cairo_gl_shader_bind_matrix (ctx, shader,
+ uniform_name,
+ &operand->linear.m);
+ strcpy (custom_part, "_segment");
+ _cairo_gl_shader_bind_vec2 (ctx, shader,
+ uniform_name,
+ operand->linear.segment_x,
+ operand->linear.segment_y);
+ break;
+ case CAIRO_GL_OPERAND_RADIAL_GRADIENT:
+ strcpy (custom_part, "_matrix");
+ _cairo_gl_shader_bind_matrix (ctx, shader,
+ uniform_name,
+ &operand->radial.m);
+ strcpy (custom_part, "_circle_1");
+ _cairo_gl_shader_bind_vec2 (ctx, shader,
+ uniform_name,
+ operand->radial.circle_1_x,
+ operand->radial.circle_1_y);
+ strcpy (custom_part, "_radius_0");
+ _cairo_gl_shader_bind_float (ctx, shader,
+ uniform_name,
+ operand->radial.radius_0);
+ strcpy (custom_part, "_radius_1");
+ _cairo_gl_shader_bind_float (ctx, shader,
+ uniform_name,
+ operand->radial.radius_1);
+ break;
}
+}
+
+static void
+_cairo_gl_composite_bind_to_shader (cairo_gl_context_t *ctx,
+ cairo_gl_composite_t *setup,
+ cairo_gl_shader_t *shader)
+{
+ if (shader == NULL)
+ return;
+
+ _cairo_gl_operand_bind_to_shader (ctx, shader, &setup->src, "source");
+ _cairo_gl_operand_bind_to_shader (ctx, shader, &setup->mask, "mask");
+}
- /* Fall back to fixed function */
+static void
+_cairo_gl_set_tex_combine_constant_color (cairo_gl_context_t *ctx,
+ cairo_gl_composite_t *setup,
+ int tex_unit,
+ GLfloat *color)
+{
glActiveTexture (GL_TEXTURE0 + tex_unit);
/* Have to have a dummy texture bound in order to use the combiner unit. */
glBindTexture (ctx->tex_target, ctx->dummy_tex);
@@ -638,38 +693,12 @@ _cairo_gl_set_src_operand (cairo_gl_context_t *ctx,
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_1D, setup->src.linear.tex);
glEnable (GL_TEXTURE_1D);
-
- _cairo_gl_shader_bind_matrix (ctx, setup->shader,
- "source_matrix",
- &setup->src.linear.m);
-
- _cairo_gl_shader_bind_vec2 (ctx, setup->shader,
- "source_segment",
- setup->src.linear.segment_x,
- setup->src.linear.segment_y);
break;
case CAIRO_GL_OPERAND_RADIAL_GRADIENT:
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_1D, setup->src.linear.tex);
glEnable (GL_TEXTURE_1D);
-
- _cairo_gl_shader_bind_matrix (ctx, setup->shader,
- "source_matrix",
- &setup->src.radial.m);
-
- _cairo_gl_shader_bind_vec2 (ctx, setup->shader,
- "source_circle_1",
- setup->src.radial.circle_1_x,
- setup->src.radial.circle_1_y);
-
- _cairo_gl_shader_bind_float (ctx, setup->shader,
- "source_radius_0",
- setup->src.radial.radius_0);
-
- _cairo_gl_shader_bind_float (ctx, setup->shader,
- "source_radius_1",
- setup->src.radial.radius_1);
break;
default:
case CAIRO_GL_OPERAND_COUNT:
@@ -737,14 +766,6 @@ _cairo_gl_set_linear_gradient_mask_operand (cairo_gl_context_t *ctx,
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_1D, setup->mask.linear.tex);
glEnable (GL_TEXTURE_1D);
-
- _cairo_gl_shader_bind_matrix (ctx, setup->shader,
- "mask_matrix", &setup->mask.linear.m);
-
- _cairo_gl_shader_bind_vec2 (ctx, setup->shader,
- "mask_segment",
- setup->mask.linear.segment_x,
- setup->mask.linear.segment_y);
}
static void
@@ -756,23 +777,6 @@ _cairo_gl_set_radial_gradient_mask_operand (cairo_gl_context_t *ctx,
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_1D, setup->mask.radial.tex);
glEnable (GL_TEXTURE_1D);
-
- _cairo_gl_shader_bind_matrix (ctx, setup->shader,
- "mask_matrix",
- &setup->mask.radial.m);
-
- _cairo_gl_shader_bind_vec2 (ctx, setup->shader,
- "mask_circle_1",
- setup->mask.radial.circle_1_x,
- setup->mask.radial.circle_1_y);
-
- _cairo_gl_shader_bind_float (ctx, setup->shader,
- "mask_radius_0",
- setup->mask.radial.radius_0);
-
- _cairo_gl_shader_bind_float (ctx, setup->shader,
- "mask_radius_1",
- setup->mask.radial.radius_1);
}
/* This is like _cairo_gl_set_src_alpha_operand, for component alpha setup
@@ -801,14 +805,7 @@ _cairo_gl_set_component_alpha_mask_operand (cairo_gl_context_t *ctx,
switch (setup->mask.type) {
case CAIRO_GL_OPERAND_CONSTANT:
/* Have to have a dummy texture bound in order to use the combiner unit. */
- if (setup->shader) {
- _cairo_gl_shader_bind_vec4 (ctx, setup->shader,
- "mask_constant",
- setup->mask.constant.color[0],
- setup->mask.constant.color[1],
- setup->mask.constant.color[2],
- setup->mask.constant.color[3]);
- } else {
+ if (! setup->shader) {
glBindTexture (ctx->tex_target, ctx->dummy_tex);
glActiveTexture (GL_TEXTURE1);
glEnable (ctx->tex_target);
@@ -1095,6 +1092,8 @@ _cairo_gl_composite_begin_component_alpha (cairo_gl_context_t *ctx,
&setup->pre_shader);
if (unlikely (status))
return status;
+ _cairo_gl_set_shader (ctx, setup->pre_shader);
+ _cairo_gl_composite_bind_to_shader (ctx, setup, setup->pre_shader);
}
return CAIRO_STATUS_SUCCESS;
@@ -1139,6 +1138,7 @@ _cairo_gl_composite_begin (cairo_gl_context_t *ctx,
setup->has_component_alpha);
_cairo_gl_set_shader (ctx, setup->shader);
+ _cairo_gl_composite_bind_to_shader (ctx, setup, setup->shader);
glBindBufferARB (GL_ARRAY_BUFFER_ARB, ctx->vbo);
diff --git a/src/cairo-gl-shaders.c b/src/cairo-gl-shaders.c
index 3484321f..ccd97809 100644
--- a/src/cairo-gl-shaders.c
+++ b/src/cairo-gl-shaders.c
@@ -550,7 +550,7 @@ _cairo_gl_shader_fini (cairo_gl_context_t *ctx,
ctx->shader_impl->destroy_program (shader->program);
}
-typedef enum cairo_gl_operand_target {
+typedef enum cairo_gl_operand_name {
CAIRO_GL_OPERAND_SOURCE,
CAIRO_GL_OPERAND_MASK,
CAIRO_GL_OPERAND_DEST