Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Kristian Arntzen <post@arntzen-software.no>2021-11-07 12:08:17 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2021-11-07 12:08:17 +0300
commit05e8e5a95338b94bffe3584b83b45b75177b5237 (patch)
tree36467bcc429effd5003e37f1718ba1a3a1839dbe /spirv_cross.cpp
parent04293e03fdc6205ba9e0e52c54d7901a4e67ae13 (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.cpp20
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