summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2009-08-26 14:29:50 -0600
committerBrian Paul <[email protected]>2009-08-26 14:29:50 -0600
commitbabb5ba9a977d23ddae828521401eae312bdb619 (patch)
treef7453754ef0ad964b3d892bf3c62f635435a2bea
parentd09d03aa42586dd3332863b9b159c497b0cb529b (diff)
glsl: signal that the program needs to be re-translated when samplers change
-rw-r--r--src/mesa/shader/shader_api.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mesa/shader/shader_api.c b/src/mesa/shader/shader_api.c
index 95b7490ca97..c36fc271a00 100644
--- a/src/mesa/shader/shader_api.c
+++ b/src/mesa/shader/shader_api.c
@@ -1624,6 +1624,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;
/* data type for setting samplers must be int */
@@ -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 */