fix incorrect sampler numbering/indexing.
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 20 May 2008 17:29:58 +0000 (11:29 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 20 May 2008 17:29:58 +0000 (11:29 -0600)
All samplers indexes were zero.

cherry-picked from master (b6fb0940c226373ac235a5d327d3fcfd742bc6b9)

src/mesa/shader/prog_parameter.c
src/mesa/shader/prog_parameter.h
src/mesa/shader/slang/slang_codegen.c
src/mesa/shader/slang/slang_compile.c
src/mesa/shader/slang/slang_typeinfo.h

index 0b61bac69615db1cc493d3426c88f4b72d4606cb..75cf5023df18518357e8d03ac8894268b4c3d51c 100644 (file)
@@ -283,25 +283,31 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,
  * \param name  uniform's name
  * \param datatype  GL_SAMPLER_2D, GL_SAMPLER_2D_RECT_ARB, etc.
  * \param index  the sampler number (as seen in TEX instructions)
+ * \return  sampler index (starting at zero) or -1 if error
  */
 GLint
 _mesa_add_sampler(struct gl_program_parameter_list *paramList,
-                  const char *name, GLenum datatype, GLuint index)
+                  const char *name, GLenum datatype)
 {
    GLint i = _mesa_lookup_parameter_index(paramList, -1, name);
    if (i >= 0 && paramList->Parameters[i].Type == PROGRAM_SAMPLER) {
       ASSERT(paramList->Parameters[i].Size == 1);
       ASSERT(paramList->Parameters[i].DataType == datatype);
-      ASSERT(paramList->ParameterValues[i][0] == index);
       /* already in list */
-      return i;
+      return (GLint) paramList->ParameterValues[i][0];
    }
    else {
-      GLfloat indexf = index;
       const GLint size = 1; /* a sampler is basically a texture unit number */
-      i = _mesa_add_parameter(paramList, PROGRAM_SAMPLER, name,
-                              size, datatype, &indexf, NULL);
-      return i;
+      GLfloat value;
+      GLint numSamplers = 0;
+      for (i = 0; i < paramList->NumParameters; i++) {
+         if (paramList->Parameters[i].Type == PROGRAM_SAMPLER)
+            numSamplers++;
+      }
+      value = (GLfloat) numSamplers;
+      (void) _mesa_add_parameter(paramList, PROGRAM_SAMPLER, name,
+                                 size, datatype, &value, NULL);
+      return numSamplers;
    }
 }
 
index d6cc03448c87aaff932fa0e905fae4bdfb879256..105f6f24debe9909d599aef957fac2af55acd2b1 100644 (file)
@@ -114,7 +114,7 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,
 
 extern GLint
 _mesa_add_sampler(struct gl_program_parameter_list *paramList,
-                  const char *name, GLenum datatype, GLuint index);
+                  const char *name, GLenum datatype);
 
 extern GLint
 _mesa_add_varying(struct gl_program_parameter_list *paramList,
index 8e4c10ff4320c69027292f72881ea81c1732f157..d19d5a0abb697894f0885a56cc2fdb6d57aeaf83 100644 (file)
@@ -2841,8 +2841,7 @@ _slang_codegen_global_variable(slang_assemble_ctx *A, slang_variable *var,
        * store->Index = sampler number (0..7, typically)
        * store->Size = texture type index (1D, 2D, 3D, cube, etc)
        */
-      const GLint sampNum = A->numSamplers++;
-      _mesa_add_sampler(prog->Parameters, varName, datatype, sampNum);
+      GLint sampNum = _mesa_add_sampler(prog->Parameters, varName, datatype);
       store = _slang_new_ir_storage(PROGRAM_SAMPLER, sampNum, texIndex);
       if (dbg) printf("SAMPLER ");
    }
index 1449888f9f8f3fc6204725b851c0e798df974c0e..46b5c54bbeb204d39797190ec8451a0d199830d9 100644 (file)
@@ -1620,7 +1620,6 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
       A.program = O->program;
       A.vartable = O->vartable;
       A.curFuncEndLabel = NULL;
-      A.numSamplers = 0;
       if (!_slang_codegen_global_variable(&A, var, C->type))
          return 0;
    }
@@ -1643,7 +1642,6 @@ parse_init_declarator(slang_parse_ctx * C, slang_output_ctx * O,
          A.space.funcs = O->funs;
          A.space.structs = O->structs;
          A.space.vars = O->vars;
-         A.numSamplers = 0;
          if (!initialize_global(&A, var))
             return 0;
       }
@@ -1777,7 +1775,6 @@ parse_function(slang_parse_ctx * C, slang_output_ctx * O, int definition,
       A.program = O->program;
       A.vartable = O->vartable;
       A.log = C->L;
-      A.numSamplers = 0;
 
       _slang_codegen_function(&A, *parsed_func_ret);
    }
index ad5aa3e195e7e6a2b878ad01c20dd75163e170b9..587331e8b1e0dd55244e047006a32330c2ab85fc 100644 (file)
@@ -65,7 +65,6 @@ typedef struct slang_assemble_ctx_
    struct slang_label_ *curFuncEndLabel;
    struct slang_ir_node_ *CurLoop;
    struct slang_function_ *CurFunction;
-   GLuint numSamplers;
 } slang_assemble_ctx;