vkd3d-shader/msl: Implement support for VKD3DSPR_IDXTEMP registers.

This commit is contained in:
Henri Verbeet
2025-05-22 22:37:28 +02:00
parent 66d0c2a426
commit ea5cf883fa
Notes: Henri Verbeet 2025-06-09 16:31:45 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1547
6 changed files with 38 additions and 22 deletions

View File

@@ -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:

View File

@@ -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.

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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]