mesa: Add support for glGetActiveUniformsiv on non-UBO pnames.
authorEric Anholt <eric@anholt.net>
Fri, 27 Apr 2012 22:56:44 +0000 (15:56 -0700)
committerEric Anholt <eric@anholt.net>
Fri, 20 Jul 2012 17:43:40 +0000 (10:43 -0700)
We'll need to propagate the UBO fields to the uniform storage records
before we can handle the other pnames.

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

index 25d887dbcdc0a6ae1dc1e5ec9284d4244142e2e6..b5499ea34457b924cf7cc13cfb1fa65066133208 100644 (file)
@@ -74,6 +74,68 @@ _mesa_GetActiveUniformARB(GLhandleARB program, GLuint index,
    }
 }
 
+extern "C" void GLAPIENTRY
+_mesa_GetActiveUniformsiv(GLuint program,
+                         GLsizei uniformCount,
+                         const GLuint *uniformIndices,
+                         GLenum pname,
+                         GLint *params)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_shader_program *shProg;
+   GLsizei i;
+
+   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
+   if (!shProg)
+      return;
+
+   if (uniformCount < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE,
+                 "glGetUniformIndices(uniformCount < 0)");
+      return;
+   }
+
+   for (i = 0; i < uniformCount; i++) {
+      GLuint index = uniformIndices[i];
+      const struct gl_uniform_storage *uni = &shProg->UniformStorage[index];
+
+      if (index >= shProg->NumUserUniformStorage) {
+        _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniformsiv(index)");
+        return;
+      }
+
+      switch (pname) {
+      case GL_UNIFORM_TYPE:
+        params[i] = uni->type->gl_type;
+        break;
+
+      case GL_UNIFORM_SIZE:
+        /* array_elements is zero for non-arrays, but the API requires that 1 be
+         * returned.
+         */
+        params[i] = MAX2(1, uni->array_elements);
+        break;
+
+      case GL_UNIFORM_NAME_LENGTH:
+        params[i] = strlen(uni->name) + 1;
+        break;
+
+      case GL_UNIFORM_BLOCK_INDEX:
+      case GL_UNIFORM_OFFSET:
+      case GL_UNIFORM_ARRAY_STRIDE:
+      case GL_UNIFORM_MATRIX_STRIDE:
+      case GL_UNIFORM_IS_ROW_MAJOR:
+        _mesa_problem(ctx, "FINISHME: glGetActiveUniformsiv(pname)");
+        params[i] = -1;
+        break;
+
+      default:
+        _mesa_error(ctx, GL_INVALID_ENUM, "glGetActiveUniformsiv(pname)");
+        return;
+      }
+   }
+}
+
 static bool
 validate_uniform_parameters(struct gl_context *ctx,
                            struct gl_shader_program *shProg,
index 9ed5d7e03a8dd5b3ca8d4a26534f83009cea76a4..1cec5922db56bd41297086a7d212a83204b88b4a 100644 (file)
@@ -616,6 +616,7 @@ _mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
 
    /* GL_ARB_uniform_buffer_object / GL 3.1 */
    SET_GetUniformIndices(exec, _mesa_GetUniformIndices);
+   SET_GetActiveUniformsiv(exec, _mesa_GetActiveUniformsiv);
 
 #endif /* FEATURE_GL */
 }
index a94dbd63bcbb2cb7bca531ba1aee845d45d1c979..bb05524765fa53c0c03026e03bd7621d496fe1f5 100644 (file)
@@ -149,6 +149,13 @@ extern void GLAPIENTRY
 _mesa_GetActiveUniformARB(GLhandleARB, GLuint, GLsizei, GLsizei *,
                           GLint *, GLenum *, GLcharARB *);
 
+extern void GLAPIENTRY
+_mesa_GetActiveUniformsiv(GLuint program,
+                         GLsizei uniformCount,
+                         const GLuint *uniformIndices,
+                         GLenum pname,
+                         GLint *params);
+
 extern void GLAPIENTRY
 _mesa_GetUniformfvARB(GLhandleARB, GLint, GLfloat *);