mesa: Add implementation of glGetUniformBlockIndex().
authorEric Anholt <eric@anholt.net>
Tue, 1 May 2012 21:07:43 +0000 (14:07 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 20 Jul 2012 17:43:44 +0000 (10:43 -0700)
Now that we finally have a list of uniform blocks in the linked shader
program, we can tell what their indices are.

Fixes piglit GL_ARB_uniform_buffer_object/getuniformblockindex.

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

index 1cec5922db56bd41297086a7d212a83204b88b4a..ccbd753dbec78c6b355fe4b65eceeef8b3099b12 100644 (file)
@@ -524,6 +524,32 @@ _mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB *name)
    return _mesa_uniform_merge_location_offset(index, offset);
 }
 
+static GLuint GLAPIENTRY
+_mesa_GetUniformBlockIndex(GLuint program,
+                          const GLchar *uniformBlockName)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLuint i;
+   struct gl_shader_program *shProg;
+
+   if (!ctx->Extensions.ARB_uniform_buffer_object) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformBlockIndex");
+      return GL_INVALID_INDEX;
+   }
+
+   shProg = _mesa_lookup_shader_program_err(ctx, program,
+                                           "glGetUniformBlockIndex");
+   if (!shProg)
+      return GL_INVALID_INDEX;
+
+   for (i = 0; i < shProg->NumUniformBlocks; i++) {
+      if (!strcmp(shProg->UniformBlocks[i].Name, uniformBlockName))
+        return i;
+   }
+
+   return GL_INVALID_INDEX;
+}
+
 static void GLAPIENTRY
 _mesa_GetUniformIndices(GLuint program,
                        GLsizei uniformCount,
@@ -615,6 +641,7 @@ _mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
    SET_GetnUniformdvARB(exec, _mesa_GetnUniformdvARB); /* GL 4.0 */
 
    /* GL_ARB_uniform_buffer_object / GL 3.1 */
+   SET_GetUniformBlockIndex(exec, _mesa_GetUniformBlockIndex);
    SET_GetUniformIndices(exec, _mesa_GetUniformIndices);
    SET_GetActiveUniformsiv(exec, _mesa_GetActiveUniformsiv);