mesa: Determine GL_ACTIVE_ATTRIBUTES by walking the GLSL IR.
authorIan Romanick <ian.d.romanick@intel.com>
Thu, 18 Aug 2011 22:22:21 +0000 (15:22 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Tue, 4 Oct 2011 20:17:47 +0000 (13:17 -0700)
Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/main/shader_query.cpp
src/mesa/main/shaderapi.c
src/mesa/main/shaderapi.h

index 636ab0f8d0b35e42fb33b7f04cefd93f8da54d4b..e9e6dbf7122269d3f02c9e44f92ca13e7b1d07ed 100644 (file)
@@ -185,3 +185,30 @@ _mesa_GetAttribLocationARB(GLhandleARB program, const GLcharARB * name)
 
    return -1;
 }
+
+
+unsigned
+_mesa_count_active_attribs(struct gl_shader_program *shProg)
+{
+   if (!shProg->LinkStatus
+       || shProg->_LinkedShaders[MESA_SHADER_VERTEX] == NULL) {
+      return 0;
+   }
+
+   exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
+   unsigned i = 0;
+
+   foreach_list(node, ir) {
+      const ir_variable *const var = ((ir_instruction *) node)->as_variable();
+
+      if (var == NULL
+         || var->mode != ir_var_in
+         || var->location == -1
+         || var->location < VERT_ATTRIB_GENERIC0)
+        continue;
+
+      i++;
+   }
+
+   return i;
+}
index b13ec45df36655dbdb5ed67916043b5428f9e362..657de66e9a14d4e22cdbc0f57ed01fe7e66b3239 100644 (file)
@@ -569,7 +569,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, GLint *param
       *params = shProg->NumShaders;
       break;
    case GL_ACTIVE_ATTRIBUTES:
-      *params = attribs ? attribs->NumParameters : 0;
+      *params = _mesa_count_active_attribs(shProg);
       break;
    case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH:
       *params = _mesa_longest_parameter_name(attribs, PROGRAM_INPUT) + 1;
index e4b477660dc7d5e0f04687600ec7f83edef55190..967472472044084ce3f0e83cf4bf5ad23fbf218d 100644 (file)
@@ -50,6 +50,8 @@ _mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg,
 extern void
 _mesa_init_shader_dispatch(struct _glapi_table *exec);
 
+extern unsigned
+_mesa_count_active_attribs(struct gl_shader_program *shProg);
 
 
 extern void GLAPIENTRY