[Mesa-dev] [PATCH v5 70/70] glsl: Mark as active all elements of shared/std140 block arrays

Tapani Pälli tapani.palli at intel.com
Mon Sep 21 00:41:32 PDT 2015


Seems like a nice fix, takes ES3 CTS failures from 116 to 64 on Haswell 
(most failing tests are with ubos).

Tested-by: Tapani Pälli <tapani.palli at intel.com>

This is individual patch not related to just SSBOs, maybe this could be 
pushed separately from the rest?

// Tapani

On 09/10/2015 04:36 PM, Iago Toral Quiroga wrote:
> From: Antia Puentes <apuentes at igalia.com>
>
> 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
>
> Fixes bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=83508
> ---
>   src/glsl/link_uniform_block_active_visitor.cpp | 23 +++++++++++++++++++++++
>   1 file changed, 23 insertions(+)
>
> diff --git a/src/glsl/link_uniform_block_active_visitor.cpp b/src/glsl/link_uniform_block_active_visitor.cpp
> index 5102947..fbe79de 100644
> --- a/src/glsl/link_uniform_block_active_visitor.cpp
> +++ b/src/glsl/link_uniform_block_active_visitor.cpp
> @@ -106,6 +106,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;
>   }
> @@ -147,6 +163,13 @@ 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->type->interface_packing != GLSL_INTERFACE_PACKING_PACKED)
> +      return visit_continue_with_parent;
> +
>      ir_constant *c = ir->array_index->as_constant();
>
>      if (c) {
>


More information about the mesa-dev mailing list