From ebf582854234a11b0986c9b0e29625bd70eea3de Mon Sep 17 00:00:00 2001 From: Feifan He Date: Tue, 3 Dec 2024 00:58:19 +0800 Subject: [PATCH] vkd3d-shader/msl: Implement VKD3DSIH_ELSE. --- libs/vkd3d-shader/msl.c | 30 ++++++++++++++++++++------ tests/hlsl/conditional.shader_test | 12 +++++------ tests/hlsl/function-return.shader_test | 8 +++---- tests/hlsl/return.shader_test | 8 +++---- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index f7261654..8e1fc3da 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -486,6 +486,20 @@ static void msl_cast(struct msl_generator *gen, const struct vkd3d_shader_instru msl_dst_cleanup(&dst, &gen->string_buffers); } +static void msl_end_block(struct msl_generator *gen) +{ + --gen->indent; + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "}\n"); +} + +static void msl_begin_block(struct msl_generator *gen) +{ + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "{\n"); + ++gen->indent; +} + static void msl_if(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { const char *condition; @@ -499,16 +513,15 @@ static void msl_if(struct msl_generator *gen, const struct vkd3d_shader_instruct msl_src_cleanup(&src, &gen->string_buffers); - msl_print_indent(gen->buffer, gen->indent); - vkd3d_string_buffer_printf(gen->buffer, "{\n"); - ++gen->indent; + msl_begin_block(gen); } -static void msl_endif(struct msl_generator *gen) +static void msl_else(struct msl_generator *gen) { - --gen->indent; + msl_end_block(gen); msl_print_indent(gen->buffer, gen->indent); - vkd3d_string_buffer_printf(gen->buffer, "}\n"); + vkd3d_string_buffer_printf(gen->buffer, "else\n"); + msl_begin_block(gen); } static void msl_unary_op(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op) @@ -598,8 +611,11 @@ 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_ELSE: + msl_else(gen); + break; case VKD3DSIH_ENDIF: - msl_endif(gen); + msl_end_block(gen); break; case VKD3DSIH_IEQ: msl_relop(gen, ins, "=="); diff --git a/tests/hlsl/conditional.shader_test b/tests/hlsl/conditional.shader_test index 5385e291..c8aad32e 100644 --- a/tests/hlsl/conditional.shader_test +++ b/tests/hlsl/conditional.shader_test @@ -11,10 +11,10 @@ float4 main() : sv_target [test] uniform 0 float4 0.0 0.0 0.0 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) uniform 0 float4 0.1 0.0 0.0 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader todo(sm<4)] @@ -43,7 +43,7 @@ float4 main() : sv_target [test] uniform 0 float4 0.0 0.0 0.0 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) [pixel shader fail(sm<6)] @@ -108,7 +108,7 @@ float4 main() : sv_target [test] uniform 0 float4 0.0 0.0 0.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.9, 0.8, 0.7, 0.6) [pixel shader] @@ -209,13 +209,13 @@ if(sm<4) uniform 0 float -3 if(sm<4) uniform 4 float -2 if(sm>=4) uniform 0 int -3 if(sm>=4) uniform 1 int -2 -todo(msl) draw quad +draw quad probe (0, 0) rgba (-1.0, -1.0, -1.0, -1.0) if(sm<4) uniform 0 float 4 if(sm<4) uniform 4 float 4 if(sm>=4) uniform 0 int 4 if(sm>=4) uniform 1 int 4 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 1.0, 1.0, 1.0) diff --git a/tests/hlsl/function-return.shader_test b/tests/hlsl/function-return.shader_test index 051c9edf..8a3f3100 100644 --- a/tests/hlsl/function-return.shader_test +++ b/tests/hlsl/function-return.shader_test @@ -79,16 +79,16 @@ float4 main() : sv_target [test] uniform 0 float 0.1 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.3, 0.2, 0.6, 0.3) 1 uniform 0 float 0.4 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.6, 0.5, 0.6, 0.3) 1 uniform 0 float 0.6 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.6, 0.5, 0.4, 0.5) 1 uniform 0 float 0.8 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.8, 0.7, 0.4, 0.5) 1 [pixel shader todo(sm<4)] diff --git a/tests/hlsl/return.shader_test b/tests/hlsl/return.shader_test index 10249fbf..055ac13a 100644 --- a/tests/hlsl/return.shader_test +++ b/tests/hlsl/return.shader_test @@ -63,10 +63,10 @@ void main(out float4 ret : sv_target) [test] uniform 0 float 0.2 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.3, 0.4, 0.5, 0.6) uniform 0 float 0.8 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.1, 0.2, 0.3, 0.4) [pixel shader todo(sm<4)] @@ -204,10 +204,10 @@ void main(out float4 ret : sv_target) [test] uniform 0 float 0.2 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.2, 0.2, 0.2, 0.2) uniform 0 float 0.8 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (0.5, 0.5, 0.5, 0.5) [pixel shader todo(sm<4)]