1 /*
2 * Copyright © 2016 Red Hat.
3 * Copyright © 2016 Bas Nieuwenhuizen
4 * Copyright © 2023 Valve Corporation
5 *
6 * SPDX-License-Identifier: MIT
7 */
8
9 #include "nir.h"
10 #include "nir_builder.h"
11 #include "radv_nir.h"
12
13 bool
radv_nir_lower_intrinsics_early(nir_shader * nir,bool lower_view_index_to_zero)14 radv_nir_lower_intrinsics_early(nir_shader *nir, bool lower_view_index_to_zero)
15 {
16 nir_function_impl *entry = nir_shader_get_entrypoint(nir);
17 bool progress = false;
18 nir_builder b = nir_builder_create(entry);
19
20 nir_foreach_block (block, entry) {
21 nir_foreach_instr_safe (instr, block) {
22 if (instr->type != nir_instr_type_intrinsic)
23 continue;
24
25 nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
26 b.cursor = nir_before_instr(&intrin->instr);
27
28 nir_def *def = NULL;
29 switch (intrin->intrinsic) {
30 case nir_intrinsic_is_sparse_texels_resident:
31 def = nir_ieq_imm(&b, intrin->src[0].ssa, 0);
32 break;
33 case nir_intrinsic_sparse_residency_code_and:
34 def = nir_ior(&b, intrin->src[0].ssa, intrin->src[1].ssa);
35 break;
36 case nir_intrinsic_load_view_index:
37 if (!lower_view_index_to_zero)
38 continue;
39 def = nir_imm_zero(&b, 1, 32);
40 break;
41 default:
42 continue;
43 }
44
45 nir_def_rewrite_uses(&intrin->def, def);
46
47 nir_instr_remove(instr);
48 progress = true;
49 }
50 }
51
52 if (progress)
53 nir_metadata_preserve(entry, nir_metadata_control_flow);
54 else
55 nir_metadata_preserve(entry, nir_metadata_all);
56
57 return progress;
58 }
59