[ast] Rename Builtin::kSampleId to Builtin::kSampleIndex

Other builtins use WGSL terms instead of SPIR-V terms too, and the
WGSL writer is relying on the output of `operator<<(Builtin)`, which
just stringifies the name of the enum. This also matches the
equivalent `semantic::Usage::kSampleIndex` enum.

Added test coverage for WGSL builtin generation.

Bug: tint:372
Change-Id: I8077d22c4a5ddf67b1ad07e7365453db74db8e7d
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/41660
Reviewed-by: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: James Price <jrprice@google.com>
diff --git a/src/ast/builtin.cc b/src/ast/builtin.cc
index 36dbb83..03a689e 100644
--- a/src/ast/builtin.cc
+++ b/src/ast/builtin.cc
@@ -59,8 +59,8 @@
       out << "global_invocation_id";
       break;
     }
-    case Builtin::kSampleId: {
-      out << "sample_id";
+    case Builtin::kSampleIndex: {
+      out << "sample_index";
       break;
     }
     case Builtin::kSampleMaskIn: {
diff --git a/src/ast/builtin.h b/src/ast/builtin.h
index 864cfb3..0305958 100644
--- a/src/ast/builtin.h
+++ b/src/ast/builtin.h
@@ -32,7 +32,7 @@
   kLocalInvocationId,
   kLocalInvocationIndex,
   kGlobalInvocationId,
-  kSampleId,
+  kSampleIndex,
   kSampleMaskIn,
   kSampleMaskOut,
 
diff --git a/src/reader/spirv/enum_converter.cc b/src/reader/spirv/enum_converter.cc
index 149e265..5694d92 100644
--- a/src/reader/spirv/enum_converter.cc
+++ b/src/reader/spirv/enum_converter.cc
@@ -87,7 +87,7 @@
     case SpvBuiltInGlobalInvocationId:
       return ast::Builtin::kGlobalInvocationId;
     case SpvBuiltInSampleId:
-      return ast::Builtin::kSampleId;
+      return ast::Builtin::kSampleIndex;
     case SpvBuiltInSampleMask:
       return sc == ast::StorageClass::kInput ? ast::Builtin::kSampleMaskIn
                                              : ast::Builtin::kSampleMaskOut;
diff --git a/src/reader/spirv/enum_converter_test.cc b/src/reader/spirv/enum_converter_test.cc
index bf34e62..2bcad74 100644
--- a/src/reader/spirv/enum_converter_test.cc
+++ b/src/reader/spirv/enum_converter_test.cc
@@ -225,7 +225,7 @@
         BuiltinCase{SpvBuiltInGlobalInvocationId, ast::StorageClass::kInput,
                     true, ast::Builtin::kGlobalInvocationId},
         BuiltinCase{SpvBuiltInSampleId, ast::StorageClass::kInput, true,
-                    ast::Builtin::kSampleId},
+                    ast::Builtin::kSampleIndex},
         BuiltinCase{SpvBuiltInSampleMask, ast::StorageClass::kInput, true,
                     ast::Builtin::kSampleMaskIn}));
 
diff --git a/src/reader/spirv/parser_impl_module_var_test.cc b/src/reader/spirv/parser_impl_module_var_test.cc
index 49e81c3..e22cb84 100644
--- a/src/reader/spirv/parser_impl_module_var_test.cc
+++ b/src/reader/spirv/parser_impl_module_var_test.cc
@@ -2062,7 +2062,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2104,7 +2104,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2146,7 +2146,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2213,7 +2213,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2252,7 +2252,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2301,7 +2301,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
@@ -2349,7 +2349,7 @@
   EXPECT_THAT(module_str, HasSubstr(R"(
   Variable{
     Decorations{
-      BuiltinDecoration{sample_id}
+      BuiltinDecoration{sample_index}
     }
     x_1
     in
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index f1d34e0..6ee2728 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -1776,7 +1776,7 @@
       return "SV_GroupIndex";
     case ast::Builtin::kGlobalInvocationId:
       return "SV_DispatchThreadID";
-    case ast::Builtin::kSampleId:
+    case ast::Builtin::kSampleIndex:
       return "SV_SampleIndex";
     case ast::Builtin::kSampleMaskIn:
       return "SV_Coverage";
diff --git a/src/writer/hlsl/generator_impl_test.cc b/src/writer/hlsl/generator_impl_test.cc
index 33d8f5b..0231793 100644
--- a/src/writer/hlsl/generator_impl_test.cc
+++ b/src/writer/hlsl/generator_impl_test.cc
@@ -96,7 +96,7 @@
         HlslBuiltinData{ast::Builtin::kLocalInvocationIndex, "SV_GroupIndex"},
         HlslBuiltinData{ast::Builtin::kGlobalInvocationId,
                         "SV_DispatchThreadID"},
-        HlslBuiltinData{ast::Builtin::kSampleId, "SV_SampleIndex"},
+        HlslBuiltinData{ast::Builtin::kSampleIndex, "SV_SampleIndex"},
         HlslBuiltinData{ast::Builtin::kSampleMaskIn, "SV_Coverage"},
         HlslBuiltinData{ast::Builtin::kSampleMaskOut, "SV_Coverage"}));
 
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 7fb6803..6732b0f 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1455,7 +1455,7 @@
       return "thread_index_in_threadgroup";
     case ast::Builtin::kGlobalInvocationId:
       return "thread_position_in_grid";
-    case ast::Builtin::kSampleId:
+    case ast::Builtin::kSampleIndex:
       return "sample_id";
     case ast::Builtin::kSampleMaskIn:
       return "sample_mask";
diff --git a/src/writer/msl/generator_impl_test.cc b/src/writer/msl/generator_impl_test.cc
index 4bce1d9..36067fc 100644
--- a/src/writer/msl/generator_impl_test.cc
+++ b/src/writer/msl/generator_impl_test.cc
@@ -120,7 +120,7 @@
                                    "thread_index_in_threadgroup"},
                     MslBuiltinData{ast::Builtin::kGlobalInvocationId,
                                    "thread_position_in_grid"},
-                    MslBuiltinData{ast::Builtin::kSampleId, "sample_id"},
+                    MslBuiltinData{ast::Builtin::kSampleIndex, "sample_id"},
                     MslBuiltinData{ast::Builtin::kSampleMaskIn, "sample_mask"},
                     MslBuiltinData{ast::Builtin::kSampleMaskOut,
                                    "sample_mask"}));
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index de8a747..6b545e3 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -3194,7 +3194,7 @@
       return SpvBuiltInGlobalInvocationId;
     case ast::Builtin::kPointSize:
       return SpvBuiltInPointSize;
-    case ast::Builtin::kSampleId:       // TODO(dneto)
+    case ast::Builtin::kSampleIndex:    // TODO(dneto)
     case ast::Builtin::kSampleMaskIn:   // TODO(dneto)
     case ast::Builtin::kSampleMaskOut:  // TODO(dneto)
     case ast::Builtin::kNone:
diff --git a/src/writer/wgsl/generator_impl_test.cc b/src/writer/wgsl/generator_impl_test.cc
index 3d684c9..8b25c28 100644
--- a/src/writer/wgsl/generator_impl_test.cc
+++ b/src/writer/wgsl/generator_impl_test.cc
@@ -18,7 +18,9 @@
 
 #include "gtest/gtest.h"
 #include "src/ast/function.h"
+#include "src/ast/variable.h"
 #include "src/program.h"
+#include "src/semantic/variable.h"
 #include "src/type/void_type.h"
 #include "src/writer/wgsl/test_helper.h"
 
@@ -41,6 +43,50 @@
 )");
 }
 
+struct WgslBuiltinData {
+  ast::Builtin builtin;
+  const char* attribute_name;
+};
+inline std::ostream& operator<<(std::ostream& out, WgslBuiltinData data) {
+  out << data.builtin;
+  return out;
+}
+using WgslBuiltinConversionTest = TestParamHelper<WgslBuiltinData>;
+TEST_P(WgslBuiltinConversionTest, Emit) {
+  auto params = GetParam();
+
+  auto* var = Global("a", ast::StorageClass::kNone, ty.f32(), nullptr,
+                     ast::VariableDecorationList{
+                         create<ast::BuiltinDecoration>(params.builtin),
+                     });
+
+  GeneratorImpl& gen = Build();
+
+  gen.EmitVariableDecorations(program->Sem().Get(var));
+
+  EXPECT_EQ(gen.result(),
+            "[[builtin(" + std::string(params.attribute_name) + ")]] ");
+}
+INSTANTIATE_TEST_SUITE_P(
+    WgslGeneratorImplTest,
+    WgslBuiltinConversionTest,
+    testing::Values(
+        WgslBuiltinData{ast::Builtin::kPosition, "position"},
+        WgslBuiltinData{ast::Builtin::kVertexIndex, "vertex_index"},
+        WgslBuiltinData{ast::Builtin::kInstanceIndex, "instance_index"},
+        WgslBuiltinData{ast::Builtin::kFrontFacing, "front_facing"},
+        WgslBuiltinData{ast::Builtin::kFragCoord, "frag_coord"},
+        WgslBuiltinData{ast::Builtin::kFragDepth, "frag_depth"},
+        WgslBuiltinData{ast::Builtin::kLocalInvocationId,
+                        "local_invocation_id"},
+        WgslBuiltinData{ast::Builtin::kLocalInvocationIndex,
+                        "local_invocation_index"},
+        WgslBuiltinData{ast::Builtin::kGlobalInvocationId,
+                        "global_invocation_id"},
+        WgslBuiltinData{ast::Builtin::kSampleIndex, "sample_index"},
+        WgslBuiltinData{ast::Builtin::kSampleMaskIn, "sample_mask_in"},
+        WgslBuiltinData{ast::Builtin::kSampleMaskOut, "sample_mask_out"}));
+
 }  // namespace
 }  // namespace wgsl
 }  // namespace writer
diff --git a/src/writer/wgsl/test_helper.h b/src/writer/wgsl/test_helper.h
index 8972784..14a69a2 100644
--- a/src/writer/wgsl/test_helper.h
+++ b/src/writer/wgsl/test_helper.h
@@ -43,16 +43,17 @@
     if (gen_) {
       return *gen_;
     }
-    program_ = std::make_unique<Program>(std::move(*this));
-    gen_ = std::make_unique<GeneratorImpl>(program_.get());
+    program = std::make_unique<Program>(std::move(*this));
+    gen_ = std::make_unique<GeneratorImpl>(program.get());
     return *gen_;
   }
 
   /// The type determiner
   TypeDeterminer td;
+  // The program built with a call to Build()
+  std::unique_ptr<Program> program;
 
  private:
-  std::unique_ptr<Program> program_;
   std::unique_ptr<GeneratorImpl> gen_;
 };
 using TestHelper = TestHelperBase<testing::Test>;