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);