mesa: Add support for glGetUniformIndices().
authorEric Anholt <eric@anholt.net>
Fri, 27 Apr 2012 22:37:49 +0000 (15:37 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 20 Jul 2012 17:43:35 +0000 (10:43 -0700)
This is a single entrypoint that maps from a series of names to the
indices of those names within the active uniforms list.  Each index is
like glGetUniformLocation()'s return value, except that it doesn't
encode an array offset.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/uniforms.c

index 2a048a5553c55b0171d116449955897f08aada35..9ed5d7e03a8dd5b3ca8d4a26534f83009cea76a4 100644 (file)
@@ -524,6 +524,38 @@ _mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB *name)
    return _mesa_uniform_merge_location_offset(index, offset);
 }
 
+static void GLAPIENTRY
+_mesa_GetUniformIndices(GLuint program,
+                       GLsizei uniformCount,
+                       const GLchar * const *uniformNames,
+                       GLuint *uniformIndices)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLsizei i;
+   struct gl_shader_program *shProg;
+
+   if (!ctx->Extensions.ARB_uniform_buffer_object) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformIndices");
+      return;
+   }
+
+   shProg = _mesa_lookup_shader_program_err(ctx, program,
+                                           "glGetUniformIndices");
+   if (!shProg)
+      return;
+
+   if (uniformCount < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                 "glGetUniformIndices(uniformCount < 0)");
+      return;
+   }
+
+   for (i = 0; i < uniformCount; i++) {
+      unsigned offset;
+      uniformIndices[i] = _mesa_get_uniform_location(ctx, shProg,
+                                                    uniformNames[i], &offset);
+   }
+}
 
 /**
  * Plug in shader uniform-related functions into API dispatch table.
@@ -582,5 +614,8 @@ _mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
    SET_GetnUniformuivARB(exec, _mesa_GetnUniformuivARB);
    SET_GetnUniformdvARB(exec, _mesa_GetnUniformdvARB); /* GL 4.0 */
 
+   /* GL_ARB_uniform_buffer_object / GL 3.1 */
+   SET_GetUniformIndices(exec, _mesa_GetUniformIndices);
+
 #endif /* FEATURE_GL */
 }