From cbf58fea6f74f948dcced543afcfbf6a3be87dfd Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Tue, 18 Feb 2025 12:09:47 +0000 Subject: [PATCH] pco: further commonize iteration instruction emission Signed-off-by: Simon Perretta Acked-by: Erik Faye-Lund Part-of: --- src/imagination/pco/pco.c | 9 +-- src/imagination/pco/pco_builder_ops.h.py | 3 +- src/imagination/pco/pco_internal.h | 6 +- src/imagination/pco/pco_map.py | 12 ++-- src/imagination/pco/pco_ops.py | 4 +- src/imagination/pco/pco_trans_nir.c | 86 +++++++++++++++--------- 6 files changed, 67 insertions(+), 53 deletions(-) diff --git a/src/imagination/pco/pco.c b/src/imagination/pco/pco.c index 37076aac8d1..cf934ed8371 100644 --- a/src/imagination/pco/pco.c +++ b/src/imagination/pco/pco.c @@ -230,15 +230,12 @@ pco_loop *pco_loop_create(pco_func *func) * \brief Allocates and sets up a PCO instruction. * * \param[in,out] func Parent function. - * \param[in] op Instruction op. * \param[in] num_dests Number of destinations. * \param[in] num_srcs Number of sources. * \return The PCO instruction, or NULL on failure. */ -pco_instr *pco_instr_create(pco_func *func, - enum pco_op op, - unsigned num_dests, - unsigned num_srcs) +pco_instr * +pco_instr_create(pco_func *func, unsigned num_dests, unsigned num_srcs) { pco_instr *instr; unsigned size = sizeof(*instr); @@ -249,8 +246,6 @@ pco_instr *pco_instr_create(pco_func *func, instr->parent_func = func; - instr->op = op; - instr->num_dests = num_dests; instr->dest = (pco_ref *)(instr + 1); diff --git a/src/imagination/pco/pco_builder_ops.h.py b/src/imagination/pco/pco_builder_ops.h.py index b5291a1fdcc..e5eca9f8e31 100644 --- a/src/imagination/pco/pco_builder_ops.h.py +++ b/src/imagination/pco/pco_builder_ops.h.py @@ -127,10 +127,11 @@ static pco_instr *_${op.bname}_(${op.builder_params[0]}) { pco_instr *instr = pco_instr_create(func, - ${op.cname.upper()}, ${'num_dests' if op.num_dests == VARIABLE else op.num_dests}, ${'num_srcs' if op.num_srcs == VARIABLE else op.num_srcs}); + instr->op = ${op.cname.upper()}; + % if op.has_target_cf_node: instr->target_cf_node = target_cf_node; % endif diff --git a/src/imagination/pco/pco_internal.h b/src/imagination/pco/pco_internal.h index 478a76e4308..1cccd05b91e 100644 --- a/src/imagination/pco/pco_internal.h +++ b/src/imagination/pco/pco_internal.h @@ -430,10 +430,8 @@ pco_func *pco_func_create(pco_shader *shader, pco_block *pco_block_create(pco_func *func); pco_if *pco_if_create(pco_func *func); pco_loop *pco_loop_create(pco_func *func); -pco_instr *pco_instr_create(pco_func *func, - enum pco_op op, - unsigned num_dests, - unsigned num_srcs); +pco_instr * +pco_instr_create(pco_func *func, unsigned num_dests, unsigned num_srcs); pco_igrp *pco_igrp_create(pco_func *func); void pco_instr_delete(pco_instr *instr); diff --git a/src/imagination/pco/pco_map.py b/src/imagination/pco/pco_map.py index d67b8b9172b..37b82632928 100644 --- a/src/imagination/pco/pco_map.py +++ b/src/imagination/pco/pco_map.py @@ -2776,13 +2776,13 @@ group_map(O_UVSW_WRITE_EMIT_ENDTASK, group_map(O_FITR, hdr=(I_IGRP_HDR_MAIN, [ ('oporg', 'be'), - ('olchk', OM_OLCHK), + ('olchk', False), ('w1p', False), ('w0p', False), ('cc', OM_EXEC_CND), ('end', OM_END), - ('atom', OM_ATOM), - ('rpt', OM_RPT) + ('atom', False), + ('rpt', 1) ]), enc_ops=[('backend', O_FITR)], srcs=[ @@ -2794,13 +2794,13 @@ group_map(O_FITR, group_map(O_FITRP, hdr=(I_IGRP_HDR_MAIN, [ ('oporg', 'be'), - ('olchk', OM_OLCHK), + ('olchk', False), ('w1p', False), ('w0p', False), ('cc', OM_EXEC_CND), ('end', OM_END), - ('atom', OM_ATOM), - ('rpt', OM_RPT) + ('atom', False), + ('rpt', 1) ]), enc_ops=[('backend', O_FITRP)], srcs=[ diff --git a/src/imagination/pco/pco_ops.py b/src/imagination/pco/pco_ops.py index aeb6e200b18..3958d5155ab 100644 --- a/src/imagination/pco/pco_ops.py +++ b/src/imagination/pco/pco_ops.py @@ -376,8 +376,8 @@ O_UVSW_ENDTASK = hw_op('uvsw.endtask', [OM_END]) O_UVSW_EMIT_ENDTASK = hw_op('uvsw.emit.endtask', [OM_END]) O_UVSW_WRITE_EMIT_ENDTASK = hw_op('uvsw.write.emit.endtask', [OM_END], 0, 2) -O_FITR = hw_op('fitr', OM_ALU + [OM_ITR_MODE, OM_SAT], 1, 3) -O_FITRP = hw_op('fitrp', OM_ALU + [OM_ITR_MODE, OM_SAT], 1, 4) +O_FITR = hw_op('fitr', [OM_EXEC_CND, OM_END, OM_ITR_MODE, OM_SAT], 1, 3) +O_FITRP = hw_op('fitrp', [OM_EXEC_CND, OM_END, OM_ITR_MODE, OM_SAT], 1, 4) O_LD = hw_op('ld', OM_ALU_RPT1 + [OM_MCU_CACHE_MODE_LD], 1, 3) O_ST = hw_direct_op('st', [OM_MCU_CACHE_MODE_ST], 0, 6) diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index e993f2a131a..639d63b9e98 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -250,6 +250,43 @@ trans_store_output_vs(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref src) return pco_uvsw_write(&tctx->b, src, vtxout_addr, .rpt = chans); } +static inline pco_instr *build_itr(pco_builder *b, + pco_ref dest, + enum pco_drc drc, + pco_ref coeffs, + pco_ref wcoeffs, + unsigned _itr_count, + enum pco_itr_mode itr_mode, + bool d) +{ + pco_func *func = pco_cursor_func(b->cursor); + pco_ref itr_count = pco_ref_val16(_itr_count); + bool p = !pco_ref_is_null(wcoeffs); + pco_instr *instr = pco_instr_create(func, 1, 3 + p); + + instr->op = d ? (p ? PCO_OP_DITRP : PCO_OP_DITR) + : (p ? PCO_OP_FITRP : PCO_OP_FITR); + + instr->dest[0] = dest; + instr->src[0] = pco_ref_drc(drc); + instr->src[1] = coeffs; + instr->src[2] = p ? wcoeffs : itr_count; + if (p) + instr->src[3] = itr_count; + + pco_instr_set_itr_mode(instr, itr_mode); + + if (d) + pco_fence(b); + + pco_builder_insert_instr(b, instr); + + if (d) + pco_fence(b); + + return instr; +} + /** * \brief Translates a NIR fs load_input intrinsic into PCO. * @@ -332,7 +369,6 @@ trans_load_input_fs(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref dest) pco_ref coeffs = pco_ref_hwreg_vec(coeffs_index, PCO_REG_CLASS_COEFF, ROGUE_USC_COEFFICIENT_SET_SIZE * chans); - pco_ref itr_count = pco_ref_val16(chans); bool usc_itrsmp_enhanced = PVR_HAS_FEATURE(tctx->pco_ctx->dev_info, usc_itrsmp_enhanced); @@ -348,23 +384,14 @@ trans_load_input_fs(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref dest) PCO_REG_CLASS_COEFF, ROGUE_USC_COEFFICIENT_SET_SIZE); - if (usc_itrsmp_enhanced) - pco_fence(&tctx->b); - - return usc_itrsmp_enhanced ? pco_ditrp(&tctx->b, - dest, - pco_ref_drc(PCO_DRC_0), - coeffs, - wcoeffs, - itr_count, - .itr_mode = itr_mode) - : pco_fitrp(&tctx->b, - dest, - pco_ref_drc(PCO_DRC_0), - coeffs, - wcoeffs, - itr_count, - .itr_mode = itr_mode); + return build_itr(&tctx->b, + dest, + PCO_DRC_0, + coeffs, + wcoeffs, + chans, + itr_mode, + usc_itrsmp_enhanced); } case INTERP_MODE_FLAT: { @@ -377,21 +404,14 @@ trans_load_input_fs(trans_ctx *tctx, nir_intrinsic_instr *intr, pco_ref dest) } case INTERP_MODE_NOPERSPECTIVE: - if (usc_itrsmp_enhanced) - pco_fence(&tctx->b); - - return usc_itrsmp_enhanced ? pco_ditr(&tctx->b, - dest, - pco_ref_drc(PCO_DRC_0), - coeffs, - itr_count, - .itr_mode = itr_mode) - : pco_fitr(&tctx->b, - dest, - pco_ref_drc(PCO_DRC_0), - coeffs, - itr_count, - .itr_mode = itr_mode); + return build_itr(&tctx->b, + dest, + PCO_DRC_0, + coeffs, + pco_ref_null(), + chans, + itr_mode, + usc_itrsmp_enhanced); default: /* Should have been previously lowered. */