mirror of
https://gitee.com/openharmony/third_party_mesa3d
synced 2024-11-23 07:19:50 +00:00
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 <lionel.g.landwerlin@intel.com> Reviewed-by: Jason Ekstrand <jason.ekstrand@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16940>
This commit is contained in:
parent
2aeb83117a
commit
133620196d
@ -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()) {
|
||||
|
Loading…
Reference in New Issue
Block a user