From e0c23624f27e687d9b83bd18f7be5b409a15bc31 Mon Sep 17 00:00:00 2001 From: Henri Verbeet Date: Sat, 29 Nov 2025 20:36:51 +0100 Subject: [PATCH] vkd3d-shader/ir: Lower VSIR_OP_LRP instructions. --- libs/vkd3d-shader/ir.c | 52 +++++++++++++++++++++++++++++++++++++ tests/d3dbc/lrp.shader_test | 6 ++--- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 3548e748c..9c3daf333 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -1323,6 +1323,54 @@ static enum vkd3d_result vsir_program_lower_ifc(struct vsir_program *program, return VKD3D_OK; } +static enum vkd3d_result vsir_program_lower_lrp(struct vsir_program *program, struct vsir_program_iterator *lrp) +{ + struct vkd3d_shader_instruction *ins = vsir_program_iterator_current(lrp); + const struct vkd3d_shader_location location = ins->location; + const struct vkd3d_shader_src_param *src = ins->src; + const struct vkd3d_shader_dst_param *dst = ins->dst; + struct vsir_program_iterator it; + unsigned int neg_id, mad_id; + + /* lrp DST, SRC0, SRC1, SRC2 + * -> + * neg srNEG, SRC0 + * mad srMAD, srNEG, SRC2, SRC2 + * mad DST, SRC0, SRC1, srMAD */ + + if (!(ins = vsir_program_iterator_insert_before(lrp, &it, 2))) + return VKD3D_ERROR_OUT_OF_MEMORY; + if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_NEG, 1, 1)) + goto fail; + neg_id = program->ssa_count++; + dst_param_init_ssa(&ins->dst[0], neg_id, src[0].reg.data_type, src[0].reg.dimension); + ins->src[0] = src[0]; + + ins = vsir_program_iterator_next(&it); + if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_MAD, 1, 3)) + goto fail; + mad_id = program->ssa_count++; + dst_param_init_ssa(&ins->dst[0], mad_id, src[2].reg.data_type, src[2].reg.dimension); + src_param_init_ssa(&ins->src[0], neg_id, src[0].reg.data_type, src[0].reg.dimension); + ins->src[1] = src[2]; + ins->src[2] = src[2]; + + ins = vsir_program_iterator_next(&it); + if (!vsir_instruction_init_with_params(program, ins, &location, VSIR_OP_MAD, 1, 3)) + goto fail; + ins->dst[0] = dst[0]; + ins->src[0] = src[0]; + ins->src[1] = src[1]; + src_param_init_ssa(&ins->src[2], mad_id, src[2].reg.data_type, src[2].reg.dimension); + + return VKD3D_OK; + +fail: + vsir_program_iterator_nop_range(&it, lrp, &location); + + return VKD3D_ERROR_OUT_OF_MEMORY; +} + static enum vkd3d_result vsir_program_lower_nrm(struct vsir_program *program, struct vsir_program_iterator *nrm) { struct vkd3d_shader_instruction *ins = vsir_program_iterator_current(nrm); @@ -2420,6 +2468,10 @@ static enum vkd3d_result vsir_program_lower_d3dbc_instructions(struct vsir_progr ret = vsir_program_lower_ifc(program, &it, &tmp_idx, message_context); break; + case VSIR_OP_LRP: + ret = vsir_program_lower_lrp(program, &it); + break; + case VSIR_OP_NRM: ret = vsir_program_lower_nrm(program, &it); break; diff --git a/tests/d3dbc/lrp.shader_test b/tests/d3dbc/lrp.shader_test index f0245a28f..1bcded4c6 100644 --- a/tests/d3dbc/lrp.shader_test +++ b/tests/d3dbc/lrp.shader_test @@ -28,7 +28,7 @@ ffff0200 % ps_2_0 [test] uniform 0 float4 0 .25 .75 1 uniform 4 float4 0 .25 .75 1 -todo draw quad +draw quad probe ( 4, 4) f32(0, .25, .75, 1) probe (20, 20) f32(0, .25, .75, 1) probe (36, 36) f32(0, .25, .75, 1) @@ -36,7 +36,7 @@ probe (52, 52) f32(0, .25, .75, 1) uniform 0 float4 0 0 0 0 uniform 4 float4 1 1 1 1 -todo draw quad +draw quad probe ( 4, 4) f32(-1.0, 0.75, 1.5, -2.0) probe (20, 20) f32(-0.5, 0.25, 0.5, -1.0) probe (36, 36) f32( 0.0, -0.25, -0.5, 0.0) @@ -44,7 +44,7 @@ probe (52, 52) f32( 0.5, -0.75, -1.5, 1.0) uniform 0 float4 -2 -1 4 3 uniform 4 float4 0 1 2 1 -todo draw quad +draw quad probe ( 4, 4) f32(-4, 0.5, 1, 7) probe (20, 20) f32(-3, -0.5, 3, 5) probe (36, 36) f32(-2, -1.5, 5, 3)