glsl: signal that the program needs to be re-translated when samplers change
authorBrian Paul <brianp@vmware.com>
Wed, 26 Aug 2009 20:29:50 +0000 (14:29 -0600)
committerBrian Paul <brianp@vmware.com>
Wed, 26 Aug 2009 20:29:50 +0000 (14:29 -0600)
src/mesa/shader/shader_api.c

index 95b7490ca9721dcaac91c49d134214f0c8c37aad..c36fc271a00f3fc3097d5f70ec8cae792da42316 100644 (file)
@@ -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 */