From a948c9a3ebdcda8db26398fda35ff2a174473b94 Mon Sep 17 00:00:00 2001 From: Georg Lehmann Date: Mon, 4 Nov 2024 11:31:03 +0100 Subject: [PATCH] nir/lower_wpos_ytransform: clean up wpos_adjustment Reviewed-by: Alyssa Rosenzweig Part-of: --- src/compiler/nir/nir_lower_wpos_ytransform.c | 76 +++++++------------- 1 file changed, 26 insertions(+), 50 deletions(-) diff --git a/src/compiler/nir/nir_lower_wpos_ytransform.c b/src/compiler/nir/nir_lower_wpos_ytransform.c index fae8512b3f1..1634a20cb49 100644 --- a/src/compiler/nir/nir_lower_wpos_ytransform.c +++ b/src/compiler/nir/nir_lower_wpos_ytransform.c @@ -59,13 +59,6 @@ get_transform(lower_wpos_ytransform_state *state) return state->transform; } -/* NIR equiv of TGSI CMP instruction: */ -static nir_def * -nir_cmp(nir_builder *b, nir_def *src0, nir_def *src1, nir_def *src2) -{ - return nir_bcsel(b, nir_flt_imm(b, src0, 0.0), src1, src2); -} - /* see emit_wpos_adjustment() in st_mesa_to_tgsi.c */ static void emit_wpos_adjustment(lower_wpos_ytransform_state *state, @@ -73,12 +66,10 @@ emit_wpos_adjustment(lower_wpos_ytransform_state *state, float adjX, float adjY[2]) { nir_builder *b = &state->b; - nir_def *wpos_temp_x = NULL, *wpos_temp_y = NULL, *wpos_temp, *wpos_input[4] = {NULL}; nir_def *wpostrans = get_transform(state); unsigned c = 0; - const nir_intrinsic_info *info = &nir_intrinsic_infos[intr->intrinsic]; - if (info->index_map[NIR_INTRINSIC_COMPONENT]) { + if (nir_intrinsic_has_component(intr)) { c = nir_intrinsic_component(intr); /* this pass only alters the first two components */ if (c > 1) @@ -86,59 +77,44 @@ emit_wpos_adjustment(lower_wpos_ytransform_state *state, } b->cursor = nir_after_instr(&intr->instr); + nir_def *wpos[4] = { NULL }; for (unsigned i = 0; i < intr->num_components; i++) - wpos_input[i + c] = nir_channel(b, &intr->def, i); + wpos[i + c] = nir_channel(b, &intr->def, i); /* First, apply the coordinate shift: */ - if (adjX || adjY[0] || adjY[1]) { - if (wpos_input[0]) - wpos_temp_x = nir_fadd(b, wpos_input[0], nir_imm_float(b, adjX)); - if (wpos_input[1] && adjY[0] != adjY[1]) { - /* Adjust the y coordinate by adjY[1] or adjY[0] respectively - * depending on whether inversion is actually going to be applied - * or not, which is determined by testing against the inversion - * state variable used below, which will be either +1 or -1. - */ - nir_def *adj_temp = nir_cmp(b, - nir_channel(b, wpostrans, invert ? 2 : 0), - nir_imm_float(b, adjY[0]), - nir_imm_float(b, adjY[1])); + if (wpos[0] && adjX) + wpos[0] = nir_fadd_imm(b, wpos[0], adjX); - wpos_temp_y = nir_fadd(b, wpos_input[1], adj_temp); - } else if (wpos_input[1]) { - wpos_temp_y = nir_fadd(b, wpos_input[1], nir_imm_float(b, adjY[0])); - } - } else { - /* MOV wpos_temp, input[wpos] + if (wpos[1] && adjY[0] != adjY[1]) { + /* Adjust the y coordinate by adjY[1] or adjY[0] respectively + * depending on whether inversion is actually going to be applied + * or not, which is determined by testing against the inversion + * state variable used below, which will be either +1 or -1. */ - wpos_temp_x = wpos_input[0]; - wpos_temp_y = wpos_input[1]; + nir_def *cond = nir_flt_imm(b, nir_channel(b, wpostrans, invert ? 2 : 0), 0.0); + nir_def *adj_temp = nir_bcsel(b, cond, + nir_imm_float(b, adjY[0]), + nir_imm_float(b, adjY[1])); + + wpos[1] = nir_fadd(b, wpos[1], adj_temp); + } else if (wpos[1] && adjY[0]) { + wpos[1] = nir_fadd_imm(b, wpos[1], adjY[0]); } - if (wpos_temp_y) { + if (wpos[1]) { /* Now the conditional y flip: STATE_FB_WPOS_Y_TRANSFORM.xy/zw will be * inversion/identity, or the other way around if we're drawing to an FBO. */ - if (invert) { - /* wpos_temp.y = wpos_temp * wpostrans.xxxx + wpostrans.yyyy */ - wpos_temp_y = nir_fadd(b, nir_fmul(b, wpos_temp_y, nir_channel(b, wpostrans, 0)), - nir_channel(b, wpostrans, 1)); - } else { - /* wpos_temp.y = wpos_temp * wpostrans.zzzz + wpostrans.wwww */ - wpos_temp_y = nir_fadd(b, nir_fmul(b, wpos_temp_y, nir_channel(b, wpostrans, 2)), - nir_channel(b, wpostrans, 3)); - } + unsigned base = invert ? 0 : 2; + /* wpos.y = wpos.y * trans.x/z + trans.y/w */ + wpos[1] = nir_ffma(b, wpos[1], nir_channel(b, wpostrans, base), + nir_channel(b, wpostrans, base + 1)); } - wpos_input[0] = wpos_temp_x; - wpos_input[1] = wpos_temp_y; - wpos_temp = intr->num_components > 1 ? - nir_vec(b, &wpos_input[c], intr->num_components) : - wpos_input[c]; + nir_def *new_wpos = nir_vec(b, &wpos[c], intr->num_components); - nir_def_rewrite_uses_after(&intr->def, - wpos_temp, - wpos_temp->parent_instr); + nir_def_rewrite_uses_after(&intr->def, new_wpos, + new_wpos->parent_instr); } static void