[Mesa-dev] [PATCH 6/9] glsl: mark named uniform block arrays as active if defined with shared or std140 layout qualifier

Matt Turner mattst88 at gmail.com
Mon May 4 16:03:43 PDT 2015


On Tue, Feb 24, 2015 at 10:02 AM, Eduardo Lima Mitev <elima at igalia.com> wrote:
> From: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
>
> If the named uniform block is an array declared with a shared or
> std140 layout qualifier and no shader instruction has referenced it,
> then it is never marked as active, then num_array_elements is zero.
>
> Section 2.12.6 (Uniform Variables) of the OpenGL ES 3.0.4 spec says
> that is should be considered active:
>
>  "All members of a named uniform block declared with a shared or
>   std140 layout qualifier are considered active, even if they are not
>   referenced in any shader in the program. The uniform block itself is
>   also considered active, even if no member of the block is
>   referenced."
>
> Fixes:
>
> dEQP-GLES3.functional.ubo.random.basic_instance_arrays.18
>
> Signed-off-by: Samuel Iglesias Gonsalvez <siglesias at igalia.com>
> ---
>  src/glsl/link_uniform_blocks.cpp | 26 ++++++++++++++++++++++++++
>  1 file changed, 26 insertions(+)
>
> diff --git a/src/glsl/link_uniform_blocks.cpp b/src/glsl/link_uniform_blocks.cpp
> index f5fc502..67a3f00 100644
> --- a/src/glsl/link_uniform_blocks.cpp
> +++ b/src/glsl/link_uniform_blocks.cpp
> @@ -213,6 +213,32 @@ link_uniform_blocks(void *mem_ctx,
>        const glsl_type *const block_type =
>           b->type->is_array() ? b->type->fields.array : b->type;
>
> +      /* Section 2.12.6 (Uniform Variables) of the OpenGL ES 3.0.4 spec says:
> +       *
> +       *   "All members of a named uniform block declared with a shared or
> +       *   std140 layout qualifier are considered active, even if they are not
> +       *   referenced in any shader in the program. The uniform block itself is
> +       *   also considered active, even if no member of the block is
> +       *   referenced."
> +       *
> +       * If the named uniform block is an array declared with a shared or
> +       * std140 layout qualifier and no shader instruction has referenced it,
> +       * then it is never marked as active, then num_array_elements is zero.
> +       */

As far as I can tell, this is a difference between Desktop GL and ES.
If that is indeed the case, shouldn't the block below contain a
_mesa_is_gles3() check?

> +      if (b->num_array_elements == 0 && b->type->is_array() &&
> +          (b->type->interface_packing == GLSL_INTERFACE_PACKING_STD140 ||
> +           b->type->interface_packing == GLSL_INTERFACE_PACKING_SHARED)) {
> +         struct link_uniform_block_active *const block =
> +            (struct link_uniform_block_active *) entry->data;
> +         block->num_array_elements = block->type->length;
> +         block->array_elements = reralloc(mem_ctx,
> +                                          block->array_elements,
> +                                          unsigned,
> +                                          block->num_array_elements);
> +         /* Mark the entire array as used. */
> +         for (unsigned i = 0; i < block->num_array_elements; i++)
> +            block->array_elements[i] = i;
> +      }
>        assert((b->num_array_elements > 0) == b->type->is_array());
>
>        block_size.num_active_uniforms = 0;
> --
> 2.1.3


More information about the mesa-dev mailing list