From e948098ae3fef3c1a8357629b0e93c367395163a Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Mon, 19 May 2025 00:19:02 +0200 Subject: [PATCH] vkd3d-shader/msl: Handle SV_POSITION inputs. --- libs/vkd3d-shader/msl.c | 66 +++++++++++++++--------- tests/hlsl/interface-packing.shader_test | 2 +- tests/hlsl/object-references.shader_test | 2 +- tests/hlsl/pixel-position.shader_test | 2 +- tests/hlsl/texture-load.shader_test | 4 +- 5 files changed, 48 insertions(+), 28 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index c92e29fa6..649e01709 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -1046,21 +1046,31 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen) if (e->target_location == SIGNATURE_TARGET_LOCATION_UNUSED) continue; - if (e->sysval_semantic) + switch (e->sysval_semantic) { - if (e->sysval_semantic == VKD3D_SHADER_SV_IS_FRONT_FACE) - { + case VKD3D_SHADER_SV_NONE: + break; + + case VKD3D_SHADER_SV_POSITION: + if (type != VKD3D_SHADER_TYPE_PIXEL) + msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, + "Internal compiler error: Unhandled SV_POSITION in shader type #%x.", type); + msl_print_indent(gen->buffer, 1); + vkd3d_string_buffer_printf(buffer, "float4 position [[position]];\n"); + continue; + + case VKD3D_SHADER_SV_IS_FRONT_FACE: if (type != VKD3D_SHADER_TYPE_PIXEL) msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, "Internal compiler error: Unhandled SV_IS_FRONT_FACE in shader type #%x.", type); - msl_print_indent(gen->buffer, 1); vkd3d_string_buffer_printf(buffer, "bool is_front_face [[front_facing]];\n"); continue; - } - msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, - "Internal compiler error: Unhandled system value %#x.", e->sysval_semantic); - continue; + + default: + msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, + "Internal compiler error: Unhandled system value %#x.", e->sysval_semantic); + continue; } if (e->min_precision != VKD3D_SHADER_MINIMUM_PRECISION_NONE) @@ -1265,23 +1275,33 @@ static void msl_generate_entrypoint_prologue(struct msl_generator *gen) continue; vkd3d_string_buffer_printf(buffer, " %s_in[%u]", gen->prefix, e->register_index); - if (e->sysval_semantic == VKD3D_SHADER_SV_NONE) + switch (e->sysval_semantic) { - msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type)); - msl_print_write_mask(buffer, e->mask); - vkd3d_string_buffer_printf(buffer, " = input.shader_in_%u", i); - msl_print_write_mask(buffer, e->mask); - } - else if (e->sysval_semantic == VKD3D_SHADER_SV_IS_FRONT_FACE) - { - vkd3d_string_buffer_printf(buffer, ".u = uint4(input.is_front_face ? 0xffffffffu : 0u, 0, 0, 0)"); - } - else - { - vkd3d_string_buffer_printf(buffer, " = ", e->sysval_semantic); - msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, - "Internal compiler error: Unhandled system value %#x input.", e->sysval_semantic); + case VKD3D_SHADER_SV_NONE: + msl_print_register_datatype(buffer, gen, vkd3d_data_type_from_component_type(e->component_type)); + msl_print_write_mask(buffer, e->mask); + vkd3d_string_buffer_printf(buffer, " = input.shader_in_%u", i); + break; + + case VKD3D_SHADER_SV_POSITION: + msl_print_register_datatype(buffer, gen, VKD3D_DATA_FLOAT); + msl_print_write_mask(buffer, e->mask); + vkd3d_string_buffer_printf(buffer, " = float4(input.position.xyz, 1.0f / input.position.w)"); + break; + + case VKD3D_SHADER_SV_IS_FRONT_FACE: + msl_print_register_datatype(buffer, gen, VKD3D_DATA_UINT); + msl_print_write_mask(buffer, e->mask); + vkd3d_string_buffer_printf(buffer, " = uint4(input.is_front_face ? 0xffffffffu : 0u, 0, 0, 0)"); + break; + + default: + vkd3d_string_buffer_printf(buffer, " = ", e->sysval_semantic); + msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, + "Internal compiler error: Unhandled system value %#x input.", e->sysval_semantic); + break; } + msl_print_write_mask(buffer, e->mask); vkd3d_string_buffer_printf(buffer, ";\n"); } } diff --git a/tests/hlsl/interface-packing.shader_test b/tests/hlsl/interface-packing.shader_test index b5d3c31cb..5707f1cca 100644 --- a/tests/hlsl/interface-packing.shader_test +++ b/tests/hlsl/interface-packing.shader_test @@ -158,5 +158,5 @@ float4 main(float4 pos : SV_Position, float4 color : COLOR) : SV_Target } [test] -todo(msl) draw triangle list 3 +draw triangle list 3 probe (0, 0) rgba(1.0, 10.0, 11.0, 4.0) diff --git a/tests/hlsl/object-references.shader_test b/tests/hlsl/object-references.shader_test index 51d54cd8c..d09deed3d 100644 --- a/tests/hlsl/object-references.shader_test +++ b/tests/hlsl/object-references.shader_test @@ -73,7 +73,7 @@ float4 main(float4 pos : sv_position) : sv_target } [test] -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8) probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1) diff --git a/tests/hlsl/pixel-position.shader_test b/tests/hlsl/pixel-position.shader_test index eb2e1d34f..a2d997adf 100644 --- a/tests/hlsl/pixel-position.shader_test +++ b/tests/hlsl/pixel-position.shader_test @@ -21,7 +21,7 @@ float4 main(float4 pos : sv_position) : sv_target [test] clear rtv 0 0.0 0.0 0.0 0.0 -todo(msl) draw triangle strip 4 +draw triangle strip 4 probe ( 80, 140) rgba( 0.0, 0.0, 0.0, 0.0) probe ( 80, 420) rgba( 80.5, 420.5, 0.100678146, 1.229981) 192 probe (180, 140) rgba(180.5, 140.5, 0.077760354, 1.918082) 192 diff --git a/tests/hlsl/texture-load.shader_test b/tests/hlsl/texture-load.shader_test index ad0dc3b1e..06271b011 100644 --- a/tests/hlsl/texture-load.shader_test +++ b/tests/hlsl/texture-load.shader_test @@ -15,7 +15,7 @@ float4 main(float4 pos : sv_position) : sv_target } [test] -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (1, 0) rgba (0.5, 0.7, 0.6, 0.8) probe (0, 1) rgba (0.6, 0.5, 0.2, 0.1) @@ -30,7 +30,7 @@ float4 main(float4 pos : sv_position) : sv_target } [test] -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) probe (1, 0) rgba (0.6, 0.5, 0.2, 0.1) probe (0, 1) rgba (0.5, 0.7, 0.6, 0.8)