mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-21 02:39:11 +00:00
tint: Don't override alignment with @offset
Overriding the alignment to 1 would cause nested structures to be incorrectly laid out. The fix: Don't override the alignment. All struct layout validation works on the sem offsets, so none of this has to change. Bug: tint:1776 Change-Id: Ic01d45fb2790cd823ed9a55e336860ebdc351aea Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/112603 Kokoro: Ben Clayton <bclayton@google.com> Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
committed by
Dawn LUCI CQ
parent
efb17b0254
commit
d257e28792
@@ -3173,7 +3173,6 @@ sem::Struct* Resolver::Structure(const ast::Struct* str) {
|
||||
AddError("offsets must be in ascending order", o->source);
|
||||
return false;
|
||||
}
|
||||
align = 1;
|
||||
has_offset_attr = true;
|
||||
return true;
|
||||
},
|
||||
|
||||
@@ -555,5 +555,47 @@ TEST_F(ResolverStructLayoutTest, StructWithLotsOfPadding) {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_F(ResolverStructLayoutTest, OffsetAttributes) {
|
||||
auto* inner = Structure("Inner", utils::Vector{
|
||||
Member("a", ty.f32(), utils::Vector{MemberOffset(8_i)}),
|
||||
Member("b", ty.f32(), utils::Vector{MemberOffset(16_i)}),
|
||||
Member("c", ty.f32(), utils::Vector{MemberOffset(32_i)}),
|
||||
});
|
||||
auto* s = Structure("S", utils::Vector{
|
||||
Member("a", ty.f32(), utils::Vector{MemberOffset(4_i)}),
|
||||
Member("b", ty.u32(), utils::Vector{MemberOffset(8_i)}),
|
||||
Member("c", ty.Of(inner), utils::Vector{MemberOffset(32_i)}),
|
||||
Member("d", ty.i32()),
|
||||
Member("e", ty.i32(), utils::Vector{MemberOffset(128_i)}),
|
||||
});
|
||||
|
||||
ASSERT_TRUE(r()->Resolve()) << r()->error();
|
||||
|
||||
auto* sem = TypeOf(s)->As<sem::Struct>();
|
||||
ASSERT_NE(sem, nullptr);
|
||||
EXPECT_EQ(sem->Size(), 132u);
|
||||
EXPECT_EQ(sem->SizeNoPadding(), 132u);
|
||||
EXPECT_EQ(sem->Align(), 4u);
|
||||
ASSERT_EQ(sem->Members().size(), 5u);
|
||||
EXPECT_EQ(sem->Members()[0]->Offset(), 4u);
|
||||
EXPECT_EQ(sem->Members()[0]->Align(), 4u);
|
||||
EXPECT_EQ(sem->Members()[0]->Size(), 4u);
|
||||
EXPECT_EQ(sem->Members()[1]->Offset(), 8u);
|
||||
EXPECT_EQ(sem->Members()[1]->Align(), 4u);
|
||||
EXPECT_EQ(sem->Members()[1]->Size(), 4u);
|
||||
EXPECT_EQ(sem->Members()[2]->Offset(), 32u);
|
||||
EXPECT_EQ(sem->Members()[2]->Align(), 4u);
|
||||
EXPECT_EQ(sem->Members()[2]->Size(), 36u);
|
||||
EXPECT_EQ(sem->Members()[3]->Offset(), 68u);
|
||||
EXPECT_EQ(sem->Members()[3]->Align(), 4u);
|
||||
EXPECT_EQ(sem->Members()[3]->Size(), 4u);
|
||||
EXPECT_EQ(sem->Members()[4]->Offset(), 128u);
|
||||
EXPECT_EQ(sem->Members()[4]->Align(), 4u);
|
||||
EXPECT_EQ(sem->Members()[4]->Size(), 4u);
|
||||
for (auto& m : sem->Members()) {
|
||||
EXPECT_EQ(m->Struct()->Declaration(), s);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
} // namespace tint::resolver
|
||||
|
||||
Reference in New Issue
Block a user