[Mesa-dev] [PATCH 06/20] mesa: Move {split, merge}_location_offset to uniforms.h

Ian Romanick idr at freedesktop.org
Fri Oct 28 10:42:33 PDT 2011


From: Ian Romanick <ian.d.romanick at intel.com>

Also prepend _mesa_uniform_ to the names.

Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
---
 src/mesa/main/uniforms.c |   61 ++++-----------------------------------------
 src/mesa/main/uniforms.h |   51 ++++++++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 55 deletions(-)

diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c
index 89560a8..f968d9b 100644
--- a/src/mesa/main/uniforms.c
+++ b/src/mesa/main/uniforms.c
@@ -317,55 +317,6 @@ get_uniform_rows_cols(const struct gl_program_parameter *p,
    }
 }
 
-
-/**
- * GLSL uniform arrays and structs require special handling.
- *
- * The GL_ARB_shader_objects spec says that if you use
- * glGetUniformLocation to get the location of an array, you CANNOT
- * access other elements of the array by adding an offset to the
- * returned location.  For example, you must call
- * glGetUniformLocation("foo[16]") if you want to set the 16th element
- * of the array with glUniform().
- *
- * HOWEVER, some other OpenGL drivers allow accessing array elements
- * by adding an offset to the returned array location.  And some apps
- * seem to depend on that behaviour.
- *
- * Mesa's gl_uniform_list doesn't directly support this since each
- * entry in the list describes one uniform variable, not one uniform
- * element.  We could insert dummy entries in the list for each array
- * element after [0] but that causes complications elsewhere.
- *
- * We solve this problem by encoding two values in the location that's
- * returned by glGetUniformLocation():
- *  a) index into gl_uniform_list::Uniforms[] for the uniform
- *  b) an array/field offset (0 for simple types)
- *
- * These two values are encoded in the high and low halves of a GLint.
- * By putting the uniform number in the high part and the offset in the
- * low part, we can support the unofficial ability to index into arrays
- * by adding offsets to the location value.
- */
-static void
-merge_location_offset(GLint *location, GLint offset)
-{
-   *location = (*location << 16) | offset;
-}
-
-
-/**
- * Separate the uniform location and parameter offset.  See above.
- */
-static void
-split_location_offset(GLint *location, GLint *offset)
-{
-   *offset = *location & 0xffff;
-   *location = *location >> 16;
-}
-
-
-
 /**
  * Called via glGetUniform[fiui]v() to get the current value of a uniform.
  */
@@ -381,7 +332,7 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, GLint location,
    if (!shProg)
       return;
 
-   split_location_offset(&location, &offset);
+   _mesa_uniform_split_location_offset(location, &location, &offset);
 
    if (!find_uniform_parameter_pos(shProg, location, &prog, &paramPos)) {
       _mesa_error(ctx, GL_INVALID_OPERATION,  "glGetUniformfv(location)");
@@ -537,11 +488,11 @@ _mesa_get_uniform_location(struct gl_context *ctx,
       location = _mesa_lookup_uniform(shProg->Uniforms, name);
    }
 
-   if (location >= 0) {
-      merge_location_offset(&location, offset);
+   if (location < 0) {
+      return -1;
    }
 
-   return location;
+   return _mesa_uniform_merge_location_offset(location, offset);
 }
 
 
@@ -810,7 +761,7 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
       return;
    }
 
-   split_location_offset(&location, &offset);
+   _mesa_uniform_split_location_offset(location, &location, &offset);
 
    if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
       _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location=%d)", location);
@@ -991,7 +942,7 @@ _mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
       return;
    }
 
-   split_location_offset(&location, &offset);
+   _mesa_uniform_split_location_offset(location, &location, &offset);
 
    if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
       _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");
diff --git a/src/mesa/main/uniforms.h b/src/mesa/main/uniforms.h
index 5c1dded..3630ad0 100644
--- a/src/mesa/main/uniforms.h
+++ b/src/mesa/main/uniforms.h
@@ -212,4 +212,55 @@ struct gl_builtin_uniform_desc {
 
 extern const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[];
 
+/**
+ * \name GLSL uniform arrays and structs require special handling.
+ *
+ * The GL_ARB_shader_objects spec says that if you use
+ * glGetUniformLocation to get the location of an array, you CANNOT
+ * access other elements of the array by adding an offset to the
+ * returned location.  For example, you must call
+ * glGetUniformLocation("foo[16]") if you want to set the 16th element
+ * of the array with glUniform().
+ *
+ * HOWEVER, some other OpenGL drivers allow accessing array elements
+ * by adding an offset to the returned array location.  And some apps
+ * seem to depend on that behaviour.
+ *
+ * Mesa's gl_uniform_list doesn't directly support this since each
+ * entry in the list describes one uniform variable, not one uniform
+ * element.  We could insert dummy entries in the list for each array
+ * element after [0] but that causes complications elsewhere.
+ *
+ * We solve this problem by encoding two values in the location that's
+ * returned by glGetUniformLocation():
+ *  a) index into gl_uniform_list::Uniforms[] for the uniform
+ *  b) an array/field offset (0 for simple types)
+ *
+ * These two values are encoded in the high and low halves of a GLint.
+ * By putting the uniform number in the high part and the offset in the
+ * low part, we can support the unofficial ability to index into arrays
+ * by adding offsets to the location value.
+ */
+/*@{*/
+/**
+ * Combine the uniform's base location and the offset
+ */
+static inline GLint
+_mesa_uniform_merge_location_offset(unsigned base_location, unsigned offset)
+{
+   return (base_location << 16) | offset;
+}
+
+/**
+ * Separate the uniform base location and parameter offset
+ */
+static inline void
+_mesa_uniform_split_location_offset(GLint location, unsigned *base_location,
+				    unsigned *offset)
+{
+   *offset = location & 0xffff;
+   *base_location = location >> 16;
+}
+/*@}*/
+
 #endif /* UNIFORMS_H */
-- 
1.7.6.4



More information about the mesa-dev mailing list