xref: /aosp_15_r20/external/mesa3d/src/intel/compiler/brw_nir.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 Intel Corporation
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*61046927SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*61046927SAndroid Build Coastguard Worker  * IN THE SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  */
23*61046927SAndroid Build Coastguard Worker 
24*61046927SAndroid Build Coastguard Worker #ifndef BRW_NIR_H
25*61046927SAndroid Build Coastguard Worker #define BRW_NIR_H
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include "brw_reg.h"
28*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir.h"
29*61046927SAndroid Build Coastguard Worker #include "brw_compiler.h"
30*61046927SAndroid Build Coastguard Worker #include "nir_builder.h"
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
33*61046927SAndroid Build Coastguard Worker extern "C" {
34*61046927SAndroid Build Coastguard Worker #endif
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker extern const struct nir_shader_compiler_options brw_scalar_nir_options;
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker int type_size_vec4(const struct glsl_type *type, bool bindless);
39*61046927SAndroid Build Coastguard Worker int type_size_dvec4(const struct glsl_type *type, bool bindless);
40*61046927SAndroid Build Coastguard Worker 
41*61046927SAndroid Build Coastguard Worker static inline int
type_size_scalar_bytes(const struct glsl_type * type,bool bindless)42*61046927SAndroid Build Coastguard Worker type_size_scalar_bytes(const struct glsl_type *type, bool bindless)
43*61046927SAndroid Build Coastguard Worker {
44*61046927SAndroid Build Coastguard Worker    return glsl_count_dword_slots(type, bindless) * 4;
45*61046927SAndroid Build Coastguard Worker }
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker static inline int
type_size_vec4_bytes(const struct glsl_type * type,bool bindless)48*61046927SAndroid Build Coastguard Worker type_size_vec4_bytes(const struct glsl_type *type, bool bindless)
49*61046927SAndroid Build Coastguard Worker {
50*61046927SAndroid Build Coastguard Worker    return type_size_vec4(type, bindless) * 16;
51*61046927SAndroid Build Coastguard Worker }
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker struct brw_nir_compiler_opts {
54*61046927SAndroid Build Coastguard Worker    /* Soft floating point implementation shader */
55*61046927SAndroid Build Coastguard Worker    const nir_shader *softfp64;
56*61046927SAndroid Build Coastguard Worker 
57*61046927SAndroid Build Coastguard Worker    /* Whether robust image access is enabled */
58*61046927SAndroid Build Coastguard Worker    bool robust_image_access;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    /* Input vertices for TCS stage (0 means dynamic) */
61*61046927SAndroid Build Coastguard Worker    unsigned input_vertices;
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker 
64*61046927SAndroid Build Coastguard Worker /* UBO surface index can come in 2 flavors :
65*61046927SAndroid Build Coastguard Worker  *    - nir_intrinsic_resource_intel
66*61046927SAndroid Build Coastguard Worker  *    - anything else
67*61046927SAndroid Build Coastguard Worker  *
68*61046927SAndroid Build Coastguard Worker  * In the first case, checking that the surface index is const requires
69*61046927SAndroid Build Coastguard Worker  * checking resource_intel::src[1]. In any other case it's a simple
70*61046927SAndroid Build Coastguard Worker  * nir_src_is_const().
71*61046927SAndroid Build Coastguard Worker  *
72*61046927SAndroid Build Coastguard Worker  * This function should only be called on src[0] of load_ubo intrinsics.
73*61046927SAndroid Build Coastguard Worker  */
74*61046927SAndroid Build Coastguard Worker static inline bool
brw_nir_ubo_surface_index_is_pushable(nir_src src)75*61046927SAndroid Build Coastguard Worker brw_nir_ubo_surface_index_is_pushable(nir_src src)
76*61046927SAndroid Build Coastguard Worker {
77*61046927SAndroid Build Coastguard Worker    nir_intrinsic_instr *intrin =
78*61046927SAndroid Build Coastguard Worker       src.ssa->parent_instr->type == nir_instr_type_intrinsic ?
79*61046927SAndroid Build Coastguard Worker       nir_instr_as_intrinsic(src.ssa->parent_instr) : NULL;
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    if (intrin && intrin->intrinsic == nir_intrinsic_resource_intel) {
82*61046927SAndroid Build Coastguard Worker       return (nir_intrinsic_resource_access_intel(intrin) &
83*61046927SAndroid Build Coastguard Worker               nir_resource_intel_pushable);
84*61046927SAndroid Build Coastguard Worker    }
85*61046927SAndroid Build Coastguard Worker 
86*61046927SAndroid Build Coastguard Worker    return nir_src_is_const(src);
87*61046927SAndroid Build Coastguard Worker }
88*61046927SAndroid Build Coastguard Worker 
89*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_nir_ubo_surface_index_get_push_block(nir_src src)90*61046927SAndroid Build Coastguard Worker brw_nir_ubo_surface_index_get_push_block(nir_src src)
91*61046927SAndroid Build Coastguard Worker {
92*61046927SAndroid Build Coastguard Worker    if (nir_src_is_const(src))
93*61046927SAndroid Build Coastguard Worker       return nir_src_as_uint(src);
94*61046927SAndroid Build Coastguard Worker 
95*61046927SAndroid Build Coastguard Worker    if (!brw_nir_ubo_surface_index_is_pushable(src))
96*61046927SAndroid Build Coastguard Worker       return UINT32_MAX;
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker    assert(src.ssa->parent_instr->type == nir_instr_type_intrinsic);
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src.ssa->parent_instr);
101*61046927SAndroid Build Coastguard Worker    assert(intrin->intrinsic == nir_intrinsic_resource_intel);
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    return nir_intrinsic_resource_block_intel(intrin);
104*61046927SAndroid Build Coastguard Worker }
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker /* This helper return the binding table index of a surface access (any
107*61046927SAndroid Build Coastguard Worker  * buffer/image/etc...). It works off the source of one of the intrinsics
108*61046927SAndroid Build Coastguard Worker  * (load_ubo, load_ssbo, store_ssbo, load_image, store_image, etc...).
109*61046927SAndroid Build Coastguard Worker  *
110*61046927SAndroid Build Coastguard Worker  * If the source is constant, then this is the binding table index. If we're
111*61046927SAndroid Build Coastguard Worker  * going through a resource_intel intel intrinsic, then we need to check
112*61046927SAndroid Build Coastguard Worker  * src[1] of that intrinsic.
113*61046927SAndroid Build Coastguard Worker  */
114*61046927SAndroid Build Coastguard Worker static inline unsigned
brw_nir_ubo_surface_index_get_bti(nir_src src)115*61046927SAndroid Build Coastguard Worker brw_nir_ubo_surface_index_get_bti(nir_src src)
116*61046927SAndroid Build Coastguard Worker {
117*61046927SAndroid Build Coastguard Worker    if (nir_src_is_const(src))
118*61046927SAndroid Build Coastguard Worker       return nir_src_as_uint(src);
119*61046927SAndroid Build Coastguard Worker 
120*61046927SAndroid Build Coastguard Worker    assert(src.ssa->parent_instr->type == nir_instr_type_intrinsic);
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker    nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(src.ssa->parent_instr);
123*61046927SAndroid Build Coastguard Worker    if (!intrin || intrin->intrinsic != nir_intrinsic_resource_intel)
124*61046927SAndroid Build Coastguard Worker       return UINT32_MAX;
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    /* In practice we could even drop this intrinsic because the bindless
127*61046927SAndroid Build Coastguard Worker     * access always operate from a base offset coming from a push constant, so
128*61046927SAndroid Build Coastguard Worker     * they can never be constant.
129*61046927SAndroid Build Coastguard Worker     */
130*61046927SAndroid Build Coastguard Worker    if (nir_intrinsic_resource_access_intel(intrin) &
131*61046927SAndroid Build Coastguard Worker        nir_resource_intel_bindless)
132*61046927SAndroid Build Coastguard Worker       return UINT32_MAX;
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    if (!nir_src_is_const(intrin->src[1]))
135*61046927SAndroid Build Coastguard Worker       return UINT32_MAX;
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker    return nir_src_as_uint(intrin->src[1]);
138*61046927SAndroid Build Coastguard Worker }
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker void brw_preprocess_nir(const struct brw_compiler *compiler,
141*61046927SAndroid Build Coastguard Worker                         nir_shader *nir,
142*61046927SAndroid Build Coastguard Worker                         const struct brw_nir_compiler_opts *opts);
143*61046927SAndroid Build Coastguard Worker 
144*61046927SAndroid Build Coastguard Worker void
145*61046927SAndroid Build Coastguard Worker brw_nir_link_shaders(const struct brw_compiler *compiler,
146*61046927SAndroid Build Coastguard Worker                      nir_shader *producer, nir_shader *consumer);
147*61046927SAndroid Build Coastguard Worker 
148*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_cs_intrinsics(nir_shader *nir,
149*61046927SAndroid Build Coastguard Worker                                  const struct intel_device_info *devinfo,
150*61046927SAndroid Build Coastguard Worker                                  struct brw_cs_prog_data *prog_data);
151*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_alpha_to_coverage(nir_shader *shader,
152*61046927SAndroid Build Coastguard Worker                                      const struct brw_wm_prog_key *key,
153*61046927SAndroid Build Coastguard Worker                                      const struct brw_wm_prog_data *prog_data);
154*61046927SAndroid Build Coastguard Worker void brw_nir_lower_vs_inputs(nir_shader *nir);
155*61046927SAndroid Build Coastguard Worker void brw_nir_lower_vue_inputs(nir_shader *nir,
156*61046927SAndroid Build Coastguard Worker                               const struct intel_vue_map *vue_map);
157*61046927SAndroid Build Coastguard Worker void brw_nir_lower_tes_inputs(nir_shader *nir, const struct intel_vue_map *vue);
158*61046927SAndroid Build Coastguard Worker void brw_nir_lower_fs_inputs(nir_shader *nir,
159*61046927SAndroid Build Coastguard Worker                              const struct intel_device_info *devinfo,
160*61046927SAndroid Build Coastguard Worker                              const struct brw_wm_prog_key *key);
161*61046927SAndroid Build Coastguard Worker void brw_nir_lower_vue_outputs(nir_shader *nir);
162*61046927SAndroid Build Coastguard Worker void brw_nir_lower_tcs_outputs(nir_shader *nir, const struct intel_vue_map *vue,
163*61046927SAndroid Build Coastguard Worker                                enum tess_primitive_mode tes_primitive_mode);
164*61046927SAndroid Build Coastguard Worker void brw_nir_lower_fs_outputs(nir_shader *nir);
165*61046927SAndroid Build Coastguard Worker 
166*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_cmat(nir_shader *nir, unsigned subgroup_size);
167*61046927SAndroid Build Coastguard Worker 
168*61046927SAndroid Build Coastguard Worker struct brw_nir_lower_storage_image_opts {
169*61046927SAndroid Build Coastguard Worker    const struct intel_device_info *devinfo;
170*61046927SAndroid Build Coastguard Worker 
171*61046927SAndroid Build Coastguard Worker    bool lower_loads;
172*61046927SAndroid Build Coastguard Worker    bool lower_stores;
173*61046927SAndroid Build Coastguard Worker };
174*61046927SAndroid Build Coastguard Worker 
175*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_storage_image(nir_shader *nir,
176*61046927SAndroid Build Coastguard Worker                                  const struct brw_nir_lower_storage_image_opts *opts);
177*61046927SAndroid Build Coastguard Worker 
178*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_mem_access_bit_sizes(nir_shader *shader,
179*61046927SAndroid Build Coastguard Worker                                         const struct
180*61046927SAndroid Build Coastguard Worker                                         intel_device_info *devinfo);
181*61046927SAndroid Build Coastguard Worker 
182*61046927SAndroid Build Coastguard Worker void brw_postprocess_nir(nir_shader *nir,
183*61046927SAndroid Build Coastguard Worker                          const struct brw_compiler *compiler,
184*61046927SAndroid Build Coastguard Worker                          bool debug_enabled,
185*61046927SAndroid Build Coastguard Worker                          enum brw_robustness_flags robust_flags);
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker bool brw_nir_apply_attribute_workarounds(nir_shader *nir,
188*61046927SAndroid Build Coastguard Worker                                          const uint8_t *attrib_wa_flags);
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker bool brw_nir_apply_trig_workarounds(nir_shader *nir);
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker bool brw_nir_limit_trig_input_range_workaround(nir_shader *nir);
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker bool brw_nir_lower_fsign(nir_shader *nir);
195*61046927SAndroid Build Coastguard Worker 
196*61046927SAndroid Build Coastguard Worker bool brw_nir_opt_fsat(nir_shader *);
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker void brw_nir_apply_key(nir_shader *nir,
199*61046927SAndroid Build Coastguard Worker                        const struct brw_compiler *compiler,
200*61046927SAndroid Build Coastguard Worker                        const struct brw_base_prog_key *key,
201*61046927SAndroid Build Coastguard Worker                        unsigned max_subgroup_size);
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker unsigned brw_nir_api_subgroup_size(const nir_shader *nir,
204*61046927SAndroid Build Coastguard Worker                                    unsigned hw_subgroup_size);
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker enum brw_conditional_mod brw_cmod_for_nir_comparison(nir_op op);
207*61046927SAndroid Build Coastguard Worker enum lsc_opcode lsc_op_for_nir_intrinsic(const nir_intrinsic_instr *intrin);
208*61046927SAndroid Build Coastguard Worker enum brw_reg_type brw_type_for_nir_type(const struct intel_device_info *devinfo,
209*61046927SAndroid Build Coastguard Worker                                         nir_alu_type type);
210*61046927SAndroid Build Coastguard Worker 
211*61046927SAndroid Build Coastguard Worker bool brw_nir_should_vectorize_mem(unsigned align_mul, unsigned align_offset,
212*61046927SAndroid Build Coastguard Worker                                   unsigned bit_size,
213*61046927SAndroid Build Coastguard Worker                                   unsigned num_components,
214*61046927SAndroid Build Coastguard Worker                                   nir_intrinsic_instr *low,
215*61046927SAndroid Build Coastguard Worker                                   nir_intrinsic_instr *high,
216*61046927SAndroid Build Coastguard Worker                                   void *data);
217*61046927SAndroid Build Coastguard Worker 
218*61046927SAndroid Build Coastguard Worker void brw_nir_analyze_ubo_ranges(const struct brw_compiler *compiler,
219*61046927SAndroid Build Coastguard Worker                                 nir_shader *nir,
220*61046927SAndroid Build Coastguard Worker                                 struct brw_ubo_range out_ranges[4]);
221*61046927SAndroid Build Coastguard Worker 
222*61046927SAndroid Build Coastguard Worker void brw_nir_optimize(nir_shader *nir,
223*61046927SAndroid Build Coastguard Worker                       const struct intel_device_info *devinfo);
224*61046927SAndroid Build Coastguard Worker 
225*61046927SAndroid Build Coastguard Worker nir_shader *brw_nir_create_passthrough_tcs(void *mem_ctx,
226*61046927SAndroid Build Coastguard Worker                                            const struct brw_compiler *compiler,
227*61046927SAndroid Build Coastguard Worker                                            const struct brw_tcs_prog_key *key);
228*61046927SAndroid Build Coastguard Worker 
229*61046927SAndroid Build Coastguard Worker #define BRW_NIR_FRAG_OUTPUT_INDEX_SHIFT 0
230*61046927SAndroid Build Coastguard Worker #define BRW_NIR_FRAG_OUTPUT_INDEX_MASK INTEL_MASK(0, 0)
231*61046927SAndroid Build Coastguard Worker #define BRW_NIR_FRAG_OUTPUT_LOCATION_SHIFT 1
232*61046927SAndroid Build Coastguard Worker #define BRW_NIR_FRAG_OUTPUT_LOCATION_MASK INTEL_MASK(31, 1)
233*61046927SAndroid Build Coastguard Worker 
234*61046927SAndroid Build Coastguard Worker bool brw_nir_move_interpolation_to_top(nir_shader *nir);
235*61046927SAndroid Build Coastguard Worker nir_def *brw_nir_load_global_const(nir_builder *b,
236*61046927SAndroid Build Coastguard Worker                                        nir_intrinsic_instr *load_uniform,
237*61046927SAndroid Build Coastguard Worker                                        nir_def *base_addr,
238*61046927SAndroid Build Coastguard Worker                                        unsigned off);
239*61046927SAndroid Build Coastguard Worker 
240*61046927SAndroid Build Coastguard Worker const struct glsl_type *brw_nir_get_var_type(const struct nir_shader *nir,
241*61046927SAndroid Build Coastguard Worker                                              nir_variable *var);
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker void brw_nir_adjust_payload(nir_shader *shader);
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker static inline nir_variable_mode
brw_nir_no_indirect_mask(const struct brw_compiler * compiler,gl_shader_stage stage)246*61046927SAndroid Build Coastguard Worker brw_nir_no_indirect_mask(const struct brw_compiler *compiler,
247*61046927SAndroid Build Coastguard Worker                          gl_shader_stage stage)
248*61046927SAndroid Build Coastguard Worker {
249*61046927SAndroid Build Coastguard Worker    nir_variable_mode indirect_mask = (nir_variable_mode) 0;
250*61046927SAndroid Build Coastguard Worker 
251*61046927SAndroid Build Coastguard Worker    switch (stage) {
252*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_VERTEX:
253*61046927SAndroid Build Coastguard Worker    case MESA_SHADER_FRAGMENT:
254*61046927SAndroid Build Coastguard Worker       indirect_mask |= nir_var_shader_in;
255*61046927SAndroid Build Coastguard Worker       break;
256*61046927SAndroid Build Coastguard Worker 
257*61046927SAndroid Build Coastguard Worker    default:
258*61046927SAndroid Build Coastguard Worker       /* Everything else can handle indirect inputs */
259*61046927SAndroid Build Coastguard Worker       break;
260*61046927SAndroid Build Coastguard Worker    }
261*61046927SAndroid Build Coastguard Worker 
262*61046927SAndroid Build Coastguard Worker    if (stage != MESA_SHADER_TESS_CTRL &&
263*61046927SAndroid Build Coastguard Worker        stage != MESA_SHADER_TASK &&
264*61046927SAndroid Build Coastguard Worker        stage != MESA_SHADER_MESH)
265*61046927SAndroid Build Coastguard Worker       indirect_mask |= nir_var_shader_out;
266*61046927SAndroid Build Coastguard Worker 
267*61046927SAndroid Build Coastguard Worker    return indirect_mask;
268*61046927SAndroid Build Coastguard Worker }
269*61046927SAndroid Build Coastguard Worker 
270*61046927SAndroid Build Coastguard Worker void
271*61046927SAndroid Build Coastguard Worker brw_nir_printf(nir_builder *b, const char *fmt, ...);
272*61046927SAndroid Build Coastguard Worker 
273*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
274*61046927SAndroid Build Coastguard Worker }
275*61046927SAndroid Build Coastguard Worker #endif
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker #endif /* BRW_NIR_H */
278