From: Florian Will Date: Fri, 5 Jan 2018 14:33:31 +0000 (+0100) Subject: glsl: Respect std430 layout in lower_buffer_access X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7e025def6d7d3d6bf94facd6ec6d956f40cbb31e;p=mesa.git glsl: Respect std430 layout in lower_buffer_access Respect the std430 rules for determining offset and size of struct members when using a std430 buffer. std140 rules lead to wrong buffer offsets in that case. Fixes my test case attached in Bugzilla. No piglit changes. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=104492 Reviewed-by: Timothy Arceri --- diff --git a/src/compiler/glsl/lower_buffer_access.cpp b/src/compiler/glsl/lower_buffer_access.cpp index db6e8e367b7..ff6f9c1fcfe 100644 --- a/src/compiler/glsl/lower_buffer_access.cpp +++ b/src/compiler/glsl/lower_buffer_access.cpp @@ -73,16 +73,22 @@ lower_buffer_access::emit_access(void *mem_ctx, new(mem_ctx) ir_dereference_record(deref->clone(mem_ctx, NULL), field->name); - field_offset = - glsl_align(field_offset, - field->type->std140_base_alignment(row_major)); + unsigned field_align; + if (packing == GLSL_INTERFACE_PACKING_STD430) + field_align = field->type->std430_base_alignment(row_major); + else + field_align = field->type->std140_base_alignment(row_major); + field_offset = glsl_align(field_offset, field_align); emit_access(mem_ctx, is_write, field_deref, base_offset, deref_offset + field_offset, row_major, NULL, packing, writemask_for_size(field_deref->type->vector_elements)); - field_offset += field->type->std140_size(row_major); + if (packing == GLSL_INTERFACE_PACKING_STD430) + field_offset += field->type->std430_size(row_major); + else + field_offset += field->type->std140_size(row_major); } return; }