[wgsl-reader][wgsl-writer] Fix implicit handle storage class for textures

Unwrap the type before checking if it is a handle type, to account for
access decorations.

Bug: tint:332
Change-Id: I8af9749fec1e2f5dbd7c3bec0b73e506ae111a28
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/40540
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
James Price 2021-02-08 15:08:49 +00:00 committed by Commit Bot service account
parent 6d1687fb01
commit 61306b882d
5 changed files with 13 additions and 10 deletions

View File

@ -493,7 +493,7 @@ Maybe<ParserImpl::VarDeclInfo> ParserImpl::variable_decl() {
if (decl.errored) if (decl.errored)
return Failure::kErrored; return Failure::kErrored;
if (decl->type->is_handle()) { if (decl->type->UnwrapAll()->is_handle()) {
// handle types implicitly have the `UniformConstant` storage class. // handle types implicitly have the `UniformConstant` storage class.
// TODO(jrprice): Produce an error if an explicit storage class is provided. // TODO(jrprice): Produce an error if an explicit storage class is provided.
sc = ast::StorageClass::kUniformConstant; sc = ast::StorageClass::kUniformConstant;

View File

@ -1095,9 +1095,9 @@ TEST_F(ParserImplErrorTest, DISABLED_GlobalDeclSamplerExplicitStorageClass) {
TEST_F(ParserImplErrorTest, DISABLED_GlobalDeclTextureExplicitStorageClass) { TEST_F(ParserImplErrorTest, DISABLED_GlobalDeclTextureExplicitStorageClass) {
// TODO(jrprice): Enable this once downstream users have caught up. // TODO(jrprice): Enable this once downstream users have caught up.
EXPECT( EXPECT(
"var<uniform> x : texture_1d<f32>;", "var<uniform> x : [[access(read)]] texture_1d<f32>;",
"test.wgsl:1:5 error: texture variables must not have a storage class\n" "test.wgsl:1:5 error: texture variables must not have a storage class\n"
"var<uniform> x : texture_1d<f32>;\n" "var<uniform> x : [[access(read)]] texture_1d<f32>;\n"
" ^^^^^^^\n"); " ^^^^^^^\n");
} }

View File

@ -191,7 +191,7 @@ TEST_F(ParserImplTest, GlobalVariableDecl_SamplerImplicitStorageClass) {
} }
TEST_F(ParserImplTest, GlobalVariableDecl_TextureImplicitStorageClass) { TEST_F(ParserImplTest, GlobalVariableDecl_TextureImplicitStorageClass) {
auto p = parser("var s : texture_1d<f32>;"); auto p = parser("var s : [[access(read)]] texture_1d<f32>;");
auto decos = p->decoration_list(); auto decos = p->decoration_list();
EXPECT_FALSE(decos.errored); EXPECT_FALSE(decos.errored);
EXPECT_FALSE(decos.matched); EXPECT_FALSE(decos.matched);
@ -202,7 +202,7 @@ TEST_F(ParserImplTest, GlobalVariableDecl_TextureImplicitStorageClass) {
ASSERT_NE(e.value, nullptr); ASSERT_NE(e.value, nullptr);
EXPECT_EQ(e->symbol(), p->builder().Symbols().Get("s")); EXPECT_EQ(e->symbol(), p->builder().Symbols().Get("s"));
EXPECT_TRUE(e->type()->Is<type::Texture>()); EXPECT_TRUE(e->type()->UnwrapAll()->Is<type::Texture>());
EXPECT_EQ(e->declared_storage_class(), ast::StorageClass::kUniformConstant); EXPECT_EQ(e->declared_storage_class(), ast::StorageClass::kUniformConstant);
} }

View File

@ -598,7 +598,7 @@ bool GeneratorImpl::EmitVariable(ast::Variable* var) {
out_ << "var"; out_ << "var";
if (sem->StorageClass() != ast::StorageClass::kNone && if (sem->StorageClass() != ast::StorageClass::kNone &&
sem->StorageClass() != ast::StorageClass::kFunction && sem->StorageClass() != ast::StorageClass::kFunction &&
!var->type()->is_handle()) { !var->type()->UnwrapAll()->is_handle()) {
out_ << "<" << sem->StorageClass() << ">"; out_ << "<" << sem->StorageClass() << ">";
} }
} }

View File

@ -19,6 +19,7 @@
#include "src/ast/identifier_expression.h" #include "src/ast/identifier_expression.h"
#include "src/ast/variable.h" #include "src/ast/variable.h"
#include "src/ast/variable_decl_statement.h" #include "src/ast/variable_decl_statement.h"
#include "src/type/access_control_type.h"
#include "src/type/f32_type.h" #include "src/type/f32_type.h"
#include "src/type/sampled_texture_type.h" #include "src/type/sampled_texture_type.h"
#include "src/writer/wgsl/generator_impl.h" #include "src/writer/wgsl/generator_impl.h"
@ -92,9 +93,11 @@ TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Sampler) {
} }
TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Texture) { TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Texture) {
auto* var = Global( auto* st =
"t", ast::StorageClass::kUniformConstant, create<type::SampledTexture>(type::TextureDimension::k1d, ty.f32());
create<type::SampledTexture>(type::TextureDimension::k1d, ty.f32())); auto* var =
Global("t", ast::StorageClass::kUniformConstant,
create<type::AccessControl>(ast::AccessControl::kReadOnly, st));
auto* stmt = create<ast::VariableDeclStatement>(var); auto* stmt = create<ast::VariableDeclStatement>(var);
@ -103,7 +106,7 @@ TEST_F(WgslGeneratorImplTest, Emit_VariableDeclStatement_Texture) {
gen.increment_indent(); gen.increment_indent();
ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error(); ASSERT_TRUE(gen.EmitStatement(stmt)) << gen.error();
EXPECT_EQ(gen.result(), " var t : texture_1d<f32>;\n"); EXPECT_EQ(gen.result(), " var t : [[access(read)]]\ntexture_1d<f32>;\n");
} }
} // namespace } // namespace