mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/msl: Implement support for VKD3DSPR_IDXTEMP registers.
This commit is contained in:
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
@@ -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:
|
||||
|
@@ -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.
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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)
|
||||
|
@@ -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]
|
||||
|
Reference in New Issue
Block a user