[Mesa-dev] [PATCH] glsl: fix lowering of UBO references of named blocks

Iago Toral itoral at igalia.com
Wed Nov 2 14:46:48 UTC 2016


On Mon, 2016-10-31 at 22:19 +0100, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
> 
> When a UBO reference has the form block_name.foo where block_name
> refers
> to a block where the first member has a non-zero offset, the base
> offset
> was incorrectly added to the reference.

The patch looks good to me and is:

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>

I am curious: in what scenario doesn't the first member of a block have
a zero offset?

Iago

> Fixes an assertion triggered in debug builds by
> GL45-CTS.enhanced_layouts.uniform_block_layout_qualifier_conflict.
> That test
> doesn't properly check for correct execution in this case, so I am
> also
> going to send out a piglit test.
> 
> Cc: 13.0 <mesa-stable at lists.freedesktop.org>
> ---
>  src/compiler/glsl/lower_ubo_reference.cpp | 10 +++++-----
>  1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/src/compiler/glsl/lower_ubo_reference.cpp
> b/src/compiler/glsl/lower_ubo_reference.cpp
> index 37134a9..eafa1dd 100644
> --- a/src/compiler/glsl/lower_ubo_reference.cpp
> +++ b/src/compiler/glsl/lower_ubo_reference.cpp
> @@ -100,21 +100,20 @@ public:
>  
>     unsigned calculate_unsized_array_stride(ir_dereference *deref,
>                                             enum
> glsl_interface_packing packing);
>  
>     ir_call *lower_ssbo_atomic_intrinsic(ir_call *ir);
>     ir_call *check_for_ssbo_atomic_intrinsic(ir_call *ir);
>     ir_visitor_status visit_enter(ir_call *ir);
>  
>     struct gl_linked_shader *shader;
>     bool clamp_block_indices;
> -   struct gl_uniform_buffer_variable *ubo_var;
>     const struct glsl_struct_field *struct_field;
>     ir_variable *variable;
>     ir_rvalue *uniform_block;
>     bool progress;
>  };
>  
>  /**
>   * Determine the name of the interface block field
>   *
>   * This is the name of the specific member as it would appear in the
> @@ -301,31 +300,32 @@
> lower_ubo_reference_visitor::setup_for_load_or_store(void *mem_ctx,
>        if (strcmp(field_name, blocks[i]->Name) == 0) {
>  
>           ir_constant *index = new(mem_ctx) ir_constant(i);
>  
>           if (nonconst_block_index) {
>              this->uniform_block = add(nonconst_block_index, index);
>           } else {
>              this->uniform_block = index;
>           }
>  
> -         this->ubo_var = var->is_interface_instance()
> -            ? &blocks[i]->Uniforms[0] : &blocks[i]->Uniforms[var-
> >data.location];
> +         if (var->is_interface_instance()) {
> +            *const_offset = 0;
> +         } else {
> +            *const_offset = blocks[i]->Uniforms[var-
> >data.location].Offset;
> +         }
>  
>           break;
>        }
>     }
>  
>     assert(this->uniform_block);
>  
> -   *const_offset = ubo_var->Offset;
> -
>     this->struct_field = NULL;
>     setup_buffer_access(mem_ctx, deref, offset, const_offset,
> row_major,
>                         matrix_columns, &this->struct_field,
> packing);
>  }
>  
>  void
>  lower_ubo_reference_visitor::handle_rvalue(ir_rvalue **rvalue)
>  {
>     if (!*rvalue)
>        return;


More information about the mesa-dev mailing list