glsl: fix lowering of UBO references of named blocks
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 31 Oct 2016 13:03:10 +0000 (14:03 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 3 Nov 2016 08:57:25 +0000 (09:57 +0100)
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.

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@lists.freedesktop.org>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
src/compiler/glsl/lower_ubo_reference.cpp

index 37134a9ac4245443e3347a8369efb46a11a9cdc7..eafa1dd75252a6d649addac68edebd9ba32dec27 100644 (file)
@@ -107,7 +107,6 @@ public:
 
    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;
@@ -308,8 +307,11 @@ lower_ubo_reference_visitor::setup_for_load_or_store(void *mem_ctx,
             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;
       }
@@ -317,8 +319,6 @@ lower_ubo_reference_visitor::setup_for_load_or_store(void *mem_ctx,
 
    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);