diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py index 299e309de63..b629cb17c5d 100644 --- a/src/compiler/nir/nir_opcodes.py +++ b/src/compiler/nir/nir_opcodes.py @@ -328,6 +328,8 @@ unop_numeric_convert_mp("f2u", tuint16, tfloat32) unop_numeric_convert_mp("i2f", tfloat16, tint32) unop_numeric_convert_mp("u2f", tfloat16, tuint32) +unop_numeric_convert("f2i32_rtne", tint32, tfloat32, "(int32_t)_mesa_roundevenf(src0)") + # Unary floating-point rounding operations. diff --git a/src/imagination/pco/pco_nir_tex.c b/src/imagination/pco/pco_nir_tex.c index f956446ebd3..e86d1ca4f17 100644 --- a/src/imagination/pco/pco_nir_tex.c +++ b/src/imagination/pco/pco_nir_tex.c @@ -190,7 +190,9 @@ static inline unsigned process_coords(nir_builder *b, return num_comps; *float_array_index = nir_channel(b, *float_coords, num_comps - 1); - *int_array_index = nir_channel(b, *int_coords, num_comps - 1); + *int_array_index = coords_are_float + ? nir_f2i32_rtne(b, *float_array_index) + : nir_channel(b, *int_coords, num_comps - 1); *float_coords = nir_trim_vector(b, *float_coords, num_comps - 1); *int_coords = nir_trim_vector(b, *int_coords, num_comps - 1); diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index a4dd6170bb6..e54ec6183bc 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -2242,6 +2242,10 @@ static pco_instr *trans_alu(trans_ctx *tctx, nir_alu_instr *alu) .roundzero = true); break; + case nir_op_f2i32_rtne: + instr = pco_pck(&tctx->b, dest, src[0], .pck_fmt = PCO_PCK_FMT_S32); + break; + case nir_op_f2u32: instr = pco_pck(&tctx->b, dest,