Mesa (master): mesa: make uniform work with geometry shaders

Zack Rusin zack at kemper.freedesktop.org
Wed Jul 14 01:50:25 UTC 2010


Module: Mesa
Branch: master
Commit: 79b643dd02ac4e19f24c9cd88843719746f8ec69
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=79b643dd02ac4e19f24c9cd88843719746f8ec69

Author: Zack Rusin <zackr at vmware.com>
Date:   Sat Jul 10 19:21:42 2010 -0400

mesa: make uniform work with geometry shaders

---

 src/mesa/main/uniforms.c        |   29 +++++++++++++++++++++++++++++
 src/mesa/program/prog_uniform.c |   18 +++++++++++++-----
 2 files changed, 42 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
index c869942..d68a776 100644
--- a/src/mesa/main/uniforms.c
+++ b/src/mesa/main/uniforms.c
@@ -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;
 }
 
diff --git a/src/mesa/program/prog_uniform.c b/src/mesa/program/prog_uniform.c
index c408a84..5aa9878 100644
--- a/src/mesa/program/prog_uniform.c
+++ b/src/mesa/program/prog_uniform.c
@@ -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);
    }
 }




More information about the mesa-commit mailing list