[wgsl-writer] Emit decorations on function parameters
This is needed to correctly generate entry point IO parameters.
Bug: tint:576
Change-Id: I9b96886d5ea90a54a568dd36506da563227afde7
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/44082
Commit-Queue: James Price <jrprice@google.com>
Auto-Submit: James Price <jrprice@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index dbe65f3..eefba24 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -307,6 +307,17 @@
}
first = false;
+ for (auto* deco : v->decorations()) {
+ out_ << "[[";
+ if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
+ out_ << "builtin(" << builtin->value() << ")";
+ }
+ if (auto* location = deco->As<ast::LocationDecoration>()) {
+ out_ << "location(" << location->value() << ")";
+ }
+ out_ << "]] ";
+ }
+
out_ << program_->Symbols().NameFor(v->symbol()) << " : ";
if (!EmitType(v->type())) {
diff --git a/src/writer/wgsl/generator_impl_function_test.cc b/src/writer/wgsl/generator_impl_function_test.cc
index 7fd4574..dfc99cf 100644
--- a/src/writer/wgsl/generator_impl_function_test.cc
+++ b/src/writer/wgsl/generator_impl_function_test.cc
@@ -143,6 +143,30 @@
)");
}
+TEST_F(WgslGeneratorImplTest, Emit_Function_EntryPoint_Parameters) {
+ auto* vec4 = ty.vec4<f32>();
+ auto* coord = Var("coord", vec4, ast::StorageClass::kInput, nullptr,
+ {create<ast::BuiltinDecoration>(ast::Builtin::kFragCoord)});
+ auto* loc1 = Var("loc1", ty.f32(), ast::StorageClass::kInput, nullptr,
+ {create<ast::LocationDecoration>(1u)});
+ auto* func =
+ Func("frag_main", ast::VariableList{coord, loc1}, ty.void_(),
+ ast::StatementList{},
+ ast::FunctionDecorationList{
+ create<ast::StageDecoration>(ast::PipelineStage::kFragment),
+ });
+
+ GeneratorImpl& gen = Build();
+
+ gen.increment_indent();
+
+ ASSERT_TRUE(gen.EmitFunction(func));
+ EXPECT_EQ(gen.result(), R"( [[stage(fragment)]]
+ fn frag_main([[builtin(frag_coord)]] coord : vec4<f32>, [[location(1)]] loc1 : f32) -> void {
+ }
+)");
+}
+
// https://crbug.com/tint/297
TEST_F(WgslGeneratorImplTest,
Emit_Function_Multiple_EntryPoint_With_Same_ModuleVar) {