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@intel.com>
This commit is contained in:
Paul Berry 2013-09-18 14:15:36 -07:00
parent 22d3ef2df1
commit 3f4292a6e3
3 changed files with 25 additions and 1 deletions

View 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;

View 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?
*

View 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;