diff options
author | Brian Paul <[email protected]> | 2009-08-26 14:49:15 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-08-26 14:49:15 -0600 |
commit | 38f56411067d51ad0de0ea73498964baaacea90b (patch) | |
tree | 99408c0bebf2316169657cdb0f2f28a16d3f699f /src/mesa/shader | |
parent | b2b220e6225fdd673ea7b9fdda00e98423263fc3 (diff) | |
parent | babb5ba9a977d23ddae828521401eae312bdb619 (diff) |
Merge branch 'mesa_7_5_branch'
Diffstat (limited to 'src/mesa/shader')
-rw-r--r-- | src/mesa/shader/shader_api.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c index 23aca3000e9..54a25dfaf07 100644 --- a/src/mesa/shader/shader_api.c +++ b/src/mesa/shader/shader_api.c @@ -1631,6 +1631,7 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, if (param->Type == PROGRAM_SAMPLER) { /* This controls which texture unit which is used by a sampler */ + GLboolean changed = GL_FALSE; GLint i; /* this should have been caught by the compatible_types() check */ @@ -1655,13 +1656,23 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program, _mesa_printf("Set program %p sampler %d '%s' to unit %u\n", program, sampler, param->Name, texUnit); #endif - program->SamplerUnits[sampler] = texUnit; + if (program->SamplerUnits[sampler] != texUnit) { + program->SamplerUnits[sampler] = texUnit; + changed = GL_TRUE; + } } } - _mesa_update_shader_textures_used(program); - - FLUSH_VERTICES(ctx, _NEW_TEXTURE); + if (changed) { + /* When a sampler's value changes it usually requires rewriting + * a GPU program's TEX instructions since there may not be a + * sampler->texture lookup table. We signal this with the + * ProgramStringNotify() callback. + */ + FLUSH_VERTICES(ctx, _NEW_TEXTURE | _NEW_PROGRAM); + _mesa_update_shader_textures_used(program); + ctx->Driver.ProgramStringNotify(ctx, program->Target, program); + } } else { /* ordinary uniform variable */ |