diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 22daf6f9c..948107886 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -774,6 +774,37 @@ static void msl_break(struct msl_generator *gen) vkd3d_string_buffer_printf(gen->buffer, "break;\n"); } +static void msl_switch(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) +{ + struct msl_src src; + + msl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0); + + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "switch (%s)\n", src.str->buffer); + msl_begin_block(gen); + + msl_src_cleanup(&src, &gen->string_buffers); +} + +static void msl_case(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) +{ + struct msl_src src; + + msl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0); + + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "case %s:\n", src.str->buffer); + + msl_src_cleanup(&src, &gen->string_buffers); +} + +static void msl_default(struct msl_generator *gen) +{ + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "default:\n"); +} + static void msl_ld(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { const struct msl_resource_type_info *resource_type_info; @@ -982,11 +1013,17 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_BREAK: msl_break(gen); break; + case VKD3DSIH_CASE: + msl_case(gen, ins); + break; case VKD3DSIH_DCL_INDEXABLE_TEMP: msl_dcl_indexable_temp(gen, ins); break; case VKD3DSIH_NOP: break; + case VKD3DSIH_DEFAULT: + msl_default(gen); + break; case VKD3DSIH_DIV: msl_binop(gen, ins, "/"); break; @@ -1004,6 +1041,7 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d break; case VKD3DSIH_ENDIF: case VKD3DSIH_ENDLOOP: + case VKD3DSIH_ENDSWITCH: msl_end_block(gen); break; case VKD3DSIH_EQO: @@ -1105,6 +1143,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_SQRT: msl_intrinsic(gen, ins, "sqrt"); break; + case VKD3DSIH_SWITCH: + msl_switch(gen, ins); + break; default: msl_unhandled(gen, ins); break; diff --git a/tests/hlsl/interface-packing.shader_test b/tests/hlsl/interface-packing.shader_test index 826e97d0b..172617771 100644 --- a/tests/hlsl/interface-packing.shader_test +++ b/tests/hlsl/interface-packing.shader_test @@ -115,7 +115,7 @@ float4 main(data input) : SV_Target [test] clear rtv 0 -1.0 -1.0 -1.0 -1.0 -todo(msl) draw triangle list 3 +draw triangle list 3 probe (0, 0) rgba ( 0.0, 0.0, 0.0, 0.0) probe (1, 0) rgba ( 1.0, 12.0, 13.0, 14.0) probe (2, 0) rgba ( 2.0, 15.0, 16.0, 22.0) diff --git a/tests/hlsl/switch.shader_test b/tests/hlsl/switch.shader_test index 9aa59175c..c2e553743 100644 --- a/tests/hlsl/switch.shader_test +++ b/tests/hlsl/switch.shader_test @@ -17,15 +17,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 3 0 0 0 if(sm>=4) uniform 0 uint4 3 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (4.0, 4.0, 4.0, 4.0) if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (3.0, 3.0, 3.0, 3.0) @@ -45,15 +45,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 3 0 0 0 if(sm>=4) uniform 0 uint4 3 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0) if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (5.0, 5.0, 5.0, 5.0) @@ -91,15 +91,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0) if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.0, 3.0, 4.0) @@ -127,11 +127,11 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) @@ -159,11 +159,11 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) [pixel shader fail(sm<4 | sm>=6) todo(sm<4)] @@ -188,10 +188,10 @@ float4 main() : sv_target [test] uniform 0 float4 2.0 0.0 0.0 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1) uniform 0 float4 1.0 0.0 0.0 0.0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) [pixel shader fail] @@ -390,15 +390,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.1, 2.1, 3.1, 4.1) if(sm<4) uniform 0 float4 1 0 0 0 if(sm>=4) uniform 0 uint4 1 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.2, 2.2, 3.2, 4.2) if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) % switch breaks within a loop @@ -431,7 +431,7 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0) @@ -464,15 +464,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0) if(sm<4) uniform 0 float4 2 0 0 0 if(sm>=4) uniform 0 uint4 2 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (2.0, 3.0, 4.0, 5.0) if(sm<4) uniform 0 float4 3 0 0 0 if(sm>=4) uniform 0 uint4 3 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0) @@ -505,15 +505,15 @@ float4 main() : sv_target [test] if(sm<4) uniform 0 float4 3 0 0 0 if(sm>=4) uniform 0 uint4 3 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) if(sm<4) uniform 0 float4 0 0 0 0 if(sm>=4) uniform 0 uint4 0 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (4.0, 5.0, 6.0, 7.0) if(sm<4) uniform 0 float4 5 0 0 0 if(sm>=4) uniform 0 uint4 5 0 0 0 -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) % 'continue' is not supported in switches