From 79be1d3051e7e0b4fb78b64ea60834697ca864c0 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Fri, 23 May 2025 15:45:11 +0200 Subject: [PATCH] vkd3d-shader/msl: Implement loops. --- libs/vkd3d-shader/msl.c | 20 ++++++++++++++++++++ tests/hlsl/loop.shader_test | 6 +++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index ecf0f6c3e..22daf6f9c 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -761,6 +761,19 @@ static void msl_else(struct msl_generator *gen) msl_begin_block(gen); } +static void msl_loop(struct msl_generator *gen) +{ + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "for (;;)\n"); + msl_begin_block(gen); +} + +static void msl_break(struct msl_generator *gen) +{ + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "break;\n"); +} + static void msl_ld(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { const struct msl_resource_type_info *resource_type_info; @@ -966,6 +979,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_AND: msl_binop(gen, ins, "&"); break; + case VKD3DSIH_BREAK: + msl_break(gen); + break; case VKD3DSIH_DCL_INDEXABLE_TEMP: msl_dcl_indexable_temp(gen, ins); break; @@ -987,6 +1003,7 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d msl_else(gen); break; case VKD3DSIH_ENDIF: + case VKD3DSIH_ENDLOOP: msl_end_block(gen); break; case VKD3DSIH_EQO: @@ -1049,6 +1066,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_LOG: msl_intrinsic(gen, ins, "log2"); break; + case VKD3DSIH_LOOP: + msl_loop(gen); + break; case VKD3DSIH_MOV: msl_mov(gen, ins); break; diff --git a/tests/hlsl/loop.shader_test b/tests/hlsl/loop.shader_test index 0259d7366..906c768f5 100644 --- a/tests/hlsl/loop.shader_test +++ b/tests/hlsl/loop.shader_test @@ -118,7 +118,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) [pixel shader todo(sm<4)] @@ -137,7 +137,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) [pixel shader todo(sm<4)] @@ -156,7 +156,7 @@ float4 main() : sv_target } [test] -todo(sm<4 | msl) draw quad +todo(sm<4) draw quad probe (0, 0) rgba (10.0, 10.0, 10.0, 10.0) % unroll can't be used with fastopt or loop