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.
This commit is contained in:
Benjamin Otte 2010-05-19 20:47:31 +02:00
parent 6c477b4a94
commit bb7ca71c1a
3 changed files with 24 additions and 32 deletions

View file

@ -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;
}

View file

@ -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,

View file

@ -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;
}