mesa: Move {split,merge}_location_offset to uniforms.h
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 13 Oct 2011 20:42:56 +0000 (13:42 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Mon, 7 Nov 2011 21:33:16 +0000 (13:33 -0800)
Prepend _mesa_uniform_ to the names and rework the calling
convention.  The calling convention was changed for a couple reasons.

1. Having a single variable named 'location' have completely different
meanings at different places in the function is confusing.  Before
calling split_location_offset the location is the encoded value
returned by glGetUniformLocation.  After calling split_location_offset
it's the index of the uniform in the gl_uniform_list::Uniforms array.

2. In a later commit the original value of 'location' is needed after
split_location_offset has been called.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Tested-by: Tom Stellard <thomas.stellard@amd.com>
src/mesa/main/uniforms.c
src/mesa/main/uniforms.h

index 3170cc80a5828675ee986e49fe5345bca053434a..041e0db2203060aa39bc170b1a4c29dfa2ff494a 100644 (file)
@@ -318,55 +318,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.
  */
@@ -382,7 +333,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)");
@@ -538,11 +489,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);
 }
 
 
@@ -811,7 +762,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);
@@ -992,7 +943,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)");
index 5c1ddedf7a4dfacc85e081cfc4f367392763bfff..3630ad0eeb7e67499cfb13a6b442405e6b6353ab 100644 (file)
@@ -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 */