glsl: Mark as active all elements of shared/std140 block arrays

Commit 1ca25ab (glsl: Do not eliminate 'shared' or 'std140' blocks
or block members) considered as active 'shared' and 'std140' uniform
blocks and uniform block arrays, but did not include the block array
elements. Because of that, it was possible to have an active uniform
block array without any elements marked as used, making the assertion
   ((b->num_array_elements > 0) == b->type->is_array())
in link_uniform_blocks() fail.

Fixes the following 5 dEQP tests:

 * dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.18
 * dEQP-GLES3.functional.ubo.random.nested_structs_instance_arrays.24
 * dEQP-GLES3.functional.ubo.random.nested_structs_arrays_instance_arrays.19
 * dEQP-GLES3.functional.ubo.random.all_per_block_buffers.49
 * dEQP-GLES3.functional.ubo.random.all_shared_buffer.36

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83508
Tested-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Timothy Arceri <t_arceri@yahoo.com.au>
Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>
This commit is contained in:
Antia Puentes 2015-07-29 16:01:24 +02:00 committed by Samuel Iglesias Gonsalvez
parent 065e7d37f1
commit e92c35a872
1 changed files with 24 additions and 0 deletions

View File

@ -104,6 +104,22 @@ link_uniform_block_active_visitor::visit(ir_variable *var)
assert(b->num_array_elements == 0);
assert(b->array_elements == NULL);
assert(b->type != NULL);
assert(!b->type->is_array() || b->has_instance_name);
/* For uniform block arrays declared with a shared or std140 layout
* qualifier, mark all its instances as used.
*/
if (b->type->is_array() && b->type->length > 0) {
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;
}
@ -145,6 +161,14 @@ 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);
/* If the block array was declared with a shared or
* std140 layout qualifier, all its instances have been already marked
* as used in link_uniform_block_active_visitor::visit(ir_variable *).
*/
if (var->get_interface_type()->interface_packing !=
GLSL_INTERFACE_PACKING_PACKED)
return visit_continue_with_parent;
ir_constant *c = ir->array_index->as_constant();
if (c) {