summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Berry <[email protected]>2013-09-18 14:15:36 -0700
committerPaul Berry <[email protected]>2013-10-09 16:49:31 -0700
commit3f4292a6e361c03abe922e025d24cba17e0ab305 (patch)
treece1da045ef60477bc730dc361874e44396fb2026
parent22d3ef2df1f4fd6c4a0aaf17996fdcd9b70547cb (diff)
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 <[email protected]>
-rw-r--r--src/glsl/ir.cpp3
-rw-r--r--src/glsl/ir.h17
-rw-r--r--src/glsl/ir_clone.cpp6
3 files changed, 25 insertions, 1 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index ead7456dfcc..de9613e8fa1 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 a2778570826..eb24d4e441d 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 dde22e01846..105f9063a96 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;