glsl_type: Add method to get number of slots used by a type
authorIan Romanick <ian.d.romanick@intel.com>
Mon, 21 Jun 2010 23:05:00 +0000 (16:05 -0700)
committerIan Romanick <ian.d.romanick@intel.com>
Wed, 23 Jun 2010 17:56:04 +0000 (10:56 -0700)
glsl_types.cpp
glsl_types.h

index 290756d453cbf0859aadd876f2e69962c644ccb1..2b7c5bce30ff6de9b05ecaacf81cec8d7116a815 100644 (file)
@@ -732,3 +732,31 @@ glsl_type::field_index(const char *name) const
 
    return -1;
 }
+
+
+unsigned
+glsl_type::component_slots() const
+{
+   switch (this->base_type) {
+   case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT:
+   case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_BOOL:
+      return this->components();
+
+   case GLSL_TYPE_STRUCT: {
+      unsigned size = 0;
+
+      for (unsigned i = 0; i < this->length; i++)
+        size += this->fields.structure[i].type->component_slots();
+
+      return size;
+   }
+
+   case GLSL_TYPE_ARRAY:
+      return this->length * this->fields.array->component_slots();
+
+   default:
+      return 0;
+   }
+}
index 3265016146d52a1cc3b7ae58abafae4593471f9a..939c173fd419741cb657d8e8bfa8a3ce6e765032 100644 (file)
@@ -214,6 +214,15 @@ struct glsl_type {
       return vector_elements * matrix_columns;
    }
 
+   /**
+    * Calculate the number of components slots required to hold this type
+    *
+    * This is used to determine how many uniform or varying locations a type
+    * might occupy.
+    */
+   unsigned component_slots() const;
+
+
    /**
     * Query whether or not a type is a scalar (non-vector and non-matrix).
     */