• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2020 The Tint Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #include "src/ast/override_decoration.h"
16 #include "src/ast/struct_block_decoration.h"
17 #include "src/writer/wgsl/test_helper.h"
18 
19 namespace tint {
20 namespace writer {
21 namespace wgsl {
22 namespace {
23 
24 using WgslGeneratorImplTest = TestHelper;
25 
TEST_F(WgslGeneratorImplTest,EmitVariable)26 TEST_F(WgslGeneratorImplTest, EmitVariable) {
27   auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate);
28 
29   GeneratorImpl& gen = Build();
30 
31   std::stringstream out;
32   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
33   EXPECT_EQ(out.str(), R"(var<private> a : f32;)");
34 }
35 
TEST_F(WgslGeneratorImplTest,EmitVariable_StorageClass)36 TEST_F(WgslGeneratorImplTest, EmitVariable_StorageClass) {
37   auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate);
38 
39   GeneratorImpl& gen = Build();
40 
41   std::stringstream out;
42   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
43   EXPECT_EQ(out.str(), R"(var<private> a : f32;)");
44 }
45 
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_Read)46 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_Read) {
47   auto* s = Structure("S", {Member("a", ty.i32())},
48                       {create<ast::StructBlockDecoration>()});
49   auto* v =
50       Global("a", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kRead,
51              ast::DecorationList{
52                  create<ast::BindingDecoration>(0),
53                  create<ast::GroupDecoration>(0),
54              });
55 
56   GeneratorImpl& gen = Build();
57 
58   std::stringstream out;
59   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
60   EXPECT_EQ(out.str(), R"([[binding(0), group(0)]] var<storage, read> a : S;)");
61 }
62 
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_Write)63 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_Write) {
64   auto* s = Structure("S", {Member("a", ty.i32())},
65                       {create<ast::StructBlockDecoration>()});
66   auto* v =
67       Global("a", ty.Of(s), ast::StorageClass::kStorage, ast::Access::kWrite,
68              ast::DecorationList{
69                  create<ast::BindingDecoration>(0),
70                  create<ast::GroupDecoration>(0),
71              });
72 
73   GeneratorImpl& gen = Build();
74 
75   std::stringstream out;
76   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
77   EXPECT_EQ(out.str(),
78             R"([[binding(0), group(0)]] var<storage, write> a : S;)");
79 }
80 
TEST_F(WgslGeneratorImplTest,EmitVariable_Access_ReadWrite)81 TEST_F(WgslGeneratorImplTest, EmitVariable_Access_ReadWrite) {
82   auto* s = Structure("S", {Member("a", ty.i32())},
83                       {create<ast::StructBlockDecoration>()});
84   auto* v = Global("a", ty.Of(s), ast::StorageClass::kStorage,
85                    ast::Access::kReadWrite,
86                    ast::DecorationList{
87                        create<ast::BindingDecoration>(0),
88                        create<ast::GroupDecoration>(0),
89                    });
90 
91   GeneratorImpl& gen = Build();
92 
93   std::stringstream out;
94   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
95   EXPECT_EQ(out.str(),
96             R"([[binding(0), group(0)]] var<storage, read_write> a : S;)");
97 }
98 
TEST_F(WgslGeneratorImplTest,EmitVariable_Decorated)99 TEST_F(WgslGeneratorImplTest, EmitVariable_Decorated) {
100   auto* v = Global("a", ty.sampler(ast::SamplerKind::kSampler),
101                    ast::StorageClass::kNone, nullptr,
102                    ast::DecorationList{
103                        create<ast::GroupDecoration>(1),
104                        create<ast::BindingDecoration>(2),
105                    });
106 
107   GeneratorImpl& gen = Build();
108 
109   std::stringstream out;
110   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
111   EXPECT_EQ(out.str(), R"([[group(1), binding(2)]] var a : sampler;)");
112 }
113 
TEST_F(WgslGeneratorImplTest,EmitVariable_Constructor)114 TEST_F(WgslGeneratorImplTest, EmitVariable_Constructor) {
115   auto* v = Global("a", ty.f32(), ast::StorageClass::kPrivate, Expr(1.0f));
116 
117   GeneratorImpl& gen = Build();
118 
119   std::stringstream out;
120   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
121   EXPECT_EQ(out.str(), R"(var<private> a : f32 = 1.0;)");
122 }
123 
TEST_F(WgslGeneratorImplTest,EmitVariable_Const)124 TEST_F(WgslGeneratorImplTest, EmitVariable_Const) {
125   auto* v = Const("a", ty.f32(), Expr(1.0f));
126   WrapInFunction(Decl(v));
127 
128   GeneratorImpl& gen = Build();
129 
130   std::stringstream out;
131   ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
132   EXPECT_EQ(out.str(), R"(let a : f32 = 1.0;)");
133 }
134 
135 }  // namespace
136 }  // namespace wgsl
137 }  // namespace writer
138 }  // namespace tint
139