nir: add filter parameter to nir_lower_array_deref_of_vec

To be used by latter commits to limit the lowering to specific
variables.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Signed-off-by: Qiang Yu <yuq825@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29799>
This commit is contained in:
Qiang Yu
2024-06-21 16:26:37 +08:00
committed by Marge Bot
parent 370ed7b021
commit 3151f5ec47
6 changed files with 12 additions and 6 deletions

View File

@@ -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");

View File

@@ -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);

View File

@@ -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,

View File

@@ -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;
}

View File

@@ -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

View File

@@ -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 */