tint/writer/wgsl: Emit 'const' variables
Bug: tint:1580
Change-Id: Iea2a38814757f79ba645c94cfa89fe84b5d200d1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/94681
Reviewed-by: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/writer/wgsl/generator_impl.cc b/src/tint/writer/wgsl/generator_impl.cc
index 7df4fdf..a448827 100644
--- a/src/tint/writer/wgsl/generator_impl.cc
+++ b/src/tint/writer/wgsl/generator_impl.cc
@@ -645,14 +645,6 @@
bool ok = Switch(
v, //
- [&](const ast::Let* ) {
- out << "let";
- return true;
- },
- [&](const ast::Override* ) {
- out << "override";
- return true;
- },
[&](const ast::Var* var) {
out << "var";
auto sc = var->declared_storage_class;
@@ -669,6 +661,18 @@
}
return true;
},
+ [&](const ast::Let*) {
+ out << "let";
+ return true;
+ },
+ [&](const ast::Override*) {
+ out << "override";
+ return true;
+ },
+ [&](const ast::Const*) {
+ out << "const";
+ return true;
+ },
[&](Default) {
TINT_ICE(Writer, diagnostics_) << "unhandled variable type " << v->TypeInfo().name;
return false;
diff --git a/src/tint/writer/wgsl/generator_impl_global_decl_test.cc b/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
index dfad2a9..19ff7d7 100644
--- a/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_global_decl_test.cc
@@ -131,6 +131,36 @@
EXPECT_EQ(gen.result(), " @group(0) @binding(0) var t : texture_1d<f32>;\n");
}
+TEST_F(WgslGeneratorImplTest, Emit_GlobalLet) {
+ GlobalLet("explicit", ty.f32(), Expr(1_f));
+ GlobalLet("inferred", nullptr, Expr(1_f));
+
+ GeneratorImpl& gen = Build();
+
+ gen.increment_indent();
+
+ ASSERT_TRUE(gen.Generate()) << gen.error();
+ EXPECT_EQ(gen.result(), R"( let explicit : f32 = 1.0f;
+
+ let inferred = 1.0f;
+)");
+}
+
+TEST_F(WgslGeneratorImplTest, Emit_GlobalConst) {
+ GlobalConst("explicit", ty.f32(), Expr(1_f));
+ GlobalConst("inferred", nullptr, Expr(1_f));
+
+ GeneratorImpl& gen = Build();
+
+ gen.increment_indent();
+
+ ASSERT_TRUE(gen.Generate()) << gen.error();
+ EXPECT_EQ(gen.result(), R"( const explicit : f32 = 1.0f;
+
+ const inferred = 1.0f;
+)");
+}
+
TEST_F(WgslGeneratorImplTest, Emit_OverridableConstants) {
Override("a", ty.f32(), nullptr);
Override("b", ty.f32(), nullptr, {Id(7u)});
diff --git a/src/tint/writer/wgsl/generator_impl_variable_test.cc b/src/tint/writer/wgsl/generator_impl_variable_test.cc
index 9a8775d..a117459 100644
--- a/src/tint/writer/wgsl/generator_impl_variable_test.cc
+++ b/src/tint/writer/wgsl/generator_impl_variable_test.cc
@@ -111,9 +111,9 @@
EXPECT_EQ(out.str(), R"(var<private> a : f32 = 1.0f;)");
}
-TEST_F(WgslGeneratorImplTest, EmitVariable_Const) {
+TEST_F(WgslGeneratorImplTest, EmitVariable_Let_Explicit) {
auto* v = Let("a", ty.f32(), Expr(1_f));
- WrapInFunction(Decl(v));
+ WrapInFunction(v);
GeneratorImpl& gen = Build();
@@ -122,5 +122,38 @@
EXPECT_EQ(out.str(), R"(let a : f32 = 1.0f;)");
}
+TEST_F(WgslGeneratorImplTest, EmitVariable_Let_Inferred) {
+ auto* v = Let("a", nullptr, Expr(1_f));
+ WrapInFunction(v);
+
+ GeneratorImpl& gen = Build();
+
+ std::stringstream out;
+ ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
+ EXPECT_EQ(out.str(), R"(let a = 1.0f;)");
+}
+
+TEST_F(WgslGeneratorImplTest, EmitVariable_Const_Explicit) {
+ auto* v = Const("a", ty.f32(), Expr(1_f));
+ WrapInFunction(v);
+
+ GeneratorImpl& gen = Build();
+
+ std::stringstream out;
+ ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
+ EXPECT_EQ(out.str(), R"(const a : f32 = 1.0f;)");
+}
+
+TEST_F(WgslGeneratorImplTest, EmitVariable_Const_Inferred) {
+ auto* v = Const("a", nullptr, Expr(1_f));
+ WrapInFunction(v);
+
+ GeneratorImpl& gen = Build();
+
+ std::stringstream out;
+ ASSERT_TRUE(gen.EmitVariable(out, v)) << gen.error();
+ EXPECT_EQ(out.str(), R"(const a = 1.0f;)");
+}
+
} // namespace
} // namespace tint::writer::wgsl