[msl] Add polyfill for textureSampleCompareLevel

Add MSL member function definitions for `sample_compare()` with
explicit LOD.

The WGSL function does not actually take a LOD argument and implicitly
samples from level 0, so we have to insert a new argument for this
one.

Bug: 42251016
Change-Id: I4e25b327f9629344f33131d142bad202aa106255
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/193661
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/test/tint/builtins/gen/var/textureSampleCompareLevel/2ad2b1.wgsl.expected.ir.msl b/test/tint/builtins/gen/var/textureSampleCompareLevel/2ad2b1.wgsl.expected.ir.msl
index 50be548..c998df3 100644
--- a/test/tint/builtins/gen/var/textureSampleCompareLevel/2ad2b1.wgsl.expected.ir.msl
+++ b/test/tint/builtins/gen/var/textureSampleCompareLevel/2ad2b1.wgsl.expected.ir.msl
@@ -1,49 +1,43 @@
-SKIP: FAILED
+#include <metal_stdlib>
+using namespace metal;
+struct tint_module_vars_struct {
+  depth2d<float, access::sample> arg_0;
+  sampler arg_1;
+  device float* prevent_dce;
+};
+struct VertexOutput {
+  float4 pos;
+  float prevent_dce;
+};
+struct vertex_main_outputs {
+  float4 VertexOutput_pos [[position]];
+  float VertexOutput_prevent_dce [[user(locn0)]] [[flat]];
+};
 
-../../src/tint/lang/msl/writer/printer/printer.cc:500 internal compiler error: $B1: {  # root
-  %arg_0:ptr<handle, texture_depth_2d, read> = var @binding_point(1, 0)
-  %arg_1:ptr<handle, sampler_comparison, read> = var @binding_point(1, 1)
-  %prevent_dce:ptr<storage, f32, read_write> = var @binding_point(2, 0)
+float textureSampleCompareLevel_2ad2b1(tint_module_vars_struct tint_module_vars) {
+  float2 arg_2 = float2(1.0f);
+  float arg_3 = 1.0f;
+  float2 const v = arg_2;
+  float const v_1 = arg_3;
+  float res = tint_module_vars.arg_0.sample_compare(tint_module_vars.arg_1, v, v_1, level(0u));
+  return res;
 }
-
-%textureSampleCompareLevel_2ad2b1 = func():void {
-  $B2: {
-    %arg_2:ptr<function, vec2<f32>, read_write> = var, vec2<f32>(1.0f)
-    %arg_3:ptr<function, f32, read_write> = var, 1.0f
-    %7:texture_depth_2d = load %arg_0
-    %8:sampler_comparison = load %arg_1
-    %9:vec2<f32> = load %arg_2
-    %10:f32 = load %arg_3
-    %11:f32 = textureSampleCompareLevel %7, %8, %9, %10
-    %res:ptr<function, f32, read_write> = var, %11
-    %13:f32 = load %res
-    store %prevent_dce, %13
-    ret
-  }
+fragment void fragment_main(depth2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]], device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1, .prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = textureSampleCompareLevel_2ad2b1(tint_module_vars);
 }
-%vertex_main = @vertex func():vec4<f32> [@position] {
-  $B3: {
-    %15:void = call %textureSampleCompareLevel_2ad2b1
-    ret vec4<f32>(0.0f)
-  }
+kernel void compute_main(depth2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]], device float* prevent_dce [[buffer(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1, .prevent_dce=prevent_dce};
+  (*tint_module_vars.prevent_dce) = textureSampleCompareLevel_2ad2b1(tint_module_vars);
 }
-%fragment_main = @fragment func():void {
-  $B4: {
-    %17:void = call %textureSampleCompareLevel_2ad2b1
-    ret
-  }
+VertexOutput vertex_main_inner(tint_module_vars_struct tint_module_vars) {
+  VertexOutput out = {};
+  out.pos = float4(0.0f);
+  out.prevent_dce = textureSampleCompareLevel_2ad2b1(tint_module_vars);
+  return out;
 }
-%compute_main = @compute @workgroup_size(1, 1, 1) func():void {
-  $B5: {
-    %19:void = call %textureSampleCompareLevel_2ad2b1
-    ret
-  }
+vertex vertex_main_outputs vertex_main(depth2d<float, access::sample> arg_0 [[texture(0)]], sampler arg_1 [[sampler(0)]]) {
+  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.arg_0=arg_0, .arg_1=arg_1};
+  VertexOutput const v_2 = vertex_main_inner(tint_module_vars);
+  return vertex_main_outputs{.VertexOutput_pos=v_2.pos, .VertexOutput_prevent_dce=v_2.prevent_dce};
 }
-
-unhandled variable address space
-********************************************************************
-*  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.  *
-********************************************************************