summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2010-05-19 20:47:31 +0200
committerBenjamin Otte <otte@redhat.com>2010-05-20 11:02:49 +0200
commitbb7ca71c1af416ca084f03089f5fe762403635dd (patch)
tree2741ab8fa64009ca31fc60eacda364aa930cc52d
parent6c477b4a945a8f8b866bb2f5e125d4a0328d05f4 (diff)
gl: Don't store the shader in the composite_t anymore
Now that we have ctx->current_shader, there's no need to keep it in the composite setup code.
-rw-r--r--src/cairo-gl-composite.c30
-rw-r--r--src/cairo-gl-private.h10
-rw-r--r--src/cairo-gl-shaders.c16
3 files changed, 24 insertions, 32 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c
index 15fa8381..12c6225c 100644
--- a/src/cairo-gl-composite.c
+++ b/src/cairo-gl-composite.c
@@ -842,7 +842,7 @@ static void
_cairo_gl_set_mask_operand (cairo_gl_context_t *ctx,
cairo_gl_composite_t *setup)
{
- if (setup->shader)
+ if (ctx->current_shader)
return;
switch (setup->mask.type) {
@@ -1052,15 +1052,14 @@ _cairo_gl_composite_begin_component_alpha (cairo_gl_context_t *ctx,
*/
if (setup->op == CAIRO_OPERATOR_OVER) {
setup->op = CAIRO_OPERATOR_ADD;
- status = _cairo_gl_get_shader (ctx,
- setup->src.type,
- setup->mask.type,
- CAIRO_GL_SHADER_IN_CA_SOURCE_ALPHA,
- &setup->pre_shader);
+ status = _cairo_gl_set_shader_by_type (ctx,
+ setup->src.type,
+ setup->mask.type,
+ CAIRO_GL_SHADER_IN_CA_SOURCE_ALPHA);
if (unlikely (status))
return status;
- _cairo_gl_set_shader (ctx, setup->pre_shader);
_cairo_gl_composite_bind_to_shader (ctx, setup);
+ setup->pre_shader = ctx->current_shader;
}
return CAIRO_STATUS_SUCCESS;
@@ -1080,12 +1079,11 @@ _cairo_gl_composite_begin (cairo_gl_context_t *ctx,
return status;
}
- status = _cairo_gl_get_shader (ctx,
- setup->src.type,
- setup->mask.type,
- setup->has_component_alpha ? CAIRO_GL_SHADER_IN_CA_SOURCE
- : CAIRO_GL_SHADER_IN_NORMAL,
- &setup->shader);
+ status = _cairo_gl_set_shader_by_type (ctx,
+ setup->src.type,
+ setup->mask.type,
+ setup->has_component_alpha ? CAIRO_GL_SHADER_IN_CA_SOURCE
+ : CAIRO_GL_SHADER_IN_NORMAL);
if (unlikely (status)) {
setup->pre_shader = NULL;
return status;
@@ -1104,7 +1102,6 @@ _cairo_gl_composite_begin (cairo_gl_context_t *ctx,
setup->op,
setup->has_component_alpha);
- _cairo_gl_set_shader (ctx, setup->shader);
_cairo_gl_composite_bind_to_shader (ctx, setup);
_cairo_gl_operand_setup_texture (ctx, &setup->src, 0);
@@ -1153,13 +1150,15 @@ _cairo_gl_composite_draw (cairo_gl_context_t *ctx,
if (! setup->pre_shader) {
glDrawArrays (GL_TRIANGLES, 0, count);
} else {
+ cairo_gl_shader_t *prev_shader = ctx->current_shader;
+
_cairo_gl_set_shader (ctx, setup->pre_shader);
_cairo_gl_set_operator (setup->dst, CAIRO_OPERATOR_DEST_OUT, TRUE);
_cairo_gl_set_src_alpha_operand (ctx, setup);
_cairo_gl_set_component_alpha_mask_operand (ctx, setup);
glDrawArrays (GL_TRIANGLES, 0, count);
- _cairo_gl_set_shader (ctx, setup->shader);
+ _cairo_gl_set_shader (ctx, prev_shader);
_cairo_gl_set_operator (setup->dst, setup->op, TRUE);
_cairo_gl_set_src_operand (ctx, setup);
_cairo_gl_set_component_alpha_mask_operand (ctx, setup);
@@ -1361,7 +1360,6 @@ _cairo_gl_composite_end (cairo_gl_context_t *ctx,
glDisable (GL_TEXTURE_1D);
glDisable (ctx->tex_target);
- setup->shader = NULL;
setup->pre_shader = NULL;
}
diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h
index 6f191c9b..0a668137 100644
--- a/src/cairo-gl-private.h
+++ b/src/cairo-gl-private.h
@@ -194,7 +194,6 @@ typedef struct _cairo_gl_composite {
cairo_gl_operand_t src;
cairo_gl_operand_t mask;
- cairo_gl_shader_t *shader;
cairo_gl_shader_t *pre_shader; /* for component alpha */
char *vb;
@@ -397,11 +396,10 @@ _cairo_gl_shader_compile (cairo_gl_context_t *ctx,
const char *fragment_text);
cairo_private cairo_status_t
-_cairo_gl_get_shader (cairo_gl_context_t *ctx,
- cairo_gl_operand_type_t source,
- cairo_gl_operand_type_t mask,
- cairo_gl_shader_in_t in,
- cairo_gl_shader_t **out_program);
+_cairo_gl_set_shader_by_type (cairo_gl_context_t *ctx,
+ cairo_gl_operand_type_t source,
+ cairo_gl_operand_type_t mask,
+ cairo_gl_shader_in_t in);
cairo_private void
_cairo_gl_shader_bind_float (cairo_gl_context_t *ctx,
diff --git a/src/cairo-gl-shaders.c b/src/cairo-gl-shaders.c
index 246598c0..d2c19737 100644
--- a/src/cairo-gl-shaders.c
+++ b/src/cairo-gl-shaders.c
@@ -925,17 +925,15 @@ _cairo_gl_set_shader (cairo_gl_context_t *ctx,
}
cairo_status_t
-_cairo_gl_get_shader (cairo_gl_context_t *ctx,
- cairo_gl_operand_type_t source,
- cairo_gl_operand_type_t mask,
- cairo_gl_shader_in_t in,
- cairo_gl_shader_t **out)
+_cairo_gl_set_shader_by_type (cairo_gl_context_t *ctx,
+ cairo_gl_operand_type_t source,
+ cairo_gl_operand_type_t mask,
+ cairo_gl_shader_in_t in)
{
cairo_shader_cache_entry_t lookup, *entry;
char *fs_source;
cairo_status_t status;
- *out = NULL;
if (ctx->shader_impl == NULL)
return CAIRO_STATUS_SUCCESS;
@@ -949,7 +947,7 @@ _cairo_gl_get_shader (cairo_gl_context_t *ctx,
entry = _cairo_cache_lookup (&ctx->shaders, &lookup.base);
if (entry) {
assert (entry->shader.program);
- *out = &entry->shader;
+ _cairo_gl_set_shader (ctx, &entry->shader);
return CAIRO_STATUS_SUCCESS;
}
@@ -992,6 +990,7 @@ _cairo_gl_get_shader (cairo_gl_context_t *ctx,
}
_cairo_gl_set_shader (ctx, &entry->shader);
+
if (source != CAIRO_GL_OPERAND_CONSTANT) {
_cairo_gl_shader_bind_texture (ctx, "source_sampler", 0);
}
@@ -1001,8 +1000,5 @@ _cairo_gl_get_shader (cairo_gl_context_t *ctx,
_cairo_gl_shader_bind_texture (ctx, "mask_sampler", 1);
}
- _cairo_gl_set_shader (ctx, NULL);
-
- *out = &entry->shader;
return CAIRO_STATUS_SUCCESS;
}