vkd3d-shader/ir: Lower VSIR_OP_DP2ADD instructions.

This commit is contained in:
Henri Verbeet
2025-12-04 22:36:23 +01:00
parent 79ddfedbde
commit d0318ca14b
Notes: Henri Verbeet 2025-12-08 17:49:28 +01:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1859
7 changed files with 66 additions and 24 deletions

View File

@@ -1270,6 +1270,44 @@ static enum vkd3d_result vsir_program_normalize_addr(struct vsir_program *progra
return VKD3D_OK;
}
static enum vkd3d_result vsir_program_lower_dp2add(struct vsir_program *program, struct vsir_program_iterator *dp2add)
{
struct vkd3d_shader_instruction *ins = vsir_program_iterator_current(dp2add);
const struct vkd3d_shader_location location = ins->location;
const struct vsir_src_operand *src = ins->src;
const struct vsir_dst_operand *dst = ins->dst;
struct vsir_program_iterator it;
unsigned int dot_id;
/* dp2add DST, SRC0, SRC1, SRC2
* ->
* dp2 srDOT, SRC0, SRC1
* add DST, srDOT, SRC2 */
if (!(ins = vsir_program_iterator_insert_before(dp2add, &it, 1)))
return VKD3D_ERROR_OUT_OF_MEMORY;
if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_DP2, 1, 2))
goto fail;
dot_id = program->ssa_count++;
vsir_dst_operand_init_ssa(&ins->dst[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
ins->src[0] = src[0];
ins->src[1] = src[1];
ins = vsir_program_iterator_next(&it);
if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_ADD, 1, 2))
goto fail;
ins->dst[0] = dst[0];
vsir_src_operand_init_ssa(&ins->src[0], dot_id, src[0].reg.data_type, VSIR_DIMENSION_SCALAR);
ins->src[1] = src[2];
return VKD3D_OK;
fail:
vsir_program_iterator_nop_range(&it, dp2add, &location);
return VKD3D_ERROR_OUT_OF_MEMORY;
}
static enum vkd3d_result vsir_program_lower_ifc(struct vsir_program *program,
struct vsir_program_iterator *it, unsigned int *tmp_idx,
struct vkd3d_shader_message_context *message_context)
@@ -2470,6 +2508,10 @@ static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_progr
ret = vsir_program_lower_bem(program, &it);
break;
case VSIR_OP_DP2ADD:
ret = vsir_program_lower_dp2add(program, &it);
break;
case VSIR_OP_IFC:
ret = vsir_program_lower_ifc(program, &it, &tmp_idx, message_context);
break;

View File

@@ -11,7 +11,7 @@ ffff0200 % ps_2_0
0000ffff % end
[test]
todo draw quad
draw quad
probe (320, 240) f32(.5, .5, .5, 1.0)
% Test the _sat modifier.
@@ -31,5 +31,5 @@ ffff0200 % ps_2_0
0000ffff % end
[test]
todo draw quad
draw quad
probe (320, 240) f32(.5, .5, .5, 1.0)

View File

@@ -25,8 +25,8 @@ float4 main() : SV_TARGET
[test]
uniform 0 float4 2.0 3.0 0.0 0.0
uniform 4 float4 10.0 11.0 12.0 13.0
todo(sm<4) draw quad
probe (0, 0) rgba (53.0, 53.0, 53.0, 53.0)
draw quad
probe (0, 0) f32(53.0, 53.0, 53.0, 53.0)
[pixel shader]
uniform float x;

View File

@@ -34,8 +34,8 @@ float4 main() : SV_TARGET
[test]
uniform 0 float4 2.0 3.0 0.0 0.0
todo(sm<4) draw quad
probe (0, 0) rgba (3.60555124, 3.60555124, 3.60555124, 3.60555124) 1
draw quad
probe (0, 0) f32(3.60555124, 3.60555124, 3.60555124, 3.60555124) 1
[pixel shader]
uniform float1 x;

View File

@@ -34,8 +34,8 @@ float4 main() : SV_TARGET
[test]
uniform 0 float4 2.0 3.0 0.0 0.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.554700196, 0.832050323, 0.0, 0.0) 1
draw quad
probe (0, 0) f32(0.554700196, 0.832050323, 0.0, 0.0) 1
[pixel shader]
uniform float1 x;

View File

@@ -79,8 +79,8 @@ float4 main() : sv_target
[test]
uniform 0 float4 0.5 -0.1 0.0 0.0
uniform 4 float4 0.6 0.4 -0.3 1.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.188, -0.308, 0.0, 0.0) 4
draw quad
probe (0, 0) f32(0.188, -0.308, 0.0, 0.0) 4
[pixel shader]
uniform float4 i;
@@ -97,5 +97,5 @@ float4 main() : sv_target
[test]
uniform 0 float4 0.5 -0.1 0.2 0.0
uniform 4 float4 0.6 0.4 0.0 0.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.188, -0.308, 0.0, 0.0) 4
draw quad
probe (0, 0) f32(0.188, -0.308, 0.0, 0.0) 4

View File

@@ -34,11 +34,11 @@ float4 main() : sv_target
uniform 0 float4 0.5 -0.1 0.2 0.3
uniform 4 float4 0.6 0.4 -0.3 1.0
uniform 8 float 0.2
todo(sm<4) draw quad
probe (0, 0) rgba (-0.519904912, -0.4332699, 0.0, 0.0) 32
draw quad
probe (0, 0) f32(-0.519904912, -0.4332699, 0.0, 0.0) 32
uniform 8 float 100.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
draw quad
probe (0, 0) f32(0.0, 0.0, 0.0, 0.0)
[pixel shader]
float4 r;
@@ -55,11 +55,11 @@ float4 main() : sv_target
uniform 0 float4 0.5 -0.1 0.2 0.3
uniform 4 float4 0.6 0.4 -0.3 1.0
uniform 8 float 0.2
todo(sm<4) draw quad
probe (0, 0) rgba (-0.519904912, -0.4332699, 0.0, 0.0) 32
draw quad
probe (0, 0) f32(-0.519904912, -0.4332699, 0.0, 0.0) 32
uniform 8 float 100.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
draw quad
probe (0, 0) f32(0.0, 0.0, 0.0, 0.0)
[pixel shader]
float4 r;
@@ -76,11 +76,11 @@ float4 main() : sv_target
uniform 0 float4 0.5 -0.1 0.2 0.3
uniform 4 float4 0.6 0.4 -0.3 1.0
uniform 8 float 0.2
todo(sm<4) draw quad
probe (0, 0) rgba (-0.519904912, -0.4332699, 0.0, 0.0) 32
draw quad
probe (0, 0) f32(-0.519904912, -0.4332699, 0.0, 0.0) 32
uniform 8 float 100.0
todo(sm<4) draw quad
probe (0, 0) rgba (0.0, 0.0, 0.0, 0.0)
draw quad
probe (0, 0) f32(0.0, 0.0, 0.0, 0.0)
[pixel shader]
float4 r;