From e070a9e8d00700dbcbc3f994bc20f2bf2445e03b Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Tue, 14 Feb 2023 10:19:44 +0800 Subject: [PATCH] ac/nir: move store_var_components to common place MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It will be shared by other nir lowering too. Reviewed-by: Marek Olšák Reviewed-by: Timur Kristóf Signed-off-by: Qiang Yu Part-of: --- src/amd/common/ac_nir.c | 25 +++++++++++++++++++++++++ src/amd/common/ac_nir.h | 4 ++++ src/amd/common/ac_nir_lower_ngg.c | 29 ++--------------------------- 3 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/amd/common/ac_nir.c b/src/amd/common/ac_nir.c index 4fb4088cc27..3bdf9c7675f 100644 --- a/src/amd/common/ac_nir.c +++ b/src/amd/common/ac_nir.c @@ -45,6 +45,31 @@ ac_nir_unpack_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct a return nir_ubfe_imm(b, value, rshift, bitwidth); } +void +ac_nir_store_var_components(nir_builder *b, nir_variable *var, nir_ssa_def *value, + unsigned component, unsigned writemask) +{ + /* component store */ + if (value->num_components != 4) { + nir_ssa_def *undef = nir_ssa_undef(b, 1, value->bit_size); + + /* add undef component before and after value to form a vec4 */ + nir_ssa_def *comp[4]; + for (int i = 0; i < 4; i++) { + comp[i] = (i >= component && i < component + value->num_components) ? + nir_channel(b, value, i - component) : undef; + } + + value = nir_vec(b, comp, 4); + writemask <<= component; + } else { + /* if num_component==4, there should be no component offset */ + assert(component == 0); + } + + nir_store_var(b, var, value, writemask); +} + void ac_nir_export_primitive(nir_builder *b, nir_ssa_def *prim) { diff --git a/src/amd/common/ac_nir.h b/src/amd/common/ac_nir.h index 1885100d89b..2197282a1e8 100644 --- a/src/amd/common/ac_nir.h +++ b/src/amd/common/ac_nir.h @@ -73,6 +73,10 @@ nir_ssa_def * ac_nir_unpack_arg(nir_builder *b, const struct ac_shader_args *ac_args, struct ac_arg arg, unsigned rshift, unsigned bitwidth); +void +ac_nir_store_var_components(nir_builder *b, nir_variable *var, nir_ssa_def *value, + unsigned component, unsigned writemask); + void ac_nir_export_primitive(nir_builder *b, nir_ssa_def *prim); diff --git a/src/amd/common/ac_nir_lower_ngg.c b/src/amd/common/ac_nir_lower_ngg.c index 2d133642bca..4b20018a5d9 100644 --- a/src/amd/common/ac_nir_lower_ngg.c +++ b/src/amd/common/ac_nir_lower_ngg.c @@ -606,31 +606,6 @@ emit_store_ngg_nogs_es_primitive_id(nir_builder *b, lower_ngg_nogs_state *st) b->shader->info.outputs_written |= VARYING_BIT_PRIMITIVE_ID; } -static void -store_var_components(nir_builder *b, nir_variable *var, nir_ssa_def *value, - unsigned component, unsigned writemask) -{ - /* component store */ - if (value->num_components != 4) { - nir_ssa_def *undef = nir_ssa_undef(b, 1, value->bit_size); - - /* add undef component before and after value to form a vec4 */ - nir_ssa_def *comp[4]; - for (int i = 0; i < 4; i++) { - comp[i] = (i >= component && i < component + value->num_components) ? - nir_channel(b, value, i - component) : undef; - } - - value = nir_vec(b, comp, 4); - writemask <<= component; - } else { - /* if num_component==4, there should be no component offset */ - assert(component == 0); - } - - nir_store_var(b, var, value, writemask); -} - static void add_clipdist_bit(nir_builder *b, nir_ssa_def *dist, unsigned index, nir_variable *mask) { @@ -671,7 +646,7 @@ remove_culling_shader_output(nir_builder *b, nir_instr *instr, void *state) nir_io_semantics io_sem = nir_intrinsic_io_semantics(intrin); switch (io_sem.location) { case VARYING_SLOT_POS: - store_var_components(b, s->position_value_var, store_val, component, writemask); + ac_nir_store_var_components(b, s->position_value_var, store_val, component, writemask); break; case VARYING_SLOT_CLIP_DIST0: case VARYING_SLOT_CLIP_DIST1: { @@ -688,7 +663,7 @@ remove_culling_shader_output(nir_builder *b, nir_instr *instr, void *state) break; } case VARYING_SLOT_CLIP_VERTEX: - store_var_components(b, s->clip_vertex_var, store_val, component, writemask); + ac_nir_store_var_components(b, s->clip_vertex_var, store_val, component, writemask); break; default: break;