1bf215546Sopenharmony_ci/*
2bf215546Sopenharmony_ci * Copyright (C) 2015 Rob Clark <robclark@freedesktop.org>
3bf215546Sopenharmony_ci *
4bf215546Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5bf215546Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6bf215546Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7bf215546Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8bf215546Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9bf215546Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10bf215546Sopenharmony_ci *
11bf215546Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12bf215546Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13bf215546Sopenharmony_ci * Software.
14bf215546Sopenharmony_ci *
15bf215546Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16bf215546Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17bf215546Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18bf215546Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19bf215546Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20bf215546Sopenharmony_ci * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21bf215546Sopenharmony_ci * SOFTWARE.
22bf215546Sopenharmony_ci *
23bf215546Sopenharmony_ci * Authors:
24bf215546Sopenharmony_ci *    Rob Clark <robclark@freedesktop.org>
25bf215546Sopenharmony_ci */
26bf215546Sopenharmony_ci
27bf215546Sopenharmony_ci#ifndef IR3_NIR_H_
28bf215546Sopenharmony_ci#define IR3_NIR_H_
29bf215546Sopenharmony_ci
30bf215546Sopenharmony_ci#include "compiler/nir/nir.h"
31bf215546Sopenharmony_ci#include "compiler/nir/nir_builder.h"
32bf215546Sopenharmony_ci#include "compiler/shader_enums.h"
33bf215546Sopenharmony_ci
34bf215546Sopenharmony_ci#include "ir3_shader.h"
35bf215546Sopenharmony_ci
36bf215546Sopenharmony_cibool ir3_nir_apply_trig_workarounds(nir_shader *shader);
37bf215546Sopenharmony_cibool ir3_nir_lower_imul(nir_shader *shader);
38bf215546Sopenharmony_cibool ir3_nir_lower_io_offsets(nir_shader *shader);
39bf215546Sopenharmony_cibool ir3_nir_lower_load_barycentric_at_sample(nir_shader *shader);
40bf215546Sopenharmony_cibool ir3_nir_lower_load_barycentric_at_offset(nir_shader *shader);
41bf215546Sopenharmony_cibool ir3_nir_move_varying_inputs(nir_shader *shader);
42bf215546Sopenharmony_ciint ir3_nir_coord_offset(nir_ssa_def *ssa);
43bf215546Sopenharmony_cibool ir3_nir_lower_tex_prefetch(nir_shader *shader);
44bf215546Sopenharmony_cibool ir3_nir_lower_wide_load_store(nir_shader *shader);
45bf215546Sopenharmony_ci
46bf215546Sopenharmony_civoid ir3_nir_lower_to_explicit_output(nir_shader *shader,
47bf215546Sopenharmony_ci                                      struct ir3_shader_variant *v,
48bf215546Sopenharmony_ci                                      unsigned topology);
49bf215546Sopenharmony_civoid ir3_nir_lower_to_explicit_input(nir_shader *shader,
50bf215546Sopenharmony_ci                                     struct ir3_shader_variant *v);
51bf215546Sopenharmony_civoid ir3_nir_lower_tess_ctrl(nir_shader *shader, struct ir3_shader_variant *v,
52bf215546Sopenharmony_ci                             unsigned topology);
53bf215546Sopenharmony_civoid ir3_nir_lower_tess_eval(nir_shader *shader, struct ir3_shader_variant *v,
54bf215546Sopenharmony_ci                             unsigned topology);
55bf215546Sopenharmony_civoid ir3_nir_lower_gs(nir_shader *shader);
56bf215546Sopenharmony_ci
57bf215546Sopenharmony_ci/*
58bf215546Sopenharmony_ci * 64b related lowering:
59bf215546Sopenharmony_ci */
60bf215546Sopenharmony_cibool ir3_nir_lower_64b_intrinsics(nir_shader *shader);
61bf215546Sopenharmony_cibool ir3_nir_lower_64b_undef(nir_shader *shader);
62bf215546Sopenharmony_cibool ir3_nir_lower_64b_global(nir_shader *shader);
63bf215546Sopenharmony_ci
64bf215546Sopenharmony_civoid ir3_optimize_loop(struct ir3_compiler *compiler, nir_shader *s);
65bf215546Sopenharmony_civoid ir3_nir_lower_io_to_temporaries(nir_shader *s);
66bf215546Sopenharmony_civoid ir3_finalize_nir(struct ir3_compiler *compiler, nir_shader *s);
67bf215546Sopenharmony_civoid ir3_nir_post_finalize(struct ir3_shader *shader);
68bf215546Sopenharmony_civoid ir3_nir_lower_variant(struct ir3_shader_variant *so, nir_shader *s);
69bf215546Sopenharmony_ci
70bf215546Sopenharmony_civoid ir3_setup_const_state(nir_shader *nir, struct ir3_shader_variant *v,
71bf215546Sopenharmony_ci                           struct ir3_const_state *const_state);
72bf215546Sopenharmony_cibool ir3_nir_lower_load_constant(nir_shader *nir, struct ir3_shader_variant *v);
73bf215546Sopenharmony_civoid ir3_nir_analyze_ubo_ranges(nir_shader *nir, struct ir3_shader_variant *v);
74bf215546Sopenharmony_cibool ir3_nir_lower_ubo_loads(nir_shader *nir, struct ir3_shader_variant *v);
75bf215546Sopenharmony_cibool ir3_nir_fixup_load_uniform(nir_shader *nir);
76bf215546Sopenharmony_cibool ir3_nir_opt_preamble(nir_shader *nir, struct ir3_shader_variant *v);
77bf215546Sopenharmony_cibool ir3_nir_lower_preamble(nir_shader *nir, struct ir3_shader_variant *v);
78bf215546Sopenharmony_ci
79bf215546Sopenharmony_cinir_ssa_def *ir3_nir_try_propagate_bit_shift(nir_builder *b,
80bf215546Sopenharmony_ci                                             nir_ssa_def *offset,
81bf215546Sopenharmony_ci                                             int32_t shift);
82bf215546Sopenharmony_ci
83bf215546Sopenharmony_cistatic inline nir_intrinsic_instr *
84bf215546Sopenharmony_ciir3_bindless_resource(nir_src src)
85bf215546Sopenharmony_ci{
86bf215546Sopenharmony_ci   if (!src.is_ssa)
87bf215546Sopenharmony_ci      return NULL;
88bf215546Sopenharmony_ci
89bf215546Sopenharmony_ci   if (src.ssa->parent_instr->type != nir_instr_type_intrinsic)
90bf215546Sopenharmony_ci      return NULL;
91bf215546Sopenharmony_ci
92bf215546Sopenharmony_ci   nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src.ssa->parent_instr);
93bf215546Sopenharmony_ci   if (intrin->intrinsic != nir_intrinsic_bindless_resource_ir3)
94bf215546Sopenharmony_ci      return NULL;
95bf215546Sopenharmony_ci
96bf215546Sopenharmony_ci   return intrin;
97bf215546Sopenharmony_ci}
98bf215546Sopenharmony_ci
99bf215546Sopenharmony_cistatic inline bool
100bf215546Sopenharmony_ciis_intrinsic_store(nir_intrinsic_op op)
101bf215546Sopenharmony_ci{
102bf215546Sopenharmony_ci   switch (op) {
103bf215546Sopenharmony_ci   case nir_intrinsic_store_output:
104bf215546Sopenharmony_ci   case nir_intrinsic_store_scratch:
105bf215546Sopenharmony_ci   case nir_intrinsic_store_ssbo:
106bf215546Sopenharmony_ci   case nir_intrinsic_store_shared:
107bf215546Sopenharmony_ci   case nir_intrinsic_store_global:
108bf215546Sopenharmony_ci   case nir_intrinsic_store_global_ir3:
109bf215546Sopenharmony_ci      return true;
110bf215546Sopenharmony_ci   default:
111bf215546Sopenharmony_ci      return false;
112bf215546Sopenharmony_ci   }
113bf215546Sopenharmony_ci}
114bf215546Sopenharmony_ci
115bf215546Sopenharmony_cistatic inline bool
116bf215546Sopenharmony_ciis_intrinsic_load(nir_intrinsic_op op)
117bf215546Sopenharmony_ci{
118bf215546Sopenharmony_ci   switch (op) {
119bf215546Sopenharmony_ci   case nir_intrinsic_load_input:
120bf215546Sopenharmony_ci   case nir_intrinsic_load_scratch:
121bf215546Sopenharmony_ci   case nir_intrinsic_load_uniform:
122bf215546Sopenharmony_ci   case nir_intrinsic_load_ssbo:
123bf215546Sopenharmony_ci   case nir_intrinsic_load_ubo:
124bf215546Sopenharmony_ci   case nir_intrinsic_load_shared:
125bf215546Sopenharmony_ci   case nir_intrinsic_load_global:
126bf215546Sopenharmony_ci   case nir_intrinsic_load_global_ir3:
127bf215546Sopenharmony_ci      return true;
128bf215546Sopenharmony_ci   default:
129bf215546Sopenharmony_ci      return false;
130bf215546Sopenharmony_ci   }
131bf215546Sopenharmony_ci}
132bf215546Sopenharmony_ci
133bf215546Sopenharmony_ci#endif /* IR3_NIR_H_ */
134