From 610a11ddf83957d2fccba1a0673666c85213397d Mon Sep 17 00:00:00 2001 From: Feifan He Date: Tue, 3 Dec 2024 00:06:32 +0800 Subject: [PATCH] vkd3d-shader/msl: Implement VKD3DSIH_IF and VKD3DSIH_ENDIF. --- libs/vkd3d-shader/msl.c | 31 +++++++++++++++++++++++++++ tests/hlsl/hard-copy-prop.shader_test | 12 +++++------ 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 385c713e..6df60e50 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -477,6 +477,31 @@ static void msl_cast(struct msl_generator *gen, const struct vkd3d_shader_instru msl_dst_cleanup(&dst, &gen->string_buffers); } +static void msl_if(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) +{ + const char *condition; + struct msl_src src; + + msl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0); + + msl_print_indent(gen->buffer, gen->indent); + condition = ins->flags == VKD3D_SHADER_CONDITIONAL_OP_NZ ? "bool" : "!bool"; + vkd3d_string_buffer_printf(gen->buffer, "if (%s(%s))\n", condition, src.str->buffer); + + msl_src_cleanup(&src, &gen->string_buffers); + + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "{\n"); + ++gen->indent; +} + +static void msl_endif(struct msl_generator *gen) +{ + --gen->indent; + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "}\n"); +} + static void msl_mov(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { struct msl_src src; @@ -549,6 +574,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_DP4: msl_dot(gen, ins, VKD3DSP_WRITEMASK_ALL); break; + case VKD3DSIH_ENDIF: + msl_endif(gen); + break; case VKD3DSIH_IEQ: msl_relop(gen, ins, "=="); break; @@ -567,6 +595,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_GEO: msl_relop(gen, ins, ">="); break; + case VKD3DSIH_IF: + msl_if(gen, ins); + break; case VKD3DSIH_LTO: msl_relop(gen, ins, "<"); break; diff --git a/tests/hlsl/hard-copy-prop.shader_test b/tests/hlsl/hard-copy-prop.shader_test index d6dbb055..f6dc08c5 100644 --- a/tests/hlsl/hard-copy-prop.shader_test +++ b/tests/hlsl/hard-copy-prop.shader_test @@ -17,10 +17,10 @@ float4 main() : sv_target [test] uniform 0 float 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (2.0, 2.0, 2.0, 2.0) uniform 0 float 1.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (-2.0, -2.0, -2.0, -2.0) @@ -43,10 +43,10 @@ float4 main() : sv_target [test] uniform 0 float 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (2.0, 2.0, 2.0, 2.0) uniform 0 float 1.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (20.0, 20.0, 20.0, 20.0) @@ -69,8 +69,8 @@ float4 main() : sv_target [test] uniform 0 float 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 4.0, 0.0, 0.0) uniform 0 float 1.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 40.0, 0.0, 0.0)