[wgsl-writer] Emit access control type.

This CL updates the WGSL-Writer to emit the access control type.

Bug: tint:287
Change-Id: Ifb42a5ab199f18014c33be62960d078e57df8dba
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/33360
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
dan sinclair 2020-11-19 19:40:41 +00:00 committed by Commit Bot service account
parent 7214f407dc
commit ea9c3a604b
3 changed files with 55 additions and 13 deletions

View File

@ -404,18 +404,17 @@ bool GeneratorImpl::EmitImageFormat(const ast::type::ImageFormat fmt) {
bool GeneratorImpl::EmitType(ast::type::Type* type) { bool GeneratorImpl::EmitType(ast::type::Type* type) {
if (type->IsAccessControl()) { if (type->IsAccessControl()) {
auto* ac = type->AsAccessControl(); auto* ac = type->AsAccessControl();
// TODO(dsinclair): Access control isn't supported in WGSL yet, so this
// is disabled for now. out_ << "[[access(";
// if (ac->IsReadOnly()) {
// out_ << "[[access("; out_ << "read";
// if (ac->IsReadOnly()) { } else if (ac->IsReadWrite()) {
// out_ << "read"; out_ << "read_write";
// } else if (ac->IsWriteOnly()) { } else {
// out_ << "write"; error_ = "invalid access control";
// } else { return false;
// out_ << "read_write"; }
// } out_ << ")]]" << std::endl;
// out_ << ")]]" << std::endl;
if (!EmitType(ac->type())) { if (!EmitType(ac->type())) {
return false; return false;
} }

View File

@ -240,7 +240,8 @@ struct Data {
d : f32; d : f32;
}; };
[[binding(0), set(0)]] var<storage_buffer> data : Data; [[binding(0), set(0)]] var<storage_buffer> data : [[access(read_write)]]
Data;
[[stage(compute)]] [[stage(compute)]]
fn a() -> void { fn a() -> void {

View File

@ -13,6 +13,7 @@
// limitations under the License. // limitations under the License.
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "src/ast/access_control.h"
#include "src/ast/stride_decoration.h" #include "src/ast/stride_decoration.h"
#include "src/ast/struct.h" #include "src/ast/struct.h"
#include "src/ast/struct_block_decoration.h" #include "src/ast/struct_block_decoration.h"
@ -20,6 +21,7 @@
#include "src/ast/struct_member.h" #include "src/ast/struct_member.h"
#include "src/ast/struct_member_decoration.h" #include "src/ast/struct_member_decoration.h"
#include "src/ast/struct_member_offset_decoration.h" #include "src/ast/struct_member_offset_decoration.h"
#include "src/ast/type/access_control_type.h"
#include "src/ast/type/array_type.h" #include "src/ast/type/array_type.h"
#include "src/ast/type/bool_type.h" #include "src/ast/type/bool_type.h"
#include "src/ast/type/depth_texture_type.h" #include "src/ast/type/depth_texture_type.h"
@ -61,6 +63,46 @@ TEST_F(WgslGeneratorImplTest, EmitType_Array) {
EXPECT_EQ(gen.result(), "array<bool, 4>"); EXPECT_EQ(gen.result(), "array<bool, 4>");
} }
TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_Read) {
ast::type::I32Type i32;
ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
ast::StructMemberList members;
members.push_back(&mem);
ast::StructBlockDecoration block_deco(Source{});
ast::StructDecorationList decos;
decos.push_back(&block_deco);
ast::Struct str(decos, members);
ast::type::StructType s("S", &str);
ast::type::AccessControlType a(ast::AccessControl::kReadOnly, &s);
ASSERT_TRUE(gen.EmitType(&a)) << gen.error();
EXPECT_EQ(gen.result(), "[[access(read)]]\nS");
}
TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_ReadWrite) {
ast::type::I32Type i32;
ast::StructMember mem("a", &i32, ast::StructMemberDecorationList{});
ast::StructMemberList members;
members.push_back(&mem);
ast::StructBlockDecoration block_deco(Source{});
ast::StructDecorationList decos;
decos.push_back(&block_deco);
ast::Struct str(decos, members);
ast::type::StructType s("S", &str);
ast::type::AccessControlType a(ast::AccessControl::kReadWrite, &s);
ASSERT_TRUE(gen.EmitType(&a)) << gen.error();
EXPECT_EQ(gen.result(), "[[access(read_write)]]\nS");
}
TEST_F(WgslGeneratorImplTest, EmitType_Array_Decoration) { TEST_F(WgslGeneratorImplTest, EmitType_Array_Decoration) {
ast::type::BoolType b; ast::type::BoolType b;
ast::ArrayDecorationList decos; ast::ArrayDecorationList decos;