diff --git a/src/amd/vulkan/nir/radv_nir_lower_intrinsics_early.c b/src/amd/vulkan/nir/radv_nir_lower_intrinsics_early.c index 43eb3e8c792..747283e5f3a 100644 --- a/src/amd/vulkan/nir/radv_nir_lower_intrinsics_early.c +++ b/src/amd/vulkan/nir/radv_nir_lower_intrinsics_early.c @@ -10,49 +10,37 @@ #include "nir_builder.h" #include "radv_nir.h" +static bool +pass(nir_builder *b, nir_intrinsic_instr *intrin, void *data) +{ + bool *lower_view_index_to_zero = data; + nir_def *def = NULL; + b->cursor = nir_before_instr(&intrin->instr); + + switch (intrin->intrinsic) { + case nir_intrinsic_is_sparse_texels_resident: + def = nir_ieq_imm(b, intrin->src[0].ssa, 0); + break; + case nir_intrinsic_sparse_residency_code_and: + def = nir_ior(b, intrin->src[0].ssa, intrin->src[1].ssa); + break; + case nir_intrinsic_load_view_index: + if (!(*lower_view_index_to_zero)) + return false; + + def = nir_imm_zero(b, 1, 32); + break; + default: + return false; + } + + nir_def_replace(&intrin->def, def); + return true; +} + bool radv_nir_lower_intrinsics_early(nir_shader *nir, bool lower_view_index_to_zero) { - nir_function_impl *entry = nir_shader_get_entrypoint(nir); - bool progress = false; - nir_builder b = nir_builder_create(entry); - - nir_foreach_block (block, entry) { - nir_foreach_instr_safe (instr, block) { - if (instr->type != nir_instr_type_intrinsic) - continue; - - nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); - b.cursor = nir_before_instr(&intrin->instr); - - nir_def *def = NULL; - switch (intrin->intrinsic) { - case nir_intrinsic_is_sparse_texels_resident: - def = nir_ieq_imm(&b, intrin->src[0].ssa, 0); - break; - case nir_intrinsic_sparse_residency_code_and: - def = nir_ior(&b, intrin->src[0].ssa, intrin->src[1].ssa); - break; - case nir_intrinsic_load_view_index: - if (!lower_view_index_to_zero) - continue; - def = nir_imm_zero(&b, 1, 32); - break; - default: - continue; - } - - nir_def_rewrite_uses(&intrin->def, def); - - nir_instr_remove(instr); - progress = true; - } - } - - if (progress) - nir_metadata_preserve(entry, nir_metadata_control_flow); - else - nir_metadata_preserve(entry, nir_metadata_all); - - return progress; + return nir_shader_intrinsics_pass(nir, pass, nir_metadata_control_flow, + &lower_view_index_to_zero); }