From a570932b82615b3675aed00ea8a78373b5135a9c Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Fri, 23 May 2025 15:23:10 +0200 Subject: [PATCH] vkd3d-shader/msl: Implement VKD3DSIH_IMUL. --- libs/vkd3d-shader/msl.c | 34 +++++++++++++++++++ tests/hlsl/arithmetic-int-uniform.shader_test | 2 +- tests/hlsl/arithmetic-uint.shader_test | 4 +-- tests/hlsl/default-values.shader_test | 2 +- tests/hlsl/hard-copy-prop.shader_test | 4 +-- tests/hlsl/non-const-indexing.shader_test | 22 ++++++------ 6 files changed, 51 insertions(+), 17 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 14e446caf..ecf0f6c3e 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -908,6 +908,37 @@ static void msl_movc(struct msl_generator *gen, const struct vkd3d_shader_instru msl_dst_cleanup(&dst, &gen->string_buffers); } +static void msl_mul64(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) +{ + struct msl_src src[2]; + struct msl_dst dst; + uint32_t mask; + + if (ins->dst[0].reg.type != VKD3DSPR_NULL) + { + /* TODO: mulhi(). */ + mask = msl_dst_init(&dst, gen, ins, &ins->dst[0]); + msl_print_assignment(gen, &dst, ""); + msl_dst_cleanup(&dst, &gen->string_buffers); + + msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, + "Internal compiler error: Unhandled 64-bit integer multiplication."); + } + + if (ins->dst[1].reg.type != VKD3DSPR_NULL) + { + mask = msl_dst_init(&dst, gen, ins, &ins->dst[1]); + msl_src_init(&src[0], gen, &ins->src[0], mask); + msl_src_init(&src[1], gen, &ins->src[1], mask); + + msl_print_assignment(gen, &dst, "%s * %s", src[0].str->buffer, src[1].str->buffer); + + msl_src_cleanup(&src[1], &gen->string_buffers); + msl_src_cleanup(&src[0], &gen->string_buffers); + msl_dst_cleanup(&dst, &gen->string_buffers); + } +} + static void msl_ret(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { msl_print_indent(gen->buffer, gen->indent); @@ -1001,6 +1032,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_MIN: msl_intrinsic(gen, ins, "min"); break; + case VKD3DSIH_IMUL: + msl_mul64(gen, ins); + break; case VKD3DSIH_INE: case VKD3DSIH_NEU: msl_relop(gen, ins, "!="); diff --git a/tests/hlsl/arithmetic-int-uniform.shader_test b/tests/hlsl/arithmetic-int-uniform.shader_test index f295becb7..dc666d44a 100644 --- a/tests/hlsl/arithmetic-int-uniform.shader_test +++ b/tests/hlsl/arithmetic-int-uniform.shader_test @@ -314,7 +314,7 @@ uniform 0 uint 7 uniform 4 uint 0xfffffff7 uniform 8 uint 0xfffffff9 uniform 12 uint 9 -todo(msl) draw quad +draw quad probe (0, 0) rgbai(-21, -45, 21, 45) [pixel shader fail todo] diff --git a/tests/hlsl/arithmetic-uint.shader_test b/tests/hlsl/arithmetic-uint.shader_test index 079351068..1c87edacb 100644 --- a/tests/hlsl/arithmetic-uint.shader_test +++ b/tests/hlsl/arithmetic-uint.shader_test @@ -66,7 +66,7 @@ float4 main() : SV_TARGET [test] uniform 0 uint4 0 1 2 3 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 7.0, 13.0, 19.0) % Test collecting terms with constant coefficients. @@ -171,7 +171,7 @@ uniform 0 uint 7 uniform 4 uint 9 uniform 8 uint 0xff9 uniform 12 uint 0xff7 -todo(msl) draw quad +draw quad probe (0, 0) rgbaui(21, 45, 0x2feb, 0x4fd3) [pixel shader] diff --git a/tests/hlsl/default-values.shader_test b/tests/hlsl/default-values.shader_test index 93936a9e3..7a759b364 100644 --- a/tests/hlsl/default-values.shader_test +++ b/tests/hlsl/default-values.shader_test @@ -88,7 +88,7 @@ if(sm<4) uniform 0 float4 10 20 30 40 if(sm<4) uniform 4 float4 50 60 70 80 if(sm>=4) uniform 0 int4 10 20 30 40 if(sm>=4) uniform 4 int4 50 60 70 80 -todo(msl) draw quad +draw quad probe (0, 0) rgba (100, 120, 140, 160) diff --git a/tests/hlsl/hard-copy-prop.shader_test b/tests/hlsl/hard-copy-prop.shader_test index 40a2666de..779111b5b 100644 --- a/tests/hlsl/hard-copy-prop.shader_test +++ b/tests/hlsl/hard-copy-prop.shader_test @@ -121,11 +121,11 @@ uniform 28 float -2.0 uniform 32 float -3.0 if(sm<4) uniform 36 float4 0 1 2 0 if(sm>=4) uniform 36 uint4 0 1 2 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(1.0, 4.0, -1.0, 2.0) if(sm<4) uniform 36 float4 2 0 1 1 if(sm>=4) uniform 36 uint4 2 0 1 1 -todo(msl) draw quad +draw quad probe (0, 0) rgba(3.0, 2.0, -2.0, 6.0) [pixel shader] diff --git a/tests/hlsl/non-const-indexing.shader_test b/tests/hlsl/non-const-indexing.shader_test index fcf3c14a4..dabf2507d 100644 --- a/tests/hlsl/non-const-indexing.shader_test +++ b/tests/hlsl/non-const-indexing.shader_test @@ -83,16 +83,16 @@ float4 main() : SV_TARGET [test] uniform 0 float 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (21.0, 1.0, 24.0, 0.0) uniform 0 float 1 -todo(msl) draw quad +draw quad probe (0, 0) rgba (22.0, 0.0, 23.0, 1.0) uniform 0 float 2 -todo(msl) draw quad +draw quad probe (0, 0) rgba (23.0, 1.0, 22.0, 0.0) uniform 0 float 3 -todo(msl) draw quad +draw quad probe (0, 0) rgba (24.0, 0.0, 21.0, 1.0) @@ -154,12 +154,12 @@ float4 main() : sv_target if(sm<4) uniform 0 float 3 if(sm<4) uniform 4 float 1 if(sm>=4) uniform 0 float4 3 1 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (7, 7, 7, 7) if(sm<4) uniform 0 float 5 if(sm<4) uniform 4 float 0 if(sm>=4) uniform 0 float4 5 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (10, 10, 10, 10) @@ -192,13 +192,13 @@ if(sm<4) uniform 0 float 2 if(sm<4) uniform 4 float 1 if(sm<4) uniform 8 float -1 if(sm>=4) uniform 0 float4 2 1 -1 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (30, 31, 32, 33) if(sm<4) uniform 0 float 1 if(sm<4) uniform 4 float 0 if(sm<4) uniform 8 float 1 if(sm>=4) uniform 0 float4 1 0 1 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (70, 71, 72, 73) @@ -220,12 +220,12 @@ float4 main() : sv_target if(sm<4) uniform 0 float 11 if(sm<4) uniform 4 float 12 if(sm>=4) uniform 0 float4 11 12 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5, 5, 5, 5) if(sm<4) uniform 0 float 13 if(sm<4) uniform 4 float 10 if(sm>=4) uniform 0 float4 13 10 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (9, 9, 9, 9) [pixel shader] @@ -244,7 +244,7 @@ uniform 8 float4 -1.0 -2.0 -3.0 -4.0 uniform 12 float4 -5.0 -6.0 -7.0 -8.0 if(sm<4) uniform 16 float4 1 0 0 0 if(sm>=4) uniform 16 int4 1 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(-1.0, -5.0, 2.0, 6.0) % SM1 doesn't support relative addressing if it is used in a l-value.