diff options
author | Eric Anholt <eric@anholt.net> | 2011-02-21 13:37:00 -0800 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2011-02-26 14:09:54 -0800 |
commit | 17169a1e5130b8a287f07eb43d41f0b51307cc57 (patch) | |
tree | f61fc187574e4e2200d3a47579a215abe233af86 | |
parent | 2fae22a3f2914a6e79436bafe94d19100d7cf6bf (diff) |
gl: Bind samplers just once at program compile time.
We never bound any other value to the sampler uniforms, so why bother
resetting them all the time?
[ 0] before firefox-talos-gfx 29.972 30.493 0.89% 3/3
[ 0] after firefox-talos-gfx 29.397 29.599 1.27% 3/3
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | src/cairo-gl-composite.c | 6 | ||||
-rw-r--r-- | src/cairo-gl-private.h | 5 | ||||
-rw-r--r-- | src/cairo-gl-shaders.c | 58 |
3 files changed, 35 insertions, 34 deletions
diff --git a/src/cairo-gl-composite.c b/src/cairo-gl-composite.c index d5b3c5c89..c8f84a9b1 100644 --- a/src/cairo-gl-composite.c +++ b/src/cairo-gl-composite.c @@ -401,13 +401,9 @@ _cairo_gl_operand_bind_to_shader (cairo_gl_context_t *ctx, _cairo_gl_shader_bind_float (ctx, uniform_name, operand->gradient.radius_0); - /* fall through */ + break; case CAIRO_GL_OPERAND_LINEAR_GRADIENT: case CAIRO_GL_OPERAND_TEXTURE: - strcpy (custom_part, "_sampler"); - _cairo_gl_shader_bind_texture(ctx, - uniform_name, - tex_unit); break; } } diff --git a/src/cairo-gl-private.h b/src/cairo-gl-private.h index 475f14aa5..73818b121 100644 --- a/src/cairo-gl-private.h +++ b/src/cairo-gl-private.h @@ -548,11 +548,6 @@ _cairo_gl_shader_bind_matrix4f (cairo_gl_context_t *ctx, GLfloat* gl_m); cairo_private void -_cairo_gl_shader_bind_texture (cairo_gl_context_t *ctx, - const char *name, - GLuint tex_unit); - -cairo_private void _cairo_gl_set_shader (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader); diff --git a/src/cairo-gl-shaders.c b/src/cairo-gl-shaders.c index a17491ede..39e4e30ec 100644 --- a/src/cairo-gl-shaders.c +++ b/src/cairo-gl-shaders.c @@ -99,12 +99,6 @@ typedef struct cairo_gl_shader_impl { GLfloat* gl_m); void - (*bind_texture) (cairo_gl_context_t *ctx, - cairo_gl_shader_t *shader, - const char *name, - cairo_gl_tex_t tex_unit); - - void (*use) (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader); } shader_impl_t; @@ -291,16 +285,6 @@ bind_matrix4f_core_2_0 (cairo_gl_context_t *ctx, } static void -bind_texture_core_2_0 (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader, - const char *name, cairo_gl_tex_t tex_unit) -{ - cairo_gl_dispatch_t *dispatch = &ctx->dispatch; - GLint location = dispatch->GetUniformLocation (shader->program, name); - assert (location != -1); - dispatch->Uniform1i (location, tex_unit); -} - -static void use_program_core_2_0 (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader) { @@ -321,7 +305,6 @@ static const cairo_gl_shader_impl_t shader_impl_core_2_0 = { bind_vec4_core_2_0, bind_matrix_core_2_0, bind_matrix4f_core_2_0, - bind_texture_core_2_0, use_program_core_2_0, }; @@ -788,6 +771,38 @@ _cairo_gl_shader_compile (cairo_gl_context_t *ctx, return status; } +/* We always bind the source to texture unit 0 if present, and mask to + * texture unit 1 if present, so we can just initialize these once at + * compile time. + */ +static void +_cairo_gl_shader_set_samplers (cairo_gl_context_t *ctx, + cairo_gl_shader_t *shader) +{ + cairo_gl_dispatch_t *dispatch = &ctx->dispatch; + GLint location; + GLint saved_program; + + /* We have to save/restore the current program because we might be + * asked for a different program while a shader is bound. This shouldn't + * be a performance issue, since this is only called once per compile. + */ + glGetIntegerv (GL_CURRENT_PROGRAM, &saved_program); + dispatch->UseProgram (shader->program); + + location = dispatch->GetUniformLocation (shader->program, "source_sampler"); + if (location != -1) { + dispatch->Uniform1i (location, CAIRO_GL_TEX_SOURCE); + } + + location = dispatch->GetUniformLocation (shader->program, "mask_sampler"); + if (location != -1) { + dispatch->Uniform1i (location, CAIRO_GL_TEX_MASK); + } + + dispatch->UseProgram (saved_program); +} + void _cairo_gl_shader_bind_float (cairo_gl_context_t *ctx, const char *name, @@ -839,13 +854,6 @@ _cairo_gl_shader_bind_matrix4f (cairo_gl_context_t *ctx, } void -_cairo_gl_shader_bind_texture (cairo_gl_context_t *ctx, - const char *name, GLuint tex_unit) -{ - ctx->shader_impl->bind_texture (ctx, ctx->current_shader, name, tex_unit); -} - -void _cairo_gl_set_shader (cairo_gl_context_t *ctx, cairo_gl_shader_t *shader) { @@ -913,6 +921,8 @@ _cairo_gl_get_shader_by_type (cairo_gl_context_t *ctx, return status; } + _cairo_gl_shader_set_samplers (ctx, &entry->shader); + status = _cairo_cache_insert (&ctx->shaders, &entry->base); if (unlikely (status)) { _cairo_gl_shader_fini (ctx, &entry->shader); |