[ir][msl] Add support for fragment inputs

Add support for the `FrontFacing`, `Position`, `SampleId`, and
`SampleMask` entry point attributes.

Bug: tint:1967
Change-Id: If03128900e4a6903ed6aeed0bba40db273e8337c
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/162824
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
diff --git a/src/tint/lang/msl/writer/printer/printer.cc b/src/tint/lang/msl/writer/printer/printer.cc
index 283d974..2440bcd 100644
--- a/src/tint/lang/msl/writer/printer/printer.cc
+++ b/src/tint/lang/msl/writer/printer/printer.cc
@@ -263,6 +263,9 @@
                 if (param->Builtin().has_value()) {
                     out << " [[";
                     switch (param->Builtin().value()) {
+                        case core::ir::FunctionParam::Builtin::kFrontFacing:
+                            out << "front_facing";
+                            break;
                         case core::ir::FunctionParam::Builtin::kGlobalInvocationId:
                             out << "thread_position_in_grid";
                             break;
@@ -275,6 +278,15 @@
                         case core::ir::FunctionParam::Builtin::kNumWorkgroups:
                             out << "threadgroups_per_grid";
                             break;
+                        case core::ir::FunctionParam::Builtin::kPosition:
+                            out << "position";
+                            break;
+                        case core::ir::FunctionParam::Builtin::kSampleIndex:
+                            out << "sample_id";
+                            break;
+                        case core::ir::FunctionParam::Builtin::kSampleMask:
+                            out << "sample_mask";
+                            break;
                         case core::ir::FunctionParam::Builtin::kWorkgroupId:
                             out << "threadgroup_position_in_grid";
                             break;
diff --git a/test/tint/types/functions/shader_io/fragment_input_builtins.wgsl.expected.ir.msl b/test/tint/types/functions/shader_io/fragment_input_builtins.wgsl.expected.ir.msl
index 567c382..82e9f26 100644
--- a/test/tint/types/functions/shader_io/fragment_input_builtins.wgsl.expected.ir.msl
+++ b/test/tint/types/functions/shader_io/fragment_input_builtins.wgsl.expected.ir.msl
@@ -1,9 +1,9 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
 
-<dawn>/src/tint/lang/msl/writer/printer/printer.cc:270 internal compiler error: Switch() matched no cases. Type: tint::core::ir::FunctionParam
-********************************************************************
-*  The tint shader compiler has encountered an unexpected error.   *
-*                                                                  *
-*  Please help us fix this issue by submitting a bug report at     *
-*  crbug.com/tint with the source program that triggered the bug.  *
-********************************************************************
+fragment void tint_symbol(float4 position [[position]], bool front_facing [[front_facing]], uint sample_index [[sample_id]], uint sample_mask [[sample_mask]]) {
+  if (front_facing) {
+    float4 const foo = position;
+    uint const bar = (sample_index + sample_mask);
+  }
+}