mesa: make uniform work with geometry shaders
authorZack Rusin <zackr@vmware.com>
Sat, 10 Jul 2010 23:21:42 +0000 (19:21 -0400)
committerZack Rusin <zackr@vmware.com>
Sat, 10 Jul 2010 23:21:42 +0000 (19:21 -0400)
src/mesa/main/uniforms.c
src/mesa/program/prog_uniform.c

index c869942d2ebda509742c9ab977a55a5fb5c14f3a..d68a7768df55eef74618f5213edd3ee47381c60b 100644 (file)
@@ -132,6 +132,11 @@ get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index)
       progPos = shProg->Uniforms->Uniforms[index].FragPos;
       if (progPos >= 0) {
          prog = &shProg->FragmentProgram->Base;
+      } else {
+         progPos = shProg->Uniforms->Uniforms[index].GeomPos;
+         if (progPos >= 0) {
+            prog = &shProg->GeometryProgram->Base;
+         }
       }
    }
 
@@ -315,6 +320,11 @@ lookup_uniform_parameter(GLcontext *ctx, GLuint program, GLint location,
             progPos = shProg->Uniforms->Uniforms[location].FragPos;
             if (progPos >= 0) {
                prog = &shProg->FragmentProgram->Base;
+            } else {
+               progPos = shProg->Uniforms->Uniforms[location].GeomPos;
+               if (progPos >= 0) {
+                  prog = &shProg->GeometryProgram->Base;
+               }
             }
          }
       }
@@ -829,6 +839,15 @@ _mesa_uniform(GLcontext *ctx, GLint location, GLsizei count,
       }
    }
 
+   if (shProg->GeometryProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->GeomPos;
+      if (index >= 0) {
+         set_program_uniform(ctx, &shProg->GeometryProgram->Base,
+                             index, offset, type, count, elems, values);
+      }
+   }
+
    uniform->Initialized = GL_TRUE;
 }
 
@@ -962,6 +981,16 @@ _mesa_uniform_matrix(GLcontext *ctx, GLint cols, GLint rows,
       }
    }
 
+   if (shProg->GeometryProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->GeomPos;
+      if (index >= 0) {
+         set_program_uniform_matrix(ctx, &shProg->GeometryProgram->Base,
+                                    index, offset,
+                                    count, rows, cols, transpose, values);
+      }
+   }
+
    uniform->Initialized = GL_TRUE;
 }
 
index c408a8492c615752ce2bac860d18e2fa92b3ae7b..5aa9878d43cf0b5796a97ccf981e9352a3dcd046 100644 (file)
@@ -61,7 +61,8 @@ _mesa_append_uniform(struct gl_uniform_list *list,
    GLint index;
 
    assert(target == GL_VERTEX_PROGRAM_ARB ||
-          target == GL_FRAGMENT_PROGRAM_ARB);
+          target == GL_FRAGMENT_PROGRAM_ARB ||
+          target == MESA_GEOMETRY_PROGRAM);
 
    index = _mesa_lookup_uniform(list, name);
    if (index < 0) {
@@ -90,6 +91,7 @@ _mesa_append_uniform(struct gl_uniform_list *list,
       uniform->Name = _mesa_strdup(name);
       uniform->VertPos = -1;
       uniform->FragPos = -1;
+      uniform->GeomPos = -1;
       uniform->Initialized = GL_FALSE;
 
       list->NumUniforms++;
@@ -106,13 +108,18 @@ _mesa_append_uniform(struct gl_uniform_list *list,
          return GL_FALSE;
       }
       uniform->VertPos = progPos;
-   }
-   else {
+   } else if (target == GL_FRAGMENT_PROGRAM_ARB) {
       if (uniform->FragPos != -1) {
          /* this uniform is already in the list - that shouldn't happen */
          return GL_FALSE;
       }
       uniform->FragPos = progPos;
+   } else {
+      if (uniform->GeomPos != -1) {
+         /* this uniform is already in the list - that shouldn't happen */
+         return GL_FALSE;
+      }
+      uniform->GeomPos = progPos;
    }
 
    return uniform;
@@ -156,10 +163,11 @@ _mesa_print_uniforms(const struct gl_uniform_list *list)
    GLuint i;
    printf("Uniform list %p:\n", (void *) list);
    for (i = 0; i < list->NumUniforms; i++) {
-      printf("%d: %s %d %d\n",
+      printf("%d: %s %d %d %d\n",
              i,
              list->Uniforms[i].Name,
              list->Uniforms[i].VertPos,
-             list->Uniforms[i].FragPos);
+             list->Uniforms[i].FragPos,
+             list->Uniforms[i].GeomPos);
    }
 }