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