diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 658aa7a6..769f35f7 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -422,16 +422,25 @@ static void msl_dot(struct msl_generator *gen, const struct vkd3d_shader_instruc static void msl_intrinsic(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins, const char *op) { + struct vkd3d_string_buffer *args; struct msl_src src; struct msl_dst dst; + unsigned int i; uint32_t mask; mask = msl_dst_init(&dst, gen, ins, &ins->dst[0]); - msl_src_init(&src, gen, &ins->src[0], mask); + args = vkd3d_string_buffer_get(&gen->string_buffers); - msl_print_assignment(gen, &dst, "%s(%s)", op, src.str->buffer); + for (i = 0; i < ins->src_count; ++i) + { + msl_src_init(&src, gen, &ins->src[i], mask); + vkd3d_string_buffer_printf(args, "%s%s", i ? ", " : "", src.str->buffer); + msl_src_cleanup(&src, &gen->string_buffers); + } - msl_src_cleanup(&src, &gen->string_buffers); + msl_print_assignment(gen, &dst, "%s(%s)", op, args->buffer); + + vkd3d_string_buffer_release(&gen->string_buffers, args); msl_dst_cleanup(&dst, &gen->string_buffers); } @@ -601,6 +610,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_LTO: msl_relop(gen, ins, "<"); break; + case VKD3DSIH_MAX: + msl_intrinsic(gen, ins, "max"); + break; case VKD3DSIH_INE: case VKD3DSIH_NEU: msl_relop(gen, ins, "!="); diff --git a/tests/hlsl/lit.shader_test b/tests/hlsl/lit.shader_test index 1d47cd10..84660415 100644 --- a/tests/hlsl/lit.shader_test +++ b/tests/hlsl/lit.shader_test @@ -8,17 +8,17 @@ float4 main() : sv_target [test] uniform 0 float4 -0.1 10.0 0.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 0.0, 0.0, 1.0) [test] uniform 0 float4 1.2 -0.1 0.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 1.2, 0.0, 1.0) [test] uniform 0 float4 1.2 2.0 3.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 1.2, 8.0, 1.0) [pixel shader] @@ -31,7 +31,7 @@ float4 main() : sv_target [test] uniform 0 float4 1.2 2.0 3.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (2.0, 2.4, 16.0, 2.0) [pixel shader fail] diff --git a/tests/hlsl/max-min.shader_test b/tests/hlsl/max-min.shader_test index c75935e4..5333bbc8 100644 --- a/tests/hlsl/max-min.shader_test +++ b/tests/hlsl/max-min.shader_test @@ -8,7 +8,7 @@ float4 main() : sv_target [test] uniform 0 float4 0.7 -0.1 0.0 0.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.7, 2.1, 2.0, -1.0) @@ -24,7 +24,7 @@ float4 main() : sv_target [test] uniform 0 float4 0.7 -0.1 0.4 0.8 -todo(msl) draw quad +draw quad probe (0, 0) rgba (0.7, 0.8, 0.7, 0.2)