glsl: Expand count_attribute_slots() to cover structs.
authorPaul Berry <stereotype441@gmail.com>
Wed, 31 Jul 2013 15:24:48 +0000 (08:24 -0700)
committerPaul Berry <stereotype441@gmail.com>
Fri, 2 Aug 2013 03:19:22 +0000 (20:19 -0700)
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/glsl_types.cpp

index 0c639b3eb871acbbe2d9da697a8bd99dbf240432..0c7e8eb11a398ffcad190bb2aaa066058b4839d3 100644 (file)
@@ -846,13 +846,40 @@ glsl_type::count_attribute_slots() const
     * should be safe to assume the total number of slots consumed by an array
     * is the number of entries in the array multiplied by the number of slots
     * consumed by a single element of the array.
+    *
+    * The spec says nothing about how structs are counted, because vertex
+    * attributes are not allowed to be (or contain) structs.  However, Mesa
+    * allows varying structs, the number of varying slots taken up by a
+    * varying struct is simply equal to the sum of the number of slots taken
+    * up by each element.
     */
+   switch (this->base_type) {
+   case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT:
+   case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_BOOL:
+      return this->matrix_columns;
 
-   if (this->is_array())
-      return this->array_size() * this->element_type()->count_attribute_slots();
+   case GLSL_TYPE_STRUCT:
+   case GLSL_TYPE_INTERFACE: {
+      unsigned size = 0;
 
-   if (this->is_matrix())
-      return this->matrix_columns;
+      for (unsigned i = 0; i < this->length; i++)
+         size += this->fields.structure[i].type->count_attribute_slots();
 
-   return 1;
+      return size;
+   }
+
+   case GLSL_TYPE_ARRAY:
+      return this->length * this->fields.array->count_attribute_slots();
+
+   case GLSL_TYPE_SAMPLER:
+   case GLSL_TYPE_VOID:
+   case GLSL_TYPE_ERROR:
+      break;
+   }
+
+   assert(!"Unexpected type in count_attribute_slots()");
+
+   return 0;
 }