From 34b4b35ca8c74efb7c2f835dd703082308737291 Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Mon, 29 Sep 2025 14:55:41 +0100 Subject: [PATCH] pco: apply rounding mode to relevant conversion ops The rounding behaviour on [iu]2f32 ops needs to be explicitly set in order to match the implicit behaviour described in the KHR_shader_float_controls properties. Fixes: e306abc6e62 ("pvr: implement KHR_shader_float_controls") Signed-off-by: Simon Perretta Acked-by: Frank Binns Part-of: --- src/imagination/pco/pco_trans_nir.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index 5f980ae0725..ee7afeb2fad 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -31,6 +31,7 @@ typedef struct _trans_ctx { pco_builder b; /** Builder. */ mesa_shader_stage stage; /** Shader stage. */ enum pco_cf_node_flag flag; /** Implementation-defined control-flow flag. */ + bool ftz32b; bool olchk; BITSET_WORD *float_types; /** NIR SSA float vars. */ @@ -3299,14 +3300,16 @@ static pco_instr *trans_alu(trans_ctx *tctx, nir_alu_instr *alu) instr = pco_unpck(&tctx->b, dest, pco_ref_elem(src[0], 0), - .pck_fmt = PCO_PCK_FMT_S32); + .pck_fmt = PCO_PCK_FMT_S32, + .roundzero = tctx->ftz32b); break; case nir_op_u2f32: instr = pco_unpck(&tctx->b, dest, pco_ref_elem(src[0], 0), - .pck_fmt = PCO_PCK_FMT_U32); + .pck_fmt = PCO_PCK_FMT_U32, + .roundzero = tctx->ftz32b); break; case nir_op_fmin: @@ -3794,6 +3797,8 @@ pco_trans_nir(pco_ctx *ctx, nir_shader *nir, pco_data *data, void *mem_ctx) .pco_ctx = ctx, .shader = shader, .stage = shader->stage, + .ftz32b = + nir_is_rounding_mode_rtz(nir->info.float_controls_execution_mode, 32), }; if (shader->stage == MESA_SHADER_FRAGMENT)