From ea5cf883fa8a093b73c653de20ef81574d3ed50d Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Thu, 22 May 2025 22:37:28 +0200 Subject: [PATCH] vkd3d-shader/msl: Implement support for VKD3DSPR_IDXTEMP registers. --- libs/vkd3d-shader/msl.c | 16 +++++++++++++ tests/hlsl/hard-copy-prop.shader_test | 4 ++-- tests/hlsl/matrix-indexing.shader_test | 2 +- tests/hlsl/minimum-precision.shader_test | 12 +++++----- tests/hlsl/non-const-indexing.shader_test | 24 +++++++++---------- .../shader-interstage-interface.shader_test | 2 +- 6 files changed, 38 insertions(+), 22 deletions(-) diff --git a/libs/vkd3d-shader/msl.c b/libs/vkd3d-shader/msl.c index 62981811e..26ffac9eb 100644 --- a/libs/vkd3d-shader/msl.c +++ b/libs/vkd3d-shader/msl.c @@ -382,6 +382,11 @@ static enum msl_data_type msl_print_register_name(struct vkd3d_string_buffer *bu return MSL_DATA_UNION; } + case VKD3DSPR_IDXTEMP: + vkd3d_string_buffer_printf(buffer, "x%u", reg->idx[0].offset); + msl_print_subscript(buffer, gen, reg->idx[1].rel_addr, reg->idx[1].offset); + return MSL_DATA_UNION; + default: msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL, "Internal compiler error: Unhandled register type %#x.", reg->type); @@ -901,6 +906,14 @@ static void msl_ret(struct msl_generator *gen, const struct vkd3d_shader_instruc vkd3d_string_buffer_printf(gen->buffer, "return;\n"); } +static void msl_dcl_indexable_temp(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) +{ + msl_print_indent(gen->buffer, gen->indent); + vkd3d_string_buffer_printf(gen->buffer, "vkd3d_vec4 x%u[%u];\n", + ins->declaration.indexable_temp.register_idx, + ins->declaration.indexable_temp.register_size); +} + static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d_shader_instruction *ins) { gen->location = ins->location; @@ -913,6 +926,9 @@ static void msl_handle_instruction(struct msl_generator *gen, const struct vkd3d case VKD3DSIH_AND: msl_binop(gen, ins, "&"); break; + case VKD3DSIH_DCL_INDEXABLE_TEMP: + msl_dcl_indexable_temp(gen, ins); + break; case VKD3DSIH_NOP: break; case VKD3DSIH_DIV: diff --git a/tests/hlsl/hard-copy-prop.shader_test b/tests/hlsl/hard-copy-prop.shader_test index 8832ea1c4..f61613995 100644 --- a/tests/hlsl/hard-copy-prop.shader_test +++ b/tests/hlsl/hard-copy-prop.shader_test @@ -180,11 +180,11 @@ uniform 0 float4 2.0 2.0 2.0 2.0 uniform 4 float4 3.0 3.0 3.0 3.0 if(sm<4) uniform 8 float4 0 0 0 0 if(sm>=4) uniform 8 uint4 0 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(2.0, 2.0, 2.0, 2.0) if(sm<4) uniform 8 float4 1 0 0 0 if(sm>=4) uniform 8 uint4 1 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(3.0, 3.0, 3.0, 3.0) % OOB indexes are illegal, but sm < 6 allows them in dead code. diff --git a/tests/hlsl/matrix-indexing.shader_test b/tests/hlsl/matrix-indexing.shader_test index 421b4da2c..d26035149 100644 --- a/tests/hlsl/matrix-indexing.shader_test +++ b/tests/hlsl/matrix-indexing.shader_test @@ -136,5 +136,5 @@ float4 main() : sv_target [test] uniform 0 float 3 -todo(msl) draw quad +draw quad probe (0, 0) rgba (12, 13, 14, 15) diff --git a/tests/hlsl/minimum-precision.shader_test b/tests/hlsl/minimum-precision.shader_test index b95c269f6..9ab6bfdbd 100644 --- a/tests/hlsl/minimum-precision.shader_test +++ b/tests/hlsl/minimum-precision.shader_test @@ -235,12 +235,12 @@ uint4 main() : sv_target [test] uniform 0 uint 0 uniform 1 uint 100 -todo(msl) draw quad +draw quad % In D3D12 with SM5 all reads to the array return 0 if(sm>=6 | !d3d12) probe (0, 0) rgbaui(100, 2, 0x7ff, 0xfff) uniform 0 uint 2 uniform 1 uint 1000 -todo(msl) draw quad +draw quad if(sm>=6 | !d3d12) probe (0, 0) rgbaui(1, 2, 1000, 0xfff) [rtv 0] @@ -261,12 +261,12 @@ int4 main() : sv_target [test] uniform 0 uint 0 uniform 1 uint 100 -todo(msl) draw quad +draw quad % In D3D12 with SM5 all reads to the array return 0 if(sm>=6 | !d3d12) probe (0, 0) rgbaui(100, 2, 0x7ff, 0xfff) uniform 0 uint 2 uniform 1 uint 1000 -todo(msl) draw quad +draw quad if(sm>=6 | !d3d12) probe (0, 0) rgbaui(1, 2, 1000, 0xfff) [rtv 0] @@ -287,9 +287,9 @@ float4 main() : sv_target [test] uniform 0 uint 0 uniform 1 float 3.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(3.0, 2.0, 0.5, 111.0) uniform 0 uint 2 uniform 1 float 5.0 -todo(msl) draw quad +draw quad probe (0, 0) rgba(1.0, 2.0, 5.0, 111.0) diff --git a/tests/hlsl/non-const-indexing.shader_test b/tests/hlsl/non-const-indexing.shader_test index 4993f6928..e3468df05 100644 --- a/tests/hlsl/non-const-indexing.shader_test +++ b/tests/hlsl/non-const-indexing.shader_test @@ -67,7 +67,7 @@ float4 main() : sv_target [test] uniform 0 float 2.3 -todo(msl) draw quad +draw quad probe (0, 0) rgba (3, 3, 3, 3) @@ -108,16 +108,16 @@ float4 main() : sv_target [test] uniform 0 float4 0 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 2.0, 3.0, 4.0) uniform 0 float4 1 0 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0) uniform 0 float4 0 1 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5.0, 6.0, 7.0, 8.0) uniform 0 float4 1 1 0 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (9.0, 10.0, 11.0, 12.0) @@ -136,7 +136,7 @@ float4 main() : sv_target [test] uniform 0 float4 0 0 2.4 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1.0, 120.0, 90.0, 4.0) @@ -268,15 +268,15 @@ float4 main() : sv_target [test] uniform 0 int 0 uniform 1 int 0 -todo(msl) draw quad +draw quad probe (0, 0) rgba (100, 6, 7, 8) uniform 0 int 2 uniform 1 int 2 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5, 6, 100, 8) uniform 0 int 1 uniform 1 int 3 -todo(msl) draw quad +draw quad probe (0, 0) rgba (5, 6, 7, 4) @@ -305,7 +305,7 @@ uniform 0 float4 1 2 3 4 uniform 4 float4 5 6 7 8 uniform 8 int 3 uniform 9 int 4 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1126, 3344, 5566, 3788) @@ -325,7 +325,7 @@ float4 main() : sv_target [test] uniform 0 uint 1 uniform 1 uint 0x40a00000 -todo(msl) draw quad +draw quad probe (0, 0) rgba (1, 5, 3, 4) @@ -356,7 +356,7 @@ uniform 8 float 3.0 uniform 12 float 4.0 uniform 16 uint4 3 1 0 2 uniform 20 uint4 0 3 1 2 -todo(msl) draw quad +draw quad if(sm<4) probe (0,0) rgba (1.0, 1.0, 1.0, 1.0) if(sm>=4 & sm<6) todo probe (0,0) rgba (4.0, 4.0, 4.0, 4.0) if(sm>=6) probe (0,0) rgba (4.0, 3.0, 2.0, 1.0) diff --git a/tests/hlsl/shader-interstage-interface.shader_test b/tests/hlsl/shader-interstage-interface.shader_test index e3c90e20f..3be64d24e 100644 --- a/tests/hlsl/shader-interstage-interface.shader_test +++ b/tests/hlsl/shader-interstage-interface.shader_test @@ -101,7 +101,7 @@ float4 main(struct ps_data ps_input) : SV_Target [test] uniform 0 uint4 1 2 0 1 clear rtv 0 1.0 1.0 1.0 1.0 -todo(msl) draw triangle strip 4 +draw triangle strip 4 probe (0, 0) rgba(0.0, 1.0, 0.0, 1.0) [require]