xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/etnaviv/etnaviv_nir_lower_texture.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2023 Igalia S.L.
3  * SPDX-License-Identifier: MIT
4  */
5 
6 #include "etnaviv_nir.h"
7 
8 static bool
lower_txs(nir_builder * b,nir_instr * instr,UNUSED void * data)9 lower_txs(nir_builder *b, nir_instr *instr, UNUSED void *data)
10 {
11    if (instr->type != nir_instr_type_tex)
12       return false;
13 
14    nir_tex_instr *tex = nir_instr_as_tex(instr);
15 
16    if (tex->op != nir_texop_txs)
17       return false;
18 
19    b->cursor = nir_instr_remove(instr);
20 
21    nir_def *idx = nir_imm_int(b, tex->texture_index);
22    nir_def *sizes = nir_load_texture_size_etna(b, 32, idx);
23 
24    nir_def_rewrite_uses(&tex->def, sizes);
25 
26    return true;
27 }
28 
29 bool
etna_nir_lower_texture(nir_shader * s,struct etna_shader_key * key)30 etna_nir_lower_texture(nir_shader *s, struct etna_shader_key *key)
31 {
32    bool progress = false;
33 
34    nir_lower_tex_options lower_tex_options = {
35       .lower_txp = ~0u,
36       .lower_txs_lod = true,
37       .lower_invalid_implicit_lod = true,
38    };
39 
40    NIR_PASS(progress, s, nir_lower_tex, &lower_tex_options);
41 
42    if (key->has_sample_tex_compare)
43       NIR_PASS(progress, s, nir_lower_tex_shadow, key->num_texture_states,
44                                                   key->tex_compare_func,
45                                                   key->tex_swizzle);
46 
47    NIR_PASS(progress, s, nir_shader_instructions_pass, lower_txs,
48          nir_metadata_control_flow, NULL);
49 
50    return progress;
51 }
52