radv: combine v_mov_dpp into fma in frag_coord.z adjust

This wasn't possible before because of the literal.

fossil-db (vangogh):
Totals from 3766 (3.36% of 112041) affected shaders:
Instrs: 5646975 -> 5642967 (-0.07%); split: -0.09%, +0.02%
CodeSize: 30751152 -> 30749956 (-0.00%); split: -0.02%, +0.02%
VGPRs: 262640 -> 262672 (+0.01%); split: -0.01%, +0.02%
Latency: 184869423 -> 184883681 (+0.01%); split: -0.02%, +0.03%
InvThroughput: 43462111 -> 43456113 (-0.01%); split: -0.03%, +0.02%
VClause: 93337 -> 93353 (+0.02%); split: -0.10%, +0.12%
SClause: 186857 -> 186833 (-0.01%); split: -0.07%, +0.06%
Copies: 390583 -> 390327 (-0.07%); split: -0.44%, +0.38%
Branches: 106070 -> 106086 (+0.02%); split: -0.03%, +0.05%
VALU: 4112856 -> 4108839 (-0.10%); split: -0.12%, +0.02%
SALU: 593814 -> 593758 (-0.01%); split: -0.05%, +0.04%

Signed-off-by: Rhys Perry <pendingchaos02@gmail.com>
Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40013>
This commit is contained in:
Rhys Perry 2026-02-20 15:02:09 +00:00 committed by Marge Bot
parent 437a3d5ade
commit 05586fae67

View file

@ -58,17 +58,16 @@ pass(nir_builder *b, nir_intrinsic_instr *intrin, void *data)
nir_def *frag_z = nir_channel(b, &intrin->def, 2);
/* adjusted_frag_z = dFdxFine(frag_z) * 0.0625 + frag_z */
nir_def *adjusted_frag_z = nir_ddx_fine(b, frag_z);
adjusted_frag_z = nir_ffma_imm1(b, adjusted_frag_z, 0.0625f, frag_z);
/* VRS Rate X = Ancillary[2:3] */
nir_def *ancillary = nir_load_vector_arg_amd(b, 1, .base = args->ac.ancillary.arg_index);
nir_def *x_rate = nir_ubfe_imm(b, ancillary, 2, 2);
/* xRate = xRate == 0x1 ? adjusted_frag_z : frag_z. */
nir_def *cond = nir_ieq_imm(b, x_rate, 1);
frag_z = nir_bcsel(b, cond, adjusted_frag_z, frag_z);
nir_def *mul = nir_bcsel(b, cond, nir_imm_float(b, 0.0625f), nir_imm_float(b, -0.0));
/* adjusted_frag_z = dFdxFine(frag_z) * 0.0625 + frag_z */
frag_z = nir_ffma(b, nir_ddx_fine(b, frag_z), mul, frag_z);
nir_def *new_dest = nir_vector_insert_imm(b, &intrin->def, frag_z, 2);
nir_def_rewrite_uses_after(&intrin->def, new_dest);