glsl: add helper for calculating offsets for struct members
authorTimothy <t_arceri@yahoo.com.au>
Fri, 11 Sep 2015 21:33:27 +0000 (07:33 +1000)
committerTimothy Arceri <t_arceri@yahoo.com.au>
Thu, 17 Sep 2015 01:28:27 +0000 (11:28 +1000)
V2: update comments

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/glsl/glsl_types.cpp
src/glsl/glsl_types.h

index 755618ac28b10b51f4a727a8f22503200cedcbec..97c79fa4ca1101f25e8105f945cadf5783367a02 100644 (file)
@@ -1039,6 +1039,32 @@ glsl_type::component_slots() const
    return 0;
 }
 
+unsigned
+glsl_type::record_location_offset(unsigned length) const
+{
+   unsigned offset = 0;
+   const glsl_type *t = this->without_array();
+   if (t->is_record()) {
+      assert(length <= t->length);
+
+      for (unsigned i = 0; i < length; i++) {
+         const glsl_type *st = t->fields.structure[i].type;
+         const glsl_type *wa = st->without_array();
+         if (wa->is_record()) {
+            unsigned r_offset = wa->record_location_offset(wa->length);
+            offset += st->is_array() ? st->length * r_offset : r_offset;
+         } else {
+            /* We dont worry about arrays here because unless the array
+             * contains a structure or another array it only takes up a single
+             * uniform slot.
+             */
+            offset += 1;
+         }
+      }
+   }
+   return offset;
+}
+
 unsigned
 glsl_type::uniform_locations() const
 {
index 02a398f6112effcd1f421965a9676f23fd0498fb..860276a2b17736960f3c2b0f3b2655efa241240b 100644 (file)
@@ -291,6 +291,14 @@ struct glsl_type {
     */
    unsigned component_slots() const;
 
+   /**
+    * Calculate offset between the base location of the struct in
+    * uniform storage and a struct member.
+    * For the initial call, length is the index of the member to find the
+    * offset for.
+    */
+   unsigned record_location_offset(unsigned length) const;
+
    /**
     * Calculate the number of unique values from glGetUniformLocation for the
     * elements of the type.