From cd9d55201f7db1a2ee68cfae45011b90b181c2ed Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Tue, 23 Sep 2025 21:14:07 +0100 Subject: [PATCH] pco: use interpolated input intrinsics for shader io Signed-off-by: Simon Perretta Acked-by: Frank Binns Part-of: --- src/imagination/pco/pco_nir.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index b3704e2f481..6934fb7db94 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -143,8 +143,10 @@ static bool frag_in_scalar_filter(const nir_instr *instr, const void *data) nir_shader *nir = (nir_shader *)data; nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr); - if (intr->intrinsic != nir_intrinsic_load_input) + if (intr->intrinsic != nir_intrinsic_load_input && + intr->intrinsic != nir_intrinsic_load_interpolated_input) { return false; + } gl_varying_slot location = nir_intrinsic_io_semantics(intr).location; if (location == VARYING_SLOT_POS) @@ -154,7 +156,16 @@ static bool frag_in_scalar_filter(const nir_instr *instr, const void *data) nir_find_variable_with_location(nir, nir_var_shader_in, location); assert(var); - if (var->data.interpolation == INTERP_MODE_FLAT) + enum glsl_interp_mode interp_mode = var->data.interpolation; + + if (intr->intrinsic == nir_intrinsic_load_interpolated_input) { + nir_intrinsic_instr *bary = nir_src_as_intrinsic(intr->src[0]); + assert(bary); + + interp_mode = nir_intrinsic_interp_mode(bary); + } + + if (interp_mode == INTERP_MODE_FLAT) return true; return false; @@ -829,7 +840,8 @@ void pco_lower_nir(pco_ctx *ctx, nir_shader *nir, pco_data *data) nir_lower_io, nir_var_shader_in | nir_var_shader_out, glsl_type_size, - nir_lower_io_lower_64bit_to_32); + nir_lower_io_lower_64bit_to_32 | + nir_lower_io_use_interpolated_input_intrinsics); nir_variable_mode vec_modes = nir->info.stage == MESA_SHADER_FRAGMENT ? nir_var_shader_out