mesa: refactor GetActiveAttrib
authorTapani Pälli <tapani.palli@intel.com>
Wed, 11 Mar 2015 07:05:47 +0000 (09:05 +0200)
committerTapani Pälli <tapani.palli@intel.com>
Thu, 16 Apr 2015 04:55:57 +0000 (07:55 +0300)
Instead of iterating IR, retrieve required information through
the new program resource functions.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/mesa/main/shader_query.cpp

index ef5e6a29aef835ccb5411f54925cd95ebf742268..0f7804c3f13cabdd01810d9a42510ad5767ccdbc 100644 (file)
@@ -147,45 +147,41 @@ _mesa_GetActiveAttrib(GLhandleARB program, GLuint desired_index,
       return;
    }
 
-   exec_list *const ir = shProg->_LinkedShaders[MESA_SHADER_VERTEX]->ir;
-   unsigned current_index = 0;
-
-   foreach_in_list(ir_instruction, node, ir) {
-      const ir_variable *const var = node->as_variable();
-
-      if (!is_active_attrib(var))
-         continue;
+   struct gl_program_resource *res =
+      _mesa_program_resource_find_index(shProg, GL_PROGRAM_INPUT,
+                                        desired_index);
 
-      if (current_index == desired_index) {
-         const char *var_name = var->name;
+   /* User asked for index that does not exist. */
+   if (!res) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
+      return;
+   }
 
-         /* Since gl_VertexID may be lowered to gl_VertexIDMESA, we need to
-          * consider gl_VertexIDMESA as gl_VertexID for purposes of checking
-          * active attributes.
-          */
-         if (var->data.mode == ir_var_system_value &&
-             var->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) {
-            var_name = "gl_VertexID";
-         }
+   const ir_variable *const var = RESOURCE_VAR(res);
 
-        _mesa_copy_string(name, maxLength, length, var_name);
+   if (!is_active_attrib(var))
+      return;
 
-        if (size)
-           *size = (var->type->is_array()) ? var->type->length : 1;
+   const char *var_name = var->name;
 
-        if (type)
-           *type = var->type->gl_type;
+   /* Since gl_VertexID may be lowered to gl_VertexIDMESA, we need to
+    * consider gl_VertexIDMESA as gl_VertexID for purposes of checking
+    * active attributes.
+    */
+   if (var->data.mode == ir_var_system_value &&
+       var->data.location == SYSTEM_VALUE_VERTEX_ID_ZERO_BASE) {
+      var_name = "gl_VertexID";
+   }
 
-        return;
-      }
+   _mesa_copy_string(name, maxLength, length, var_name);
 
-      current_index++;
-   }
+   if (size)
+      _mesa_program_resource_prop(shProg, res, desired_index, GL_ARRAY_SIZE,
+                                  size, "glGetActiveAttrib");
 
-   /* If the loop did not return early, the caller must have asked for
-    * an index that did not exit.  Set an error.
-    */
-   _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveAttrib(index)");
+   if (type)
+      _mesa_program_resource_prop(shProg, res, desired_index, GL_TYPE,
+                                  (GLint *) type, "glGetActiveAttrib");
 }
 
 /* Locations associated with shader variables (array or non-array) can be