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:
Ben Clayton
2022-12-01 18:41:57 +00:00
committed by Dawn LUCI CQ
parent efb17b0254
commit d257e28792
21 changed files with 426 additions and 7 deletions

View File

@@ -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;
},

View File

@@ -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