From 84e8e899cddb2d3cacc5d405b76375264b7fec26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Wed, 28 May 2025 01:27:03 -0400 Subject: [PATCH] ac/nir: add an option not to gather values in ac_nir_gather_prerast_store_output_info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will be needed in the next commit. Reviewed-by: Pierre-Eric Pelloux-Prayer Reviewed-by: Timur Kristóf Part-of: --- src/amd/common/nir/ac_nir_helpers.h | 5 ++--- src/amd/common/nir/ac_nir_lower_legacy_vs.c | 2 +- src/amd/common/nir/ac_nir_lower_ngg.c | 2 +- src/amd/common/nir/ac_nir_lower_ngg_gs.c | 2 +- src/amd/common/nir/ac_nir_prerast_utils.c | 20 ++++++++++++-------- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/amd/common/nir/ac_nir_helpers.h b/src/amd/common/nir/ac_nir_helpers.h index daaa48e3e83..cada6d02bf7 100644 --- a/src/amd/common/nir/ac_nir_helpers.h +++ b/src/amd/common/nir/ac_nir_helpers.h @@ -116,9 +116,8 @@ ac_nir_store_var_components(nir_builder *b, nir_variable *var, nir_def *value, unsigned component, unsigned writemask); void -ac_nir_gather_prerast_store_output_info(nir_builder *b, - nir_intrinsic_instr *intrin, - ac_nir_prerast_out *out); +ac_nir_gather_prerast_store_output_info(nir_builder *b, nir_intrinsic_instr *intrin, + ac_nir_prerast_out *out, bool gather_values); void ac_nir_export_primitive(nir_builder *b, nir_def *prim, nir_def *row); diff --git a/src/amd/common/nir/ac_nir_lower_legacy_vs.c b/src/amd/common/nir/ac_nir_lower_legacy_vs.c index 0a5425b24f0..855532b9ba8 100644 --- a/src/amd/common/nir/ac_nir_lower_legacy_vs.c +++ b/src/amd/common/nir/ac_nir_lower_legacy_vs.c @@ -26,7 +26,7 @@ gather_outputs(nir_builder *b, nir_function_impl *impl, ac_nir_prerast_out *out) if (intrin->intrinsic != nir_intrinsic_store_output) continue; - ac_nir_gather_prerast_store_output_info(b, intrin, out); + ac_nir_gather_prerast_store_output_info(b, intrin, out, true); nir_instr_remove(instr); } } diff --git a/src/amd/common/nir/ac_nir_lower_ngg.c b/src/amd/common/nir/ac_nir_lower_ngg.c index ed0b1f7d138..d88d6fe239d 100644 --- a/src/amd/common/nir/ac_nir_lower_ngg.c +++ b/src/amd/common/nir/ac_nir_lower_ngg.c @@ -1541,7 +1541,7 @@ ngg_nogs_gather_outputs(nir_builder *b, struct exec_list *cf_list, lower_ngg_nog if (intrin->intrinsic != nir_intrinsic_store_output) continue; - ac_nir_gather_prerast_store_output_info(b, intrin, &s->out); + ac_nir_gather_prerast_store_output_info(b, intrin, &s->out, true); nir_instr_remove(instr); } } diff --git a/src/amd/common/nir/ac_nir_lower_ngg_gs.c b/src/amd/common/nir/ac_nir_lower_ngg_gs.c index c63dad543df..153ccadd084 100644 --- a/src/amd/common/nir/ac_nir_lower_ngg_gs.c +++ b/src/amd/common/nir/ac_nir_lower_ngg_gs.c @@ -123,7 +123,7 @@ ngg_gs_clear_primflags(nir_builder *b, nir_def *num_vertices, unsigned stream, l static bool lower_ngg_gs_store_output(nir_builder *b, nir_intrinsic_instr *intrin, lower_ngg_gs_state *s) { - ac_nir_gather_prerast_store_output_info(b, intrin, &s->out); + ac_nir_gather_prerast_store_output_info(b, intrin, &s->out, true); nir_instr_remove(&intrin->instr); return true; } diff --git a/src/amd/common/nir/ac_nir_prerast_utils.c b/src/amd/common/nir/ac_nir_prerast_utils.c index 7d44b6fdf78..efb39f36cfb 100644 --- a/src/amd/common/nir/ac_nir_prerast_utils.c +++ b/src/amd/common/nir/ac_nir_prerast_utils.c @@ -86,7 +86,8 @@ ac_nir_calc_io_off(nir_builder *b, unsigned component, nir_def *io_offset, nir_d * - 64-bit outputs are lowered * - no indirect indexing is present */ -void ac_nir_gather_prerast_store_output_info(nir_builder *b, nir_intrinsic_instr *intrin, ac_nir_prerast_out *out) +void ac_nir_gather_prerast_store_output_info(nir_builder *b, nir_intrinsic_instr *intrin, + ac_nir_prerast_out *out, bool gather_values) { assert(intrin->intrinsic == nir_intrinsic_store_output); assert(nir_src_is_const(intrin->src[1]) && !nir_src_as_uint(intrin->src[1])); @@ -155,16 +156,19 @@ void ac_nir_gather_prerast_store_output_info(nir_builder *b, nir_intrinsic_instr nir_def *store_component = nir_channel(b, intrin->src[0].ssa, i); if (non_dedicated_16bit) { - if (io_sem.high_16bits) { - nir_def *lo = output[c] ? nir_unpack_32_2x16_split_x(b, output[c]) : nir_imm_intN_t(b, 0, 16); - output[c] = nir_pack_32_2x16_split(b, lo, store_component); - } else { - nir_def *hi = output[c] ? nir_unpack_32_2x16_split_y(b, output[c]) : nir_imm_intN_t(b, 0, 16); - output[c] = nir_pack_32_2x16_split(b, store_component, hi); + if (gather_values) { + if (io_sem.high_16bits) { + nir_def *lo = output[c] ? nir_unpack_32_2x16_split_x(b, output[c]) : nir_imm_intN_t(b, 0, 16); + output[c] = nir_pack_32_2x16_split(b, lo, store_component); + } else { + nir_def *hi = output[c] ? nir_unpack_32_2x16_split_y(b, output[c]) : nir_imm_intN_t(b, 0, 16); + output[c] = nir_pack_32_2x16_split(b, store_component, hi); + } } type[c] = nir_type_uint32; } else { - output[c] = store_component; + if (gather_values) + output[c] = store_component; type[c] = src_type; } }