glsl: Mark entire UBO array active if indexed with non-constant.
authorChris Forbes <chrisf@ijw.co.nz>
Fri, 16 May 2014 09:28:09 +0000 (21:28 +1200)
committerChris Forbes <chrisf@ijw.co.nz>
Sat, 26 Jul 2014 04:46:03 +0000 (16:46 +1200)
Without doing a lot more work, we have no idea which indices may
be used at runtime, so just mark them all.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/glsl/link_uniform_block_active_visitor.cpp

index d19ce20c7826b8ca97d1915ca302da99caac4ff6..854309f9baa186c33090d50a55b60928a1aba23a 100644 (file)
@@ -109,32 +109,44 @@ link_uniform_block_active_visitor::visit_enter(ir_dereference_array *ir)
    assert((b->num_array_elements == 0) == (b->array_elements == NULL));
    assert(b->type != NULL);
 
-   /* Determine whether or not this array index has already been added to the
-    * list of active array indices.  At this point all constant folding must
-    * have occured, and the array index must be a constant.
-    */
    ir_constant *c = ir->array_index->as_constant();
-   assert(c != NULL);
 
-   const unsigned idx = c->get_uint_component(0);
+   if (c) {
+      /* Index is a constant, so mark just that element used, if not already */
+      const unsigned idx = c->get_uint_component(0);
 
-   unsigned i;
-   for (i = 0; i < b->num_array_elements; i++) {
-      if (b->array_elements[i] == idx)
-        break;
-   }
+      unsigned i;
+      for (i = 0; i < b->num_array_elements; i++) {
+         if (b->array_elements[i] == idx)
+            break;
+      }
 
-   assert(i <= b->num_array_elements);
+      assert(i <= b->num_array_elements);
 
-   if (i == b->num_array_elements) {
-      b->array_elements = reralloc(this->mem_ctx,
-                                  b->array_elements,
-                                  unsigned,
-                                  b->num_array_elements + 1);
+      if (i == b->num_array_elements) {
+         b->array_elements = reralloc(this->mem_ctx,
+                                      b->array_elements,
+                                      unsigned,
+                                      b->num_array_elements + 1);
 
-      b->array_elements[b->num_array_elements] = idx;
+         b->array_elements[b->num_array_elements] = idx;
 
-      b->num_array_elements++;
+         b->num_array_elements++;
+      }
+   } else {
+      /* The array index is not a constant, so mark the entire array used. */
+      assert(b->type->is_array());
+      if (b->num_array_elements < b->type->length) {
+         b->num_array_elements = b->type->length;
+         b->array_elements = reralloc(this->mem_ctx,
+                                      b->array_elements,
+                                      unsigned,
+                                      b->num_array_elements);
+
+         for (unsigned i = 0; i < b->num_array_elements; i++) {
+            b->array_elements[i] = i;
+         }
+      }
    }
 
    return visit_continue_with_parent;