Module: Mesa Branch: main Commit: 95da0a9c96221238d6f1e4d6ff8b31077b5beaa1 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=95da0a9c96221238d6f1e4d6ff8b31077b5beaa1
Author: Timothy Arceri <tarc...@itsqueeze.com> Date: Tue Oct 24 12:34:43 2023 +1100 nir: move build_write_masked_stores() to nir builder We will reused this in the following patch. Acked-by: Marek Olšák <marek.ol...@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25860> --- src/compiler/nir/nir_builder.h | 34 +++++++++++++++++++++ src/compiler/nir/nir_lower_array_deref_of_vec.c | 40 ++----------------------- 2 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/compiler/nir/nir_builder.h b/src/compiler/nir/nir_builder.h index c77c95130a2..0084d7e0d9d 100644 --- a/src/compiler/nir/nir_builder.h +++ b/src/compiler/nir/nir_builder.h @@ -1640,6 +1640,40 @@ nir_store_deref(nir_builder *build, nir_deref_instr *deref, (enum gl_access_qualifier)0); } +static inline void +nir_build_write_masked_store(nir_builder *b, nir_deref_instr *vec_deref, + nir_def *value, unsigned component) +{ + assert(value->num_components == 1); + unsigned num_components = glsl_get_components(vec_deref->type); + assert(num_components > 1 && num_components <= NIR_MAX_VEC_COMPONENTS); + + nir_def *u = nir_undef(b, 1, value->bit_size); + nir_def *comps[NIR_MAX_VEC_COMPONENTS]; + for (unsigned i = 0; i < num_components; i++) + comps[i] = (i == component) ? value : u; + + nir_def *vec = nir_vec(b, comps, num_components); + nir_store_deref(b, vec_deref, vec, (1u << component)); +} + +static inline void +nir_build_write_masked_stores(nir_builder *b, nir_deref_instr *vec_deref, + nir_def *value, nir_def *index, + unsigned start, unsigned end) +{ + if (start == end - 1) { + nir_build_write_masked_store(b, vec_deref, value, start); + } else { + unsigned mid = start + (end - start) / 2; + nir_push_if(b, nir_ilt_imm(b, index, mid)); + nir_build_write_masked_stores(b, vec_deref, value, index, start, mid); + nir_push_else(b, NULL); + nir_build_write_masked_stores(b, vec_deref, value, index, mid, end); + nir_pop_if(b, NULL); + } +} + static inline void nir_copy_deref_with_access(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src, diff --git a/src/compiler/nir/nir_lower_array_deref_of_vec.c b/src/compiler/nir/nir_lower_array_deref_of_vec.c index c5da05798c9..2a8549eb8c2 100644 --- a/src/compiler/nir/nir_lower_array_deref_of_vec.c +++ b/src/compiler/nir/nir_lower_array_deref_of_vec.c @@ -24,40 +24,6 @@ #include "nir.h" #include "nir_builder.h" -static void -build_write_masked_store(nir_builder *b, nir_deref_instr *vec_deref, - nir_def *value, unsigned component) -{ - assert(value->num_components == 1); - unsigned num_components = glsl_get_components(vec_deref->type); - assert(num_components > 1 && num_components <= NIR_MAX_VEC_COMPONENTS); - - nir_def *u = nir_undef(b, 1, value->bit_size); - nir_def *comps[NIR_MAX_VEC_COMPONENTS]; - for (unsigned i = 0; i < num_components; i++) - comps[i] = (i == component) ? value : u; - - nir_def *vec = nir_vec(b, comps, num_components); - nir_store_deref(b, vec_deref, vec, (1u << component)); -} - -static void -build_write_masked_stores(nir_builder *b, nir_deref_instr *vec_deref, - nir_def *value, nir_def *index, - unsigned start, unsigned end) -{ - if (start == end - 1) { - build_write_masked_store(b, vec_deref, value, start); - } else { - unsigned mid = start + (end - start) / 2; - nir_push_if(b, nir_ilt_imm(b, index, mid)); - build_write_masked_stores(b, vec_deref, value, index, start, mid); - nir_push_else(b, NULL); - build_write_masked_stores(b, vec_deref, value, index, mid, end); - nir_pop_if(b, NULL); - } -} - static bool nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, nir_variable_mode modes, @@ -117,14 +83,14 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, * replace it with anything. */ if (index < num_components) - build_write_masked_store(&b, vec_deref, value, index); + nir_build_write_masked_store(&b, vec_deref, value, index); } else { if (!(options & nir_lower_indirect_array_deref_of_vec_store)) continue; nir_def *index = deref->arr.index.ssa; - build_write_masked_stores(&b, vec_deref, value, index, - 0, num_components); + nir_build_write_masked_stores(&b, vec_deref, value, index, + 0, num_components); } nir_instr_remove(&intrin->instr);