diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 0261ba889..1be88479c 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -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; diff --git a/tests/d3dbc/dp2add.shader_test b/tests/d3dbc/dp2add.shader_test index 4a65407ed..8b7a254b0 100644 --- a/tests/d3dbc/dp2add.shader_test +++ b/tests/d3dbc/dp2add.shader_test @@ -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) diff --git a/tests/hlsl/dot.shader_test b/tests/hlsl/dot.shader_test index c3dae112c..2723abfc4 100644 --- a/tests/hlsl/dot.shader_test +++ b/tests/hlsl/dot.shader_test @@ -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; diff --git a/tests/hlsl/length.shader_test b/tests/hlsl/length.shader_test index 58b051cc4..89f2d5752 100644 --- a/tests/hlsl/length.shader_test +++ b/tests/hlsl/length.shader_test @@ -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; diff --git a/tests/hlsl/normalize.shader_test b/tests/hlsl/normalize.shader_test index 18815c934..8abf56ddd 100644 --- a/tests/hlsl/normalize.shader_test +++ b/tests/hlsl/normalize.shader_test @@ -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; diff --git a/tests/hlsl/reflect.shader_test b/tests/hlsl/reflect.shader_test index c0ac201fc..d553c3bf8 100644 --- a/tests/hlsl/reflect.shader_test +++ b/tests/hlsl/reflect.shader_test @@ -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 diff --git a/tests/hlsl/refract.shader_test b/tests/hlsl/refract.shader_test index 5f6313694..03e0a7ce8 100644 --- a/tests/hlsl/refract.shader_test +++ b/tests/hlsl/refract.shader_test @@ -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;