mesa: update the shader programs->TexturesUsed array at link time
authorBrian Paul <brian.paul@tungstengraphics.com>
Thu, 6 Nov 2008 22:04:11 +0000 (15:04 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Thu, 6 Nov 2008 22:04:11 +0000 (15:04 -0700)
If an application never calls glUniform() to set sampler variable values
they'll remain 0 (the default value/unit).
Now call _mesa_update_shader_textures_used() at link time in case glUniform()
is never called.  program->TextureUsed[] will then be correct for state
validation.

src/mesa/shader/shader_api.c
src/mesa/shader/shader_api.h
src/mesa/shader/slang/slang_link.c

index 468fbd7ed2dbe282d6a5211b657a2735b62d8af7..7af502a84cb98f0775bf7b8237a59f25787bc4ac 100644 (file)
@@ -1417,10 +1417,22 @@ _mesa_use_program(GLcontext *ctx, GLuint program)
 
 
 /**
- * Update the vertex and fragment program's TexturesUsed arrays.
+ * Update the vertex/fragment program's TexturesUsed array.
+ *
+ * This needs to be called after glUniform(set sampler var) is called.
+ * A call to glUniform(samplerVar, value) causes a sampler to point to a
+ * particular texture unit.  We know the sampler's texture target
+ * (1D/2D/3D/etc) from compile time but the sampler's texture unit is
+ * set by glUniform() calls.
+ *
+ * So, scan the program->SamplerUnits[] and program->SamplerTargets[]
+ * information to update the prog->TexturesUsed[] values.
+ * Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
+ * TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
+ * We'll use that info for state validation before rendering.
  */
-static void
-update_textures_used(struct gl_program *prog)
+void
+_mesa_update_shader_textures_used(struct gl_program *prog)
 {
    GLuint s;
 
@@ -1546,7 +1558,7 @@ set_program_uniform(GLcontext *ctx, struct gl_program *program,
 
       /* This maps a sampler to a texture unit: */
       program->SamplerUnits[sampler] = texUnit;
-      update_textures_used(program);
+      _mesa_update_shader_textures_used(program);
 
       FLUSH_VERTICES(ctx, _NEW_TEXTURE);
    }
index e7f12669156200b08135325e5a1f2a36d3625cea..ec1996ee98d306cdf49203a8c457496bf34181e2 100644 (file)
@@ -79,6 +79,10 @@ extern struct gl_shader *
 _mesa_lookup_shader(GLcontext *ctx, GLuint name);
 
 
+extern void
+_mesa_update_shader_textures_used(struct gl_program *prog);
+
+
 extern void
 _mesa_use_program(GLcontext *ctx, GLuint program);
 
index 5c8b626ea7d8d02a431e0caac5b5d54a10a667e9..511e7406159a8015de17d3c3f4604997bb5ab7d1 100644 (file)
@@ -562,6 +562,9 @@ _slang_link(GLcontext *ctx,
 
 
    if (fragProg && shProg->FragmentProgram) {
+      /* Compute initial program's TexturesUsed info */
+      _mesa_update_shader_textures_used(&shProg->FragmentProgram->Base);
+
       /* notify driver that a new fragment program has been compiled/linked */
       ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB,
                                       &shProg->FragmentProgram->Base);
@@ -577,6 +580,9 @@ _slang_link(GLcontext *ctx,
    }
 
    if (vertProg && shProg->VertexProgram) {
+      /* Compute initial program's TexturesUsed info */
+      _mesa_update_shader_textures_used(&shProg->VertexProgram->Base);
+
       /* notify driver that a new vertex program has been compiled/linked */
       ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB,
                                       &shProg->VertexProgram->Base);