glsl: Add an ir_variable::max_ifc_array_access field.
authorPaul Berry <stereotype441@gmail.com>
Wed, 18 Sep 2013 21:15:36 +0000 (14:15 -0700)
committerPaul Berry <stereotype441@gmail.com>
Wed, 9 Oct 2013 23:49:31 +0000 (16:49 -0700)
For interface blocks that contain arrays, this field will contain the
maximum element of each contained array that is accessed by the
shader.  This is a first step toward supporting unsized arrays in
interface blocks.

Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
src/glsl/ir.cpp
src/glsl/ir.h
src/glsl/ir_clone.cpp

index ead7456dfcc60703db19f6f37d55c67f6e6860b5..de9613e8fa19980801495c46eb0133fba36c3773 100644 (file)
@@ -1584,7 +1584,8 @@ ir_swizzle::variable_referenced() const
 
 ir_variable::ir_variable(const struct glsl_type *type, const char *name,
                         ir_variable_mode mode)
-   : max_array_access(0), read_only(false), centroid(false), invariant(false),
+   : max_array_access(0), max_ifc_array_access(NULL),
+     read_only(false), centroid(false), invariant(false),
      mode(mode), interpolation(INTERP_QUALIFIER_NONE)
 {
    this->ir_type = ir_type_variable;
index a2778570826456a69c6882b9a3a3e787ea4dfd46..eb24d4e441d70f73cb23b2c14cc8d92193c4dee9 100644 (file)
@@ -398,6 +398,10 @@ public:
    {
       assert(this->interface_type == NULL);
       this->interface_type = type;
+      if (this->is_interface_instance()) {
+         this->max_ifc_array_access =
+            rzalloc_array(this, unsigned, type->length);
+      }
    }
 
    const glsl_type *get_interface_type() const
@@ -422,6 +426,19 @@ public:
     */
    unsigned max_array_access;
 
+   /**
+    * For variables which satisfy the is_interface_instance() predicate, this
+    * points to an array of integers such that if the ith member of the
+    * interface block is an array, max_ifc_array_access[i] is the maximum
+    * array element of that member that has been accessed.  If the ith member
+    * of the interface block is not an array, max_ifc_array_access[i] is
+    * unused.
+    *
+    * For variables whose type is not an interface block, this pointer is
+    * NULL.
+    */
+   unsigned *max_ifc_array_access;
+
    /**
     * Is the variable read-only?
     *
index dde22e018468f02ed9e19abda065991fe95b22ad..105f9063a96ff2fbeeca343aec8754f2fb975ef4 100644 (file)
@@ -44,6 +44,12 @@ ir_variable::clone(void *mem_ctx, struct hash_table *ht) const
                                               (ir_variable_mode) this->mode);
 
    var->max_array_access = this->max_array_access;
+   if (this->is_interface_instance()) {
+      var->max_ifc_array_access =
+         rzalloc_array(var, unsigned, this->interface_type->length);
+      memcpy(var->max_ifc_array_access, this->max_ifc_array_access,
+             this->interface_type->length * sizeof(unsigned));
+   }
    var->read_only = this->read_only;
    var->centroid = this->centroid;
    var->invariant = this->invariant;