From b1e6dbe83f59a3f47a023f0884a55afc37612a7e Mon Sep 17 00:00:00 2001 From: Feifan He Date: Tue, 3 Dec 2024 00:31:48 +0800 Subject: [PATCH] vkd3d-shader/msl: Handle SV_IS_FRONT_FACE inputs. --- libs/vkd3d-shader/msl.c | 14 ++++++++++++++ tests/hlsl/is-front-face.shader_test | 4 ++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index e96ef366..ede35e98 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -802,6 +802,16 @@ static void msl_generate_input_struct_declarations(struct msl_generator *gen) if (e->sysval_semantic) { + if (e->sysval_semantic == 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; @@ -1016,6 +1026,10 @@ static void msl_generate_entrypoint_prologue(struct msl_generator *gen) 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); diff --git a/tests/hlsl/is-front-face.shader_test b/tests/hlsl/is-front-face.shader_test index be268b8a..06be3fb9 100644 --- a/tests/hlsl/is-front-face.shader_test +++ b/tests/hlsl/is-front-face.shader_test @@ -22,7 +22,7 @@ float4 main(bool face : sv_isfrontface) : sv_target } [test] -todo(msl) draw triangle strip 4 +draw triangle strip 4 probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) [vb 0] @@ -32,5 +32,5 @@ probe (0, 0, 640, 480) rgba (0.0, 1.0, 0.0, 1.0) 2.0 2.0 [test] -todo(msl) draw triangle strip 4 +draw triangle strip 4 probe (0, 0, 640, 480) rgba (1.0, 2.0, 1.0, 2.0)