summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntia Puentes <apuentes@igalia.com>2015-07-29 16:01:24 +0200
committerSamuel Iglesias Gonsalvez <siglesias@igalia.com>2015-09-25 08:39:23 +0200
commite92c35a8724efd36a35ac9106e5977c5ec2cb332 (patch)
tree3e93f5a9a090c4df47a0a3a3ce57c00e42610054
parent065e7d37f16814646dfd1c95c15a73605042e277 (diff)
downloadexternal_mesa3d-e92c35a8724efd36a35ac9106e5977c5ec2cb332.zip
external_mesa3d-e92c35a8724efd36a35ac9106e5977c5ec2cb332.tar.gz
external_mesa3d-e92c35a8724efd36a35ac9106e5977c5ec2cb332.tar.bz2
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>
-rw-r--r--src/glsl/link_uniform_block_active_visitor.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/glsl/link_uniform_block_active_visitor.cpp b/src/glsl/link_uniform_block_active_visitor.cpp
index 72e0782..bcf17fe 100644
--- a/src/glsl/link_uniform_block_active_visitor.cpp
+++ b/src/glsl/link_uniform_block_active_visitor.cpp
@@ -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) {