[Mesa-dev] [PATCH] glsl: fix lowering of UBO references of named blocks
Nicolai Hähnle
nhaehnle at gmail.com
Wed Nov 2 15:19:29 UTC 2016
On 02.11.2016 15:46, Iago Toral wrote:
> 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>
Thanks!
> I am curious: in what scenario doesn't the first member of a block have
> a zero offset?
It's an ARB_enhanced_layouts thing. As the commit message says, I ran
across this in the GL CTS because it hit an assertion in radeonsi (we
miscompiled it, but the GL CTS didn't actually check for correct
execution...). I've sent a Piglit patch that tests this case as well.
Cheers,
Nicolai
>
> 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