diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index a896deab094..86917935bec 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -3011,7 +3011,8 @@ intrinsic("smp_pco", src_comp=[16, 4, 4], dest_comp=0, indices=[SMP_FLAGS_PCO, R # smp_coeffs_pco(data, tex_state, smp_state) # Returns the calculated sampling coefficients for the given data and state words. -intrinsic("smp_coeffs_pco", src_comp=[16, 4, 4], dest_comp=8, indices=[SMP_FLAGS_PCO, RANGE], bit_sizes=[32]) +# Actually outputs 7/14 components, but NIR doesn't support those for num_components, so fake it as 16 for now. +intrinsic("smp_coeffs_pco", src_comp=[16, 4, 4], dest_comp=16, indices=[SMP_FLAGS_PCO, RANGE], bit_sizes=[32]) # smp_raw_pco(data, tex_state, smp_state) # Returns the raw sampling data for the given data and state words. diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index bfa853fe040..269602d1f5c 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -1697,8 +1697,11 @@ static pco_instr *lower_smp(trans_ctx *tctx, enum pco_sb_mode sb_mode = PCO_SB_MODE_NONE; switch (intr->intrinsic) { case nir_intrinsic_smp_coeffs_pco: - /* Shrink the destination to its actual size. */ - *dest = pco_ref_chans(*dest, ROGUE_SMP_COEFF_COUNT); + /* Shrink the destination to its actual size. + * Trilinear filtering will produce two sets of coeffs; + * reserve both just in case so that we don't clobber output regs. + */ + *dest = pco_ref_chans(*dest, ROGUE_SMP_COEFF_COUNT * 2u); chans = 1; /* Chans must be 1 for coeff mode. */ sb_mode = PCO_SB_MODE_COEFFS;