Mesa (master): glsl: Add an ir_variable::max_ifc_array_access field.

Paul Berry stereotype441 at kemper.freedesktop.org
Wed Oct 9 23:50:54 UTC 2013


Module: Mesa
Branch: master
Commit: 3f4292a6e361c03abe922e025d24cba17e0ab305
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3f4292a6e361c03abe922e025d24cba17e0ab305

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Wed Sep 18 14:15:36 2013 -0700

glsl: Add an ir_variable::max_ifc_array_access field.

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 at intel.com>

---

 src/glsl/ir.cpp       |    3 ++-
 src/glsl/ir.h         |   17 +++++++++++++++++
 src/glsl/ir_clone.cpp |    6 ++++++
 3 files changed, 25 insertions(+), 1 deletions(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index ead7456..de9613e 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -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;
diff --git a/src/glsl/ir.h b/src/glsl/ir.h
index a277857..eb24d4e 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -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
@@ -423,6 +427,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?
     *
     * This is set for variables declared as \c const, shader inputs,
diff --git a/src/glsl/ir_clone.cpp b/src/glsl/ir_clone.cpp
index dde22e0..105f906 100644
--- a/src/glsl/ir_clone.cpp
+++ b/src/glsl/ir_clone.cpp
@@ -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;




More information about the mesa-commit mailing list