tint/transform: Implement CreateASTTypeFor() for pointers

Change-Id: I83b0bb28194be559e6e60caca6f2dc1871e65743
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/122340
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
Kokoro: Ben Clayton <bclayton@chromium.org>
This commit is contained in:
Ben Clayton 2023-03-02 17:47:24 +00:00
parent 57be2ff2eb
commit 1edc272904
2 changed files with 28 additions and 0 deletions

View File

@ -173,6 +173,15 @@ ast::Type Transform::CreateASTTypeFor(CloneContext& ctx, const type::Type* ty) {
if (auto* s = ty->As<type::Sampler>()) {
return ctx.dst->ty.sampler(s->kind());
}
if (auto* p = ty->As<type::Pointer>()) {
// Note: type::Pointer always has an inferred access, but WGSL only allows an explicit
// access in the 'storage' address space.
auto address_space = p->AddressSpace();
auto access = address_space == builtin::AddressSpace::kStorage
? p->Access()
: builtin::Access::kUndefined;
return ctx.dst->ty.pointer(CreateASTTypeFor(ctx, p->StoreType()), address_space, access);
}
TINT_UNREACHABLE(Transform, ctx.dst->Diagnostics())
<< "Unhandled type: " << ty->TypeInfo().name;
return ast::Type{};

View File

@ -127,5 +127,24 @@ TEST_F(CreateASTTypeForTest, Struct) {
ast::CheckIdentifier(ast_type_builder.Symbols(), str, "S");
}
TEST_F(CreateASTTypeForTest, PrivatePointer) {
auto ptr = create([](ProgramBuilder& b) {
return b.create<type::Pointer>(b.create<type::I32>(), builtin::AddressSpace::kPrivate,
builtin::Access::kReadWrite);
});
ast::CheckIdentifier(ast_type_builder.Symbols(), ptr, ast::Template("ptr", "private", "i32"));
}
TEST_F(CreateASTTypeForTest, StorageReadWritePointer) {
auto ptr = create([](ProgramBuilder& b) {
return b.create<type::Pointer>(b.create<type::I32>(), builtin::AddressSpace::kStorage,
builtin::Access::kReadWrite);
});
ast::CheckIdentifier(ast_type_builder.Symbols(), ptr,
ast::Template("ptr", "storage", "i32", "read_write"));
}
} // namespace
} // namespace tint::transform