From 67dd1d2b0cbd1935b7f32f4bb1ab0a54c269d8a4 Mon Sep 17 00:00:00 2001
From: Feifan He <feifan@codeweavers.com>
Date: Fri, 22 Nov 2024 15:45:54 +0800
Subject: [PATCH] vkd3d-shader/msl: Handle the VKD3DSIM_LINEAR interpolation
 modifier on inputs.

---
 libs/vkd3d-shader/msl.c                      | 19 ++++++++++++-------
 tests/hlsl/entry-point-semantics.shader_test | 20 ++++++++++----------
 tests/hlsl/fog.shader_test                   |  2 +-
 tests/hlsl/interface-packing.shader_test     |  2 +-
 tests/hlsl/struct-semantics.shader_test      |  2 +-
 tests/hlsl/vertex-shader-ops.shader_test     |  8 ++++----
 tests/shader_runner_metal.m                  |  4 ++++
 7 files changed, 33 insertions(+), 24 deletions(-)

diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c
index 57d01a10..2554e8de 100644
--- a/libs/vkd3d-shader/msl.c
+++ b/libs/vkd3d-shader/msl.c
@@ -768,13 +768,6 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
             continue;
         }
 
-        if (e->interpolation_mode != VKD3DSIM_NONE)
-        {
-            msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
-                    "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
-            continue;
-        }
-
         if(e->register_count > 1)
         {
             msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
@@ -818,6 +811,18 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen)
                 break;
         }
 
+        switch (e->interpolation_mode)
+        {
+            /* The default interpolation attribute. */
+            case VKD3DSIM_LINEAR:
+            case VKD3DSIM_NONE:
+                break;
+            default:
+                msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
+                        "Internal compiler error: Unhandled interpolation mode %#x.", e->interpolation_mode);
+                break;
+        }
+
         vkd3d_string_buffer_printf(buffer, ";\n");
     }
 
diff --git a/tests/hlsl/entry-point-semantics.shader_test b/tests/hlsl/entry-point-semantics.shader_test
index ccf9f423..ac25dd58 100644
--- a/tests/hlsl/entry-point-semantics.shader_test
+++ b/tests/hlsl/entry-point-semantics.shader_test
@@ -36,7 +36,7 @@ float4 main(float tex : texcoord) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
 
 [pixel shader fail(sm>=6)]
@@ -46,7 +46,7 @@ float4 main(float tex : texcoord) : semantic : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
 
 [pixel shader]
@@ -59,7 +59,7 @@ float4 main(float tex : texcoord) : sv_target
 float4 main(float tex : bogus) : bogus;
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
 
 
@@ -95,7 +95,7 @@ float4 main(in apple a) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (10.0, 20.0, 30.0, 40.0)
 
 
@@ -112,7 +112,7 @@ float4 main(in apple a) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (10.0, 11.0, 30.0, 31.0)
 
 
@@ -136,7 +136,7 @@ float4 main(in apple aps[2][2]) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (10.0, 10.0, 20.0, 20.0)
 
 
@@ -158,7 +158,7 @@ float4 main(in banana bans[2]) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 todo(sm>=6) probe (0, 0) rgba (10.0, 11.0, 20.0, 21.0)
 
 
@@ -222,7 +222,7 @@ float4 main(in float4 tex0 : TEXCOORD0, in float4 tex1 : TEXCOORD1) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (1.0, 2.0, 10.0, 20.0)
 
 
@@ -285,7 +285,7 @@ float4 main(in float4 t1 : TEXCOORD0, in float4 t2 : TEXCOORD0) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 todo(sm>=6) probe (0, 0) rgba (99.0, 99.0, 10.0, 11.0)
 
 
@@ -297,7 +297,7 @@ float4 main(in float4 a : TEXCOORD0, in float3 b : TEXCOORD1) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (10.0, 11.0, 20.0, 21.0)
 
 
diff --git a/tests/hlsl/fog.shader_test b/tests/hlsl/fog.shader_test
index e5ce6eef..71539d0a 100644
--- a/tests/hlsl/fog.shader_test
+++ b/tests/hlsl/fog.shader_test
@@ -25,7 +25,7 @@ float4 main(float2 fog : fog) : sv_target
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.1, 0.2, 0, 1)
 
 
diff --git a/tests/hlsl/interface-packing.shader_test b/tests/hlsl/interface-packing.shader_test
index 06301625..b5d3c31c 100644
--- a/tests/hlsl/interface-packing.shader_test
+++ b/tests/hlsl/interface-packing.shader_test
@@ -14,7 +14,7 @@ float4 main(float2 color_xy : COLOR0, float2 color_zw : COLOR1) : SV_TARGET
 }
 
 [test]
-todo(msl) draw quad
+draw quad
 probe(320, 240) rgba(0.25, 0.5, 0.75, 1.0)
 
 % Test handling of arrays in interface blocks
diff --git a/tests/hlsl/struct-semantics.shader_test b/tests/hlsl/struct-semantics.shader_test
index 6a028d5a..f51e95e7 100644
--- a/tests/hlsl/struct-semantics.shader_test
+++ b/tests/hlsl/struct-semantics.shader_test
@@ -59,5 +59,5 @@ struct output main(struct input i)
 }
 
 [test]
-todo(msl) draw triangle strip 4
+draw triangle strip 4
 probe (0, 0) rgba (0.0, 1.0, 0.0, 1.0)
diff --git a/tests/hlsl/vertex-shader-ops.shader_test b/tests/hlsl/vertex-shader-ops.shader_test
index 8d2c0821..a6891eae 100644
--- a/tests/hlsl/vertex-shader-ops.shader_test
+++ b/tests/hlsl/vertex-shader-ops.shader_test
@@ -75,12 +75,12 @@ void main(out float4 res : COLOR1, in float4 pos : position, out float4 out_pos
 if(sm<4)  uniform 0 float 0
 if(sm<4)  uniform 4 float 2
 if(sm>=4) uniform 0 int4 0 2 0 0
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.0, 1.0, 0.0, 1.0)
 if(sm<4)  uniform 0 float -2
 if(sm<4)  uniform 4 float 8
 if(sm>=4) uniform 0 int4 -2 8 0 0
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0)
 
 
@@ -103,11 +103,11 @@ if(sm<4)  uniform 0 float 0
 if(sm<4)  uniform 4 float 100
 if(sm<4)  uniform 8 float 200
 if(sm>=4) uniform 0 int4 0 100 200 0
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2)
 if(sm<4)  uniform 0 float -4
 if(sm<4)  uniform 4 float 100
 if(sm<4)  uniform 8 float 200
 if(sm>=4) uniform 0 int4 -4 100 200 0
-todo(msl) draw quad
+draw quad
 probe (0, 0) rgba (0.1, 0.1, 0.1, 0.1)
diff --git a/tests/shader_runner_metal.m b/tests/shader_runner_metal.m
index 41d77c27..70c9a6ed 100644
--- a/tests/shader_runner_metal.m
+++ b/tests/shader_runner_metal.m
@@ -81,6 +81,8 @@ static MTLVertexFormat get_metal_attribute_format(DXGI_FORMAT format)
 {
     switch (format)
     {
+        case DXGI_FORMAT_R32G32B32A32_FLOAT:
+            return MTLVertexFormatFloat4;
         case DXGI_FORMAT_R32G32_FLOAT:
             return MTLVertexFormatFloat2;
         default:
@@ -94,6 +96,8 @@ static MTLPrimitiveType get_metal_primitive_type(D3D_PRIMITIVE_TOPOLOGY topology
     {
         case D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST:
             return MTLPrimitiveTypeTriangle;
+        case D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP:
+            return MTLPrimitiveTypeTriangleStrip;
 
         default:
             fatal_error("Unhandled topology %#x.\n", topology);