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 <tarceri@itsqueeze.com>
This commit is contained in:

committed by
Timothy Arceri

parent
efd2169c1a
commit
7e025def6d
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user