[Mesa-dev] [PATCH 06/16] glsl: Do not eliminate 'shared' or 'std140' blocks or block members

Matt Turner mattst88 at gmail.com
Mon Jul 21 14:30:58 PDT 2014


On Mon, Jul 21, 2014 at 2:04 PM, Ian Romanick <idr at freedesktop.org> wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
>
> Commit 32f32292 (glsl: Allow elimination of uniform block members)
> enabled elimination of unused uniform block members to fix a gles3
> conformance test failure.  This went too far the other way.
>
> Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 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."
>
> Fixes gles3conform failures in:
>
> ES3-CTS.shaders.uniform_block.single_nested_struct.per_block_buffer_shared
> ES3-CTS.shaders.uniform_block.single_nested_struct.per_block_buffer_std140
> ES3-CTS.shaders.uniform_block.single_nested_struct_array.per_block_buffer_shared
> ES3-CTS.shaders.uniform_block.single_nested_struct_array.per_block_buffer_std140
> ES3-CTS.shaders.uniform_block.random.scalar_types.2
> ES3-CTS.shaders.uniform_block.random.scalar_types.9
> ES3-CTS.shaders.uniform_block.random.vector_types.1
> ES3-CTS.shaders.uniform_block.random.vector_types.3
> ES3-CTS.shaders.uniform_block.random.vector_types.7
> ES3-CTS.shaders.uniform_block.random.vector_types.9
> ES3-CTS.shaders.uniform_block.random.basic_types.5
> ES3-CTS.shaders.uniform_block.random.basic_types.6
> ES3-CTS.shaders.uniform_block.random.basic_arrays.0
> ES3-CTS.shaders.uniform_block.random.basic_arrays.2
> ES3-CTS.shaders.uniform_block.random.basic_arrays.5
> ES3-CTS.shaders.uniform_block.random.basic_arrays.8
> ES3-CTS.shaders.uniform_block.random.basic_instance_arrays.0
> ES3-CTS.shaders.uniform_block.random.basic_instance_arrays.4
> ES3-CTS.shaders.uniform_block.random.basic_instance_arrays.5
> ES3-CTS.shaders.uniform_block.random.basic_instance_arrays.6
> ES3-CTS.shaders.uniform_block.random.basic_instance_arrays.9
> ES3-CTS.shaders.uniform_block.random.nested_structs.0
> ES3-CTS.shaders.uniform_block.random.nested_structs.1
> ES3-CTS.shaders.uniform_block.random.nested_structs_arrays.4
> ES3-CTS.shaders.uniform_block.random.nested_structs_instance_arrays.8
> ES3-CTS.shaders.uniform_block.random.nested_structs_arrays_instance_arrays.7
> ES3-CTS.shaders.uniform_block.random.all_per_block_buffers.3
> ES3-CTS.shaders.uniform_block.random.all_per_block_buffers.6
> ES3-CTS.shaders.uniform_block.random.all_shared_buffer.18
>
> Signed-off-by: Ian Romanick <ian.d.romanick at intel.com>
> ---
>  src/glsl/link_uniform_block_active_visitor.cpp | 39 ++++++++++++++++++++++++++
>  src/glsl/link_uniform_block_active_visitor.h   |  1 +
>  src/glsl/opt_dead_code.cpp                     | 29 ++++++++++++++++---
>  3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/src/glsl/link_uniform_block_active_visitor.cpp b/src/glsl/link_uniform_block_active_visitor.cpp
> index d19ce20..c754ef6 100644
> --- a/src/glsl/link_uniform_block_active_visitor.cpp
> +++ b/src/glsl/link_uniform_block_active_visitor.cpp
> @@ -73,6 +73,45 @@ process_block(void *mem_ctx, struct hash_table *ht, ir_variable *var)
>  }
>
>  ir_visitor_status
> +link_uniform_block_active_visitor::visit(ir_variable *var)
> +{
> +   if (!var->is_in_uniform_block())
> +      return visit_continue;
> +
> +   const glsl_type *const block_type = var->is_interface_instance()
> +      ? var->type : var->get_interface_type();
> +
> +   /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 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 (block_type->interface_packing == GLSL_INTERFACE_PACKING_PACKED)
> +      return visit_continue;
> +
> +   /* Process the block.  Bail if there was an error.
> +    */
> +   link_uniform_block_active *const b =
> +      process_block(this->mem_ctx, this->ht, var);
> +   if (b == NULL) {
> +      linker_error(this->prog,
> +                  "uniform block `%s' has mismatching definitions",
> +                  var->get_interface_type()->name);

Tabs.

> +      this->success = false;
> +      return visit_stop;
> +   }
> +
> +   assert(b->num_array_elements == 0);
> +   assert(b->array_elements == NULL);
> +   assert(b->type != NULL);
> +
> +   return visit_continue;
> +}
> +
> +ir_visitor_status
>  link_uniform_block_active_visitor::visit_enter(ir_dereference_array *ir)
>  {
>     ir_dereference_variable *const d = ir->array->as_dereference_variable();
> diff --git a/src/glsl/link_uniform_block_active_visitor.h b/src/glsl/link_uniform_block_active_visitor.h
> index 524cd6b..ae3461c 100644
> --- a/src/glsl/link_uniform_block_active_visitor.h
> +++ b/src/glsl/link_uniform_block_active_visitor.h
> @@ -51,6 +51,7 @@ public:
>
>     virtual ir_visitor_status visit_enter(ir_dereference_array *);
>     virtual ir_visitor_status visit(ir_dereference_variable *);
> +   virtual ir_visitor_status visit(class ir_variable *);

No need for class keyword?

>
>     bool success;
>
> diff --git a/src/glsl/opt_dead_code.cpp b/src/glsl/opt_dead_code.cpp
> index da90bfb..3cec7d4 100644
> --- a/src/glsl/opt_dead_code.cpp
> +++ b/src/glsl/opt_dead_code.cpp
> @@ -99,10 +99,31 @@ do_dead_code(exec_list *instructions, bool uniform_locations_assigned)
>           * stage.  Also, once uniform locations have been assigned, the
>           * declaration cannot be deleted.
>           */
> -        if (entry->var->data.mode == ir_var_uniform &&
> -            (uniform_locations_assigned ||
> -             entry->var->constant_value))
> -           continue;
> +        if (entry->var->data.mode == ir_var_uniform) {
> +            if (uniform_locations_assigned || entry->var->constant_value)
> +               continue;
> +
> +            /* Section 2.11.6 (Uniform Variables) of the OpenGL ES 3.0.3 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 variable is in a uniform block with one of those

Since I'm already nitpicking... capitalize if?


More information about the mesa-dev mailing list