diff options
author | Benjamin Otte <otte@redhat.com> | 2010-05-19 20:47:31 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2010-05-20 11:02:49 +0200 |
commit | bb7ca71c1af416ca084f03089f5fe762403635dd (patch) | |
tree | 2741ab8fa64009ca31fc60eacda364aa930cc52d | |
parent | 6c477b4a945a8f8b866bb2f5e125d4a0328d05f4 (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.c | 30 | ||||
-rw-r--r-- | src/cairo-gl-private.h | 10 | ||||
-rw-r--r-- | src/cairo-gl-shaders.c | 16 |
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; } |