Fix std140 structs adding extra padding at end of structs

This commit is contained in:
baldurk
2023-01-05 15:39:14 +00:00
parent 89a6965c12
commit b912ab4bac
+72 -1
View File
@@ -2018,7 +2018,7 @@ ParsedFormat BufferFormatter::ParseFormatString(const QString &formatString, uin
uint32_t end = root.offset;
if(!fixed.type.members.isEmpty())
end = qMax(
end, fixed.type.members.back().byteOffset + fixed.type.members.back().type.arrayByteStride);
end, fixed.type.members.back().byteOffset + GetVarSizeAndTrail(fixed.type.members.back()));
fixed.type.arrayByteStride = AlignUp(end, GetAlignment(pack, fixed));
@@ -5530,6 +5530,77 @@ struct s
CHECK(parsed.fixed.type.members[6].byteOffset == 160); // g
CHECK(parsed.fixed.type.members[7].byteOffset == 165); // h
};
SECTION("Testing trailing member alignments")
{
rdcstr def = R"(
#pack(std140)
struct blah
{
float4x4 a;
float4 b;
};
)";
parsed = BufferFormatter::ParseFormatString(def, 0, true);
CHECK(parsed.errors.isEmpty());
CHECK(parsed.repeating.type.members.empty());
REQUIRE(parsed.fixed.type.members.size() == 2);
CHECK(parsed.fixed.type.members[0].byteOffset == 0); // a
CHECK(parsed.fixed.type.members[1].byteOffset == 64); // b
CHECK(parsed.fixed.type.arrayByteStride == 80); // stride 80
def = R"(
#pack(std140)
struct blah
{
float4x4 a;
uint b;
uint c;
uint d;
uint e;
};
)";
parsed = BufferFormatter::ParseFormatString(def, 0, true);
CHECK(parsed.errors.isEmpty());
CHECK(parsed.repeating.type.members.empty());
REQUIRE(parsed.fixed.type.members.size() == 5);
CHECK(parsed.fixed.type.members[0].byteOffset == 0); // a
CHECK(parsed.fixed.type.members[1].byteOffset == 64); // b
CHECK(parsed.fixed.type.members[2].byteOffset == 68); // c
CHECK(parsed.fixed.type.members[3].byteOffset == 72); // d
CHECK(parsed.fixed.type.members[4].byteOffset == 76); // e
CHECK(parsed.fixed.type.arrayByteStride == 80); // stride 80
def = R"(
#pack(std140)
struct blah
{
float4x4 a;
uint b;
uint c;
float d;
uint e;
};
)";
parsed = BufferFormatter::ParseFormatString(def, 0, true);
CHECK(parsed.errors.isEmpty());
CHECK(parsed.repeating.type.members.empty());
REQUIRE(parsed.fixed.type.members.size() == 5);
CHECK(parsed.fixed.type.members[0].byteOffset == 0); // a
CHECK(parsed.fixed.type.members[1].byteOffset == 64); // b
CHECK(parsed.fixed.type.members[2].byteOffset == 68); // c
CHECK(parsed.fixed.type.members[3].byteOffset == 72); // d
CHECK(parsed.fixed.type.members[4].byteOffset == 76); // e
CHECK(parsed.fixed.type.arrayByteStride == 80); // stride 80
};
};
SECTION("errors")