summaryrefslogtreecommitdiffstats
path: root/src/compiler/glsl/ir.h
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2016-05-20 10:19:14 +1000
committerDave Airlie <airlied@redhat.com>2016-05-24 11:27:29 +1000
commit8c628ab13e4fa86ee662dcddb0f5a89b2d30e1a4 (patch)
treec7a3ca763ab93784e855bcdef773ea9c75e6bfeb /src/compiler/glsl/ir.h
parent2ae493d68647af26c64ae59f0127349d75817b91 (diff)
downloadexternal_mesa3d-8c628ab13e4fa86ee662dcddb0f5a89b2d30e1a4.zip
external_mesa3d-8c628ab13e4fa86ee662dcddb0f5a89b2d30e1a4.tar.gz
external_mesa3d-8c628ab13e4fa86ee662dcddb0f5a89b2d30e1a4.tar.bz2
glsl: make max array trackers ints and use -1 as base. (v2)
This fixes a bug that breaks cull distances. The problem is the max array accessors can't tell the difference between an never accessed unsized array and an accessed at location 0 unsized array. This leads to converting an undeclared unused gl_ClipDistance inside or outside gl_PerVertex to a size 1 array. However we need to the number of active clip distances to work out the starting point for the cull distances, and this offset by one when it's not being used isn't possible to distinguish from the case were only the first element is accessed. I tried to use ->used for this, but that doesn't work when gl_ClipDistance is part of an interface block. So this changes things so that max_array_access is an int and initialised to -1. This also allows unsized arrays to proceed further than that could before, but we really shouldn't mind as they will get eliminated if nothing uses them later. For initialised uniforms we no longer change their array size at runtime, if these are unused they will get eliminated eventually. v2: use ralloc_array (Ilia) Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'src/compiler/glsl/ir.h')
-rw-r--r--src/compiler/glsl/ir.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 6e0dc0b..d52dbf8 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -484,7 +484,10 @@ public:
this->interface_type = type;
if (this->is_interface_instance()) {
this->u.max_ifc_array_access =
- rzalloc_array(this, unsigned, type->length);
+ ralloc_array(this, int, type->length);
+ for (unsigned i = 0; i < type->length; i++) {
+ this->u.max_ifc_array_access[i] = -1;
+ }
}
}
@@ -520,7 +523,7 @@ public:
* zero.
*/
for (unsigned i = 0; i < this->interface_type->length; i++)
- assert(this->u.max_ifc_array_access[i] == 0);
+ assert(this->u.max_ifc_array_access[i] == -1);
#endif
ralloc_free(this->u.max_ifc_array_access);
this->u.max_ifc_array_access = NULL;
@@ -540,7 +543,7 @@ public:
* A "set" function is not needed because the array is dynmically allocated
* as necessary.
*/
- inline unsigned *get_max_ifc_array_access()
+ inline int *get_max_ifc_array_access()
{
assert(this->data._num_state_slots == 0);
return this->u.max_ifc_array_access;
@@ -888,9 +891,9 @@ public:
/**
* Highest element accessed with a constant expression array index
*
- * Not used for non-array variables.
+ * Not used for non-array variables. -1 is never accessed.
*/
- unsigned max_array_access;
+ int max_array_access;
/**
* Transform feedback buffer.
@@ -938,7 +941,7 @@ private:
* For variables whose type is not an interface block, this pointer is
* NULL.
*/
- unsigned *max_ifc_array_access;
+ int *max_ifc_array_access;
/**
* Built-in state that backs this uniform