[Mesa-dev] [PATCH 05/10] glsl: Add an ir_variable::max_ifc_array_access field.

Paul Berry stereotype441 at gmail.com
Fri Sep 27 12:05:31 PDT 2013


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.
---
 src/glsl/ir.cpp       |  3 ++-
 src/glsl/ir.h         | 17 +++++++++++++++++
 src/glsl/ir_clone.cpp |  6 ++++++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index 5d4f2ef..96d4c05 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1594,7 +1594,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 bce7ed0..63b7f5d 100644
--- a/src/glsl/ir.h
+++ b/src/glsl/ir.h
@@ -414,6 +414,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
@@ -439,6 +443,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 fb303b0..9ed97e5 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;
-- 
1.8.4



More information about the mesa-dev mailing list