vkd3d-shader/dxil: Implement DX intrinsics Dot2, Dot3 and Dot4.

This commit is contained in:
Conor McCarthy 2023-06-15 00:07:31 +10:00 committed by Alexandre Julliard
parent 2909a5aacc
commit d72d5c35d1
Notes: Alexandre Julliard 2024-04-03 00:21:02 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/728
4 changed files with 60 additions and 12 deletions

View File

@ -382,6 +382,9 @@ enum dx_intrinsic_opcode
DX_UMAD = 49, DX_UMAD = 49,
DX_IBFE = 51, DX_IBFE = 51,
DX_UBFE = 52, DX_UBFE = 52,
DX_DOT2 = 54,
DX_DOT3 = 55,
DX_DOT4 = 56,
DX_CREATE_HANDLE = 57, DX_CREATE_HANDLE = 57,
DX_CBUFFER_LOAD_LEGACY = 59, DX_CBUFFER_LOAD_LEGACY = 59,
DX_SAMPLE = 60, DX_SAMPLE = 60,
@ -4480,6 +4483,48 @@ static void sm6_parser_emit_dx_discard(struct sm6_parser *sm6, enum dx_intrinsic
src_param_init_from_value(src_param, operands[0]); src_param_init_from_value(src_param, operands[0]);
} }
static void sm6_parser_emit_dx_dot(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
const struct sm6_value **operands, struct function_emission_state *state)
{
struct vkd3d_shader_src_param *src_params;
struct vkd3d_shader_instruction *ins;
struct vkd3d_shader_register regs[2];
enum vkd3d_shader_opcode handler_idx;
unsigned int component_count;
switch (op)
{
case DX_DOT2:
handler_idx = VKD3DSIH_DP2;
component_count = 2;
break;
case DX_DOT3:
handler_idx = VKD3DSIH_DP3;
component_count = 3;
break;
case DX_DOT4:
handler_idx = VKD3DSIH_DP4;
component_count = 4;
break;
default:
vkd3d_unreachable();
}
if (!sm6_parser_emit_composite_construct(sm6, &operands[0], component_count, state, &regs[0]))
return;
if (!sm6_parser_emit_composite_construct(sm6, &operands[component_count], component_count, state, &regs[1]))
return;
ins = state->ins;
vsir_instruction_init(ins, &sm6->p.location, handler_idx);
if (!(src_params = instruction_src_params_alloc(ins, 2, sm6)))
return;
src_param_init_vector_from_reg(&src_params[0], &regs[0]);
src_param_init_vector_from_reg(&src_params[1], &regs[1]);
instruction_dst_param_init_ssa_scalar(ins, sm6);
}
static void sm6_parser_emit_dx_fabs(struct sm6_parser *sm6, enum dx_intrinsic_opcode op, static void sm6_parser_emit_dx_fabs(struct sm6_parser *sm6, enum dx_intrinsic_opcode op,
const struct sm6_value **operands, struct function_emission_state *state) const struct sm6_value **operands, struct function_emission_state *state)
{ {
@ -5356,6 +5401,9 @@ static const struct sm6_dx_opcode_info sm6_dx_op_table[] =
[DX_DERIV_FINEX ] = {"e", "R", sm6_parser_emit_dx_unary}, [DX_DERIV_FINEX ] = {"e", "R", sm6_parser_emit_dx_unary},
[DX_DERIV_FINEY ] = {"e", "R", sm6_parser_emit_dx_unary}, [DX_DERIV_FINEY ] = {"e", "R", sm6_parser_emit_dx_unary},
[DX_DISCARD ] = {"v", "1", sm6_parser_emit_dx_discard}, [DX_DISCARD ] = {"v", "1", sm6_parser_emit_dx_discard},
[DX_DOT2 ] = {"g", "RRRR", sm6_parser_emit_dx_dot},
[DX_DOT3 ] = {"g", "RRRRRR", sm6_parser_emit_dx_dot},
[DX_DOT4 ] = {"g", "RRRRRRRR", sm6_parser_emit_dx_dot},
[DX_EXP ] = {"g", "R", sm6_parser_emit_dx_unary}, [DX_EXP ] = {"g", "R", sm6_parser_emit_dx_unary},
[DX_FABS ] = {"g", "R", sm6_parser_emit_dx_fabs}, [DX_FABS ] = {"g", "R", sm6_parser_emit_dx_fabs},
[DX_FIRST_BIT_HI ] = {"i", "m", sm6_parser_emit_dx_unary}, [DX_FIRST_BIT_HI ] = {"i", "m", sm6_parser_emit_dx_unary},

View File

@ -10,7 +10,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 3.0 4.0 5.0 uniform 0 float4 2.0 3.0 4.0 5.0
uniform 4 float4 10.0 11.0 12.0 13.0 uniform 4 float4 10.0 11.0 12.0 13.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (166.0, 166.0, 166.0, 166.0) probe all rgba (166.0, 166.0, 166.0, 166.0)
[pixel shader] [pixel shader]
@ -25,7 +25,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 3.0 0.0 0.0 uniform 0 float4 2.0 3.0 0.0 0.0
uniform 4 float4 10.0 11.0 12.0 13.0 uniform 4 float4 10.0 11.0 12.0 13.0
todo(sm<4 | sm>=6 | glsl) draw quad todo(sm<4 | glsl) draw quad
probe all rgba (53.0, 53.0, 53.0, 53.0) probe all rgba (53.0, 53.0, 53.0, 53.0)
[pixel shader] [pixel shader]
@ -40,7 +40,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 0.0 0.0 0.0 uniform 0 float4 2.0 0.0 0.0 0.0
uniform 4 float4 10.0 11.0 12.0 13.0 uniform 4 float4 10.0 11.0 12.0 13.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (92.0, 92.0, 92.0, 92.0) probe all rgba (92.0, 92.0, 92.0, 92.0)
[pixel shader] [pixel shader]
@ -55,7 +55,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 10.0 11.0 12.0 13.0 uniform 0 float4 10.0 11.0 12.0 13.0
uniform 4 float4 2.0 0.0 0.0 0.0 uniform 4 float4 2.0 0.0 0.0 0.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (92.0, 92.0, 92.0, 92.0) probe all rgba (92.0, 92.0, 92.0, 92.0)
[pixel shader] [pixel shader]

View File

@ -8,7 +8,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 3.0 4.0 5.0 uniform 0 float4 2.0 3.0 4.0 5.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (0.272165537, 0.408248305, 0.544331074, 0.680413842) 2 probe all rgba (0.272165537, 0.408248305, 0.544331074, 0.680413842) 2
[pixel shader] [pixel shader]
@ -21,7 +21,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 3.0 4.0 0.0 uniform 0 float4 2.0 3.0 4.0 0.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (0.371390700, 0.557086051, 0.742781401, 0.0) 1 probe all rgba (0.371390700, 0.557086051, 0.742781401, 0.0) 1
[pixel shader] [pixel shader]
@ -34,7 +34,7 @@ float4 main() : SV_TARGET
[test] [test]
uniform 0 float4 2.0 3.0 0.0 0.0 uniform 0 float4 2.0 3.0 0.0 0.0
todo(sm<4 | sm>=6 | glsl) draw quad todo(sm<4 | glsl) draw quad
probe all rgba (0.554700196, 0.832050323, 0.0, 0.0) 1 probe all rgba (0.554700196, 0.832050323, 0.0, 0.0) 1
[pixel shader] [pixel shader]

View File

@ -10,7 +10,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 0.5 -0.1 0.2 0.3 uniform 0 float4 0.5 -0.1 0.2 0.3
uniform 4 float4 0.6 0.4 -0.3 1.0 uniform 4 float4 0.6 0.4 -0.3 1.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (-0.1, -0.5, 0.5, -0.7) 4 probe all rgba (-0.1, -0.5, 0.5, -0.7) 4
[pixel shader] [pixel shader]
@ -27,7 +27,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 0.5 0.0 0.0 0.0 uniform 0 float4 0.5 0.0 0.0 0.0
uniform 4 float4 0.6 0.4 -0.3 1.0 uniform 4 float4 0.6 0.4 -0.3 1.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (-0.52, -0.18, 1.01, -1.2) 4 probe all rgba (-0.52, -0.18, 1.01, -1.2) 4
[pixel shader] [pixel shader]
@ -44,7 +44,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 0.5 -0.1 0.2 0.3 uniform 0 float4 0.5 -0.1 0.2 0.3
uniform 4 float4 0.6 0.0 0.0 0.0 uniform 4 float4 0.6 0.0 0.0 0.0
todo(sm>=6 | glsl) draw quad todo(glsl) draw quad
probe all rgba (-0.148, -0.748, -0.448, -0.348) 4 probe all rgba (-0.148, -0.748, -0.448, -0.348) 4
[pixel shader] [pixel shader]
@ -79,7 +79,7 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 0.5 -0.1 0.0 0.0 uniform 0 float4 0.5 -0.1 0.0 0.0
uniform 4 float4 0.6 0.4 -0.3 1.0 uniform 4 float4 0.6 0.4 -0.3 1.0
todo(sm<4 | sm>=6 | glsl) draw quad todo(sm<4 | glsl) draw quad
probe all rgba (0.188, -0.308, 0.0, 0.0) 4 probe all rgba (0.188, -0.308, 0.0, 0.0) 4
[pixel shader] [pixel shader]
@ -97,5 +97,5 @@ float4 main() : sv_target
[test] [test]
uniform 0 float4 0.5 -0.1 0.2 0.0 uniform 0 float4 0.5 -0.1 0.2 0.0
uniform 4 float4 0.6 0.4 0.0 0.0 uniform 4 float4 0.6 0.4 0.0 0.0
todo(sm<4 | sm>=6 | glsl) draw quad todo(sm<4 | glsl) draw quad
probe all rgba (0.188, -0.308, 0.0, 0.0) 4 probe all rgba (0.188, -0.308, 0.0, 0.0) 4