From 2201b6ff96c7a723a2d174554c6b3f48d2849083 Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Sat, 28 Mar 2026 18:47:43 +0000 Subject: [PATCH] pco: amend tg4 lowering Use lower_tg4_offsets to take care of explicit offsets, and just swizzle the texels in the order defined by textureGather* Fixes: 46c9239c111 ("pvr, pco: initial texture gather support with gather sampler") Signed-off-by: Simon Perretta Acked-by: Frank Binns (cherry picked from commit 56b8dc92a96c264549dfed368ccec919879c20dd) Part-of: --- .pick_status.json | 2 +- src/imagination/pco/pco_nir.c | 1 + src/imagination/pco/pco_nir_tex.c | 16 +++++----------- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 74f08aa4143..8a9cf14bc38 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -854,7 +854,7 @@ "description": "pco: amend tg4 lowering", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "46c9239c11147b835659df2dedaa1e72263b99b2", "notes": null diff --git a/src/imagination/pco/pco_nir.c b/src/imagination/pco/pco_nir.c index 26687beb401..8f388994482 100644 --- a/src/imagination/pco/pco_nir.c +++ b/src/imagination/pco/pco_nir.c @@ -902,6 +902,7 @@ void pco_lower_nir(pco_ctx *ctx, nir_shader *nir, pco_data *data) nir_lower_tex, &(nir_lower_tex_options){ .lower_txd_cube_map = true, + .lower_tg4_offsets = true, }); NIR_PASS(_, nir, pco_nir_lower_tex, data, ctx); diff --git a/src/imagination/pco/pco_nir_tex.c b/src/imagination/pco/pco_nir_tex.c index 9d1b4beef44..77d7a48a990 100644 --- a/src/imagination/pco/pco_nir_tex.c +++ b/src/imagination/pco/pco_nir_tex.c @@ -407,19 +407,13 @@ nir_intrinsic_instr *pco_emit_nir_smp(nir_builder *b, pco_smp_params *params) static nir_def * lower_tex_gather(nir_builder *b, nir_tex_instr *tex, nir_def *raw_data) { - unsigned swiz[ARRAY_SIZE(tex->tg4_offsets)]; - for (unsigned u = 0; u < ARRAY_SIZE(tex->tg4_offsets); ++u) { - unsigned offset = ARRAY_SIZE(*tex->tg4_offsets) * tex->tg4_offsets[u][0]; - offset += tex->tg4_offsets[u][1]; - offset *= ARRAY_SIZE(tex->tg4_offsets); - offset += tex->component; + assert(!nir_tex_instr_has_explicit_tg4_offsets(tex)); - swiz[u] = offset; - } +#define TG4_SEL(sample) (((sample) * 4) + tex->component) + unsigned swiz[] = { TG4_SEL(2), TG4_SEL(3), TG4_SEL(1), TG4_SEL(0) }; +#undef TG4_SEL - nir_def *result = nir_swizzle(b, raw_data, swiz, ARRAY_SIZE(swiz)); - - return result; + return nir_swizzle(b, raw_data, swiz, ARRAY_SIZE(swiz)); } static nir_def *lower_tex_shadow(nir_builder *b,