From 133620196d57cc1c6874c806095fc3cf1f054274 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 24 Oct 2020 13:28:39 -0500 Subject: [PATCH] compiler/types: Don't place members in the previous substruct's end padding With the following structures : struct StructA { uint64_t value0; uint8_t value1; }; struct TopStruct { struct StructA a; uint8_t value3; }; Currently offsetof(struct TopStruct, value3) = 9. While the same code on the CPU gives offsetof(struct TopStruct, value3) = 16. This is impacting OpenCL kernels we're trying to use to build acceleration structures. v2: Add comment/link to some description of the alignment/size computation Cc: mesa-stable Signed-off-by: Lionel Landwerlin Reviewed-by: Jason Ekstrand Part-of: --- src/compiler/glsl_types.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index 538ff49765e..c890928ab1b 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -2761,6 +2761,16 @@ glsl_type::get_explicit_type_for_size_align(glsl_type_size_align_func type_info, *size = fields[i].offset + field_size; *alignment = MAX2(*alignment, field_align); } + /* + * "The alignment of the struct is the alignment of the most-aligned + * field in it." + * + * "Finally, the size of the struct is the current offset rounded up to + * the nearest multiple of the struct's alignment." + * + * https://doc.rust-lang.org/reference/type-layout.html#reprc-structs + */ + *size = align(*size, *alignment); const glsl_type *type; if (this->is_struct()) {