diff options
author | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-11-07 12:08:17 +0300 |
---|---|---|
committer | Hans-Kristian Arntzen <post@arntzen-software.no> | 2021-11-07 12:08:17 +0300 |
commit | 05e8e5a95338b94bffe3584b83b45b75177b5237 (patch) | |
tree | 36467bcc429effd5003e37f1718ba1a3a1839dbe /spirv_cross.cpp | |
parent | 04293e03fdc6205ba9e0e52c54d7901a4e67ae13 (diff) |
Correctly reflect declared buffer size for out of order members.
Need to deduce size based on member with highest offset, not highest
index.
Diffstat (limited to 'spirv_cross.cpp')
-rw-r--r-- | spirv_cross.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/spirv_cross.cpp b/spirv_cross.cpp index 51935061..edcf8e7c 100644 --- a/spirv_cross.cpp +++ b/spirv_cross.cpp @@ -1729,10 +1729,22 @@ size_t Compiler::get_declared_struct_size(const SPIRType &type) const if (type.member_types.empty()) SPIRV_CROSS_THROW("Declared struct in block cannot be empty."); - uint32_t last = uint32_t(type.member_types.size() - 1); - size_t offset = type_struct_member_offset(type, last); - size_t size = get_declared_struct_member_size(type, last); - return offset + size; + // Offsets can be declared out of order, so we need to deduce the actual size + // based on last member instead. + uint32_t member_index = 0; + size_t highest_offset = 0; + for (uint32_t i = 0; i < uint32_t(type.member_types.size()); i++) + { + size_t offset = type_struct_member_offset(type, i); + if (offset > highest_offset) + { + highest_offset = offset; + member_index = i; + } + } + + size_t size = get_declared_struct_member_size(type, member_index); + return highest_offset + size; } size_t Compiler::get_declared_struct_size_runtime_array(const SPIRType &type, size_t array_size) const |