From 3151f5ec472b870b557145a9c2f7bf13f7bca481 Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Fri, 21 Jun 2024 16:26:37 +0800 Subject: [PATCH] nir: add filter parameter to nir_lower_array_deref_of_vec MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To be used by latter commits to limit the lowering to specific variables. Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/amd/vulkan/radv_pipeline_graphics.c | 4 ++-- src/broadcom/vulkan/v3dv_pipeline.c | 2 +- src/compiler/nir/nir.h | 1 + src/compiler/nir/nir_lower_array_deref_of_vec.c | 7 ++++++- src/intel/compiler/brw_nir.c | 2 +- src/intel/compiler/elk/elk_nir.c | 2 +- 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/amd/vulkan/radv_pipeline_graphics.c b/src/amd/vulkan/radv_pipeline_graphics.c index 967261c3146..e4bb2595834 100644 --- a/src/amd/vulkan/radv_pipeline_graphics.c +++ b/src/amd/vulkan/radv_pipeline_graphics.c @@ -1233,8 +1233,8 @@ radv_link_shaders(const struct radv_device *device, struct radv_shader_stage *pr nir_lower_direct_array_deref_of_vec_load | nir_lower_indirect_array_deref_of_vec_load | nir_lower_direct_array_deref_of_vec_store | nir_lower_indirect_array_deref_of_vec_store; - NIR_PASS(progress, producer, nir_lower_array_deref_of_vec, nir_var_shader_out, array_deref_of_vec_options); - NIR_PASS(progress, consumer, nir_lower_array_deref_of_vec, nir_var_shader_in, array_deref_of_vec_options); + NIR_PASS(progress, producer, nir_lower_array_deref_of_vec, nir_var_shader_out, NULL, array_deref_of_vec_options); + NIR_PASS(progress, consumer, nir_lower_array_deref_of_vec, nir_var_shader_in, NULL, array_deref_of_vec_options); nir_lower_io_arrays_to_elements(producer, consumer); nir_validate_shader(producer, "after nir_lower_io_arrays_to_elements"); diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c index 0a9e72d3407..7602bb68aec 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -323,7 +323,7 @@ preprocess_nir(nir_shader *nir) nir_var_function_temp, 2); NIR_PASS(_, nir, nir_lower_array_deref_of_vec, - nir_var_mem_ubo | nir_var_mem_ssbo, + nir_var_mem_ubo | nir_var_mem_ssbo, NULL, nir_lower_direct_array_deref_of_vec_load); NIR_PASS(_, nir, nir_lower_frexp); diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index 85ed1c874c0..4ac6f38dbd5 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -5348,6 +5348,7 @@ typedef enum { } nir_lower_array_deref_of_vec_options; bool nir_lower_array_deref_of_vec(nir_shader *shader, nir_variable_mode modes, + bool (*filter)(nir_variable *), nir_lower_array_deref_of_vec_options options); bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes, 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 595095c8f1d..1cd89f9ee96 100644 --- a/src/compiler/nir/nir_lower_array_deref_of_vec.c +++ b/src/compiler/nir/nir_lower_array_deref_of_vec.c @@ -27,6 +27,7 @@ static bool nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, nir_variable_mode modes, + bool (*filter)(nir_variable *), nir_lower_array_deref_of_vec_options options) { bool progress = false; @@ -66,6 +67,9 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, if (!glsl_type_is_vector(vec_deref->type)) continue; + if (filter && !filter(nir_deref_instr_get_variable(deref))) + continue; + assert(intrin->num_components == 1); unsigned num_components = glsl_get_components(vec_deref->type); assert(num_components > 1 && num_components <= NIR_MAX_VEC_COMPONENTS); @@ -147,12 +151,13 @@ nir_lower_array_deref_of_vec_impl(nir_function_impl *impl, */ bool nir_lower_array_deref_of_vec(nir_shader *shader, nir_variable_mode modes, + bool (*filter)(nir_variable *), nir_lower_array_deref_of_vec_options options) { bool progress = false; nir_foreach_function_impl(impl, shader) { - if (nir_lower_array_deref_of_vec_impl(impl, modes, options)) + if (nir_lower_array_deref_of_vec_impl(impl, modes, filter, options)) progress = true; } diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index 42c90d4adfc..5741eff11a3 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -1119,7 +1119,7 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir, * messages. */ OPT(nir_lower_array_deref_of_vec, - nir_var_mem_ubo | nir_var_mem_ssbo, + nir_var_mem_ubo | nir_var_mem_ssbo, NULL, nir_lower_direct_array_deref_of_vec_load); /* Clamp load_per_vertex_input of the TCS stage so that we do not generate diff --git a/src/intel/compiler/elk/elk_nir.c b/src/intel/compiler/elk/elk_nir.c index f107edf4079..e46e628a27e 100644 --- a/src/intel/compiler/elk/elk_nir.c +++ b/src/intel/compiler/elk/elk_nir.c @@ -1001,7 +1001,7 @@ elk_preprocess_nir(const struct elk_compiler *compiler, nir_shader *nir, * messages. */ OPT(nir_lower_array_deref_of_vec, - nir_var_mem_ubo | nir_var_mem_ssbo, + nir_var_mem_ubo | nir_var_mem_ssbo, NULL, nir_lower_direct_array_deref_of_vec_load); /* Get rid of split copies */