1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker * Copyright © 2013 Rob Clark <[email protected]>
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker *
5*61046927SAndroid Build Coastguard Worker * Authors:
6*61046927SAndroid Build Coastguard Worker * Rob Clark <[email protected]>
7*61046927SAndroid Build Coastguard Worker */
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker #ifndef IR3_COMPILER_H_
10*61046927SAndroid Build Coastguard Worker #define IR3_COMPILER_H_
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir.h"
13*61046927SAndroid Build Coastguard Worker #include "util/disk_cache.h"
14*61046927SAndroid Build Coastguard Worker #include "util/log.h"
15*61046927SAndroid Build Coastguard Worker #include "util/perf/cpu_trace.h"
16*61046927SAndroid Build Coastguard Worker
17*61046927SAndroid Build Coastguard Worker #include "freedreno_dev_info.h"
18*61046927SAndroid Build Coastguard Worker
19*61046927SAndroid Build Coastguard Worker #include "ir3.h"
20*61046927SAndroid Build Coastguard Worker
21*61046927SAndroid Build Coastguard Worker BEGINC;
22*61046927SAndroid Build Coastguard Worker
23*61046927SAndroid Build Coastguard Worker struct ir3_ra_reg_set;
24*61046927SAndroid Build Coastguard Worker struct ir3_shader;
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker struct ir3_compiler_options {
27*61046927SAndroid Build Coastguard Worker /* If true, UBO/SSBO accesses are assumed to be bounds-checked as defined by
28*61046927SAndroid Build Coastguard Worker * VK_EXT_robustness2 and optimizations may have to be more conservative.
29*61046927SAndroid Build Coastguard Worker */
30*61046927SAndroid Build Coastguard Worker bool robust_buffer_access2;
31*61046927SAndroid Build Coastguard Worker
32*61046927SAndroid Build Coastguard Worker /* If true, promote UBOs (except for constant data) to constants using ldc.k
33*61046927SAndroid Build Coastguard Worker * in the preamble. The driver should ignore everything in ubo_state except
34*61046927SAndroid Build Coastguard Worker * for the constant data UBO, which is excluded because the command pushing
35*61046927SAndroid Build Coastguard Worker * constants for it can be pre-baked when compiling the shader.
36*61046927SAndroid Build Coastguard Worker */
37*61046927SAndroid Build Coastguard Worker bool push_ubo_with_preamble;
38*61046927SAndroid Build Coastguard Worker
39*61046927SAndroid Build Coastguard Worker /* If true, disable the shader cache. The driver is then responsible for
40*61046927SAndroid Build Coastguard Worker * caching.
41*61046927SAndroid Build Coastguard Worker */
42*61046927SAndroid Build Coastguard Worker bool disable_cache;
43*61046927SAndroid Build Coastguard Worker
44*61046927SAndroid Build Coastguard Worker /* If >= 0, this specifies the bindless descriptor set + descriptor to use
45*61046927SAndroid Build Coastguard Worker * for txf_ms_fb
46*61046927SAndroid Build Coastguard Worker */
47*61046927SAndroid Build Coastguard Worker int bindless_fb_read_descriptor;
48*61046927SAndroid Build Coastguard Worker int bindless_fb_read_slot;
49*61046927SAndroid Build Coastguard Worker
50*61046927SAndroid Build Coastguard Worker /* True if 16-bit descriptors are available. */
51*61046927SAndroid Build Coastguard Worker bool storage_16bit;
52*61046927SAndroid Build Coastguard Worker /* True if 8-bit descriptors are available. */
53*61046927SAndroid Build Coastguard Worker bool storage_8bit;
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker /* If base_vertex should be lowered in nir */
56*61046927SAndroid Build Coastguard Worker bool lower_base_vertex;
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Worker bool shared_push_consts;
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker /* "dual_color_blend_by_location" workaround is enabled: */
61*61046927SAndroid Build Coastguard Worker bool dual_color_blend_by_location;
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker struct ir3_compiler {
65*61046927SAndroid Build Coastguard Worker struct fd_device *dev;
66*61046927SAndroid Build Coastguard Worker const struct fd_dev_id *dev_id;
67*61046927SAndroid Build Coastguard Worker uint8_t gen;
68*61046927SAndroid Build Coastguard Worker uint32_t shader_count;
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard Worker struct disk_cache *disk_cache;
71*61046927SAndroid Build Coastguard Worker
72*61046927SAndroid Build Coastguard Worker struct nir_shader_compiler_options nir_options;
73*61046927SAndroid Build Coastguard Worker
74*61046927SAndroid Build Coastguard Worker /*
75*61046927SAndroid Build Coastguard Worker * Configuration options for things handled differently by turnip vs
76*61046927SAndroid Build Coastguard Worker * gallium
77*61046927SAndroid Build Coastguard Worker */
78*61046927SAndroid Build Coastguard Worker struct ir3_compiler_options options;
79*61046927SAndroid Build Coastguard Worker
80*61046927SAndroid Build Coastguard Worker /*
81*61046927SAndroid Build Coastguard Worker * Configuration options for things that are handled differently on
82*61046927SAndroid Build Coastguard Worker * different generations:
83*61046927SAndroid Build Coastguard Worker */
84*61046927SAndroid Build Coastguard Worker
85*61046927SAndroid Build Coastguard Worker bool is_64bit;
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Worker /* a4xx (and later) drops SP_FS_FLAT_SHAD_MODE_REG_* for flat-interpolate
88*61046927SAndroid Build Coastguard Worker * so we need to use ldlv.u32 to load the varying directly:
89*61046927SAndroid Build Coastguard Worker */
90*61046927SAndroid Build Coastguard Worker bool flat_bypass;
91*61046927SAndroid Build Coastguard Worker
92*61046927SAndroid Build Coastguard Worker /* on a3xx, we need to add one to # of array levels:
93*61046927SAndroid Build Coastguard Worker */
94*61046927SAndroid Build Coastguard Worker bool levels_add_one;
95*61046927SAndroid Build Coastguard Worker
96*61046927SAndroid Build Coastguard Worker /* on a3xx, we need to scale up integer coords for isaml based
97*61046927SAndroid Build Coastguard Worker * on LoD:
98*61046927SAndroid Build Coastguard Worker */
99*61046927SAndroid Build Coastguard Worker bool unminify_coords;
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker /* on a3xx do txf_ms w/ isaml and scaled coords: */
102*61046927SAndroid Build Coastguard Worker bool txf_ms_with_isaml;
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker /* on a4xx, for array textures we need to add 0.5 to the array
105*61046927SAndroid Build Coastguard Worker * index coordinate:
106*61046927SAndroid Build Coastguard Worker */
107*61046927SAndroid Build Coastguard Worker bool array_index_add_half;
108*61046927SAndroid Build Coastguard Worker
109*61046927SAndroid Build Coastguard Worker /* on a6xx, rewrite samgp to sequence of samgq0-3 in vertex shaders:
110*61046927SAndroid Build Coastguard Worker */
111*61046927SAndroid Build Coastguard Worker bool samgq_workaround;
112*61046927SAndroid Build Coastguard Worker
113*61046927SAndroid Build Coastguard Worker /* on a650, vertex shader <-> tess control io uses LDL/STL */
114*61046927SAndroid Build Coastguard Worker bool tess_use_shared;
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Worker /* The maximum number of constants, in vec4's, across the entire graphics
117*61046927SAndroid Build Coastguard Worker * pipeline.
118*61046927SAndroid Build Coastguard Worker */
119*61046927SAndroid Build Coastguard Worker uint16_t max_const_pipeline;
120*61046927SAndroid Build Coastguard Worker
121*61046927SAndroid Build Coastguard Worker /* The maximum number of constants, in vec4's, for VS+HS+DS+GS. */
122*61046927SAndroid Build Coastguard Worker uint16_t max_const_geom;
123*61046927SAndroid Build Coastguard Worker
124*61046927SAndroid Build Coastguard Worker /* The maximum number of constants, in vec4's, for FS. */
125*61046927SAndroid Build Coastguard Worker uint16_t max_const_frag;
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker /* A "safe" max constlen that can be applied to each shader in the
128*61046927SAndroid Build Coastguard Worker * pipeline which we guarantee will never exceed any combined limits.
129*61046927SAndroid Build Coastguard Worker */
130*61046927SAndroid Build Coastguard Worker uint16_t max_const_safe;
131*61046927SAndroid Build Coastguard Worker
132*61046927SAndroid Build Coastguard Worker /* The maximum number of constants, in vec4's, for compute shaders. */
133*61046927SAndroid Build Coastguard Worker uint16_t max_const_compute;
134*61046927SAndroid Build Coastguard Worker
135*61046927SAndroid Build Coastguard Worker /* Number of instructions that the shader's base address and length
136*61046927SAndroid Build Coastguard Worker * (instrlen divides instruction count by this) must be aligned to.
137*61046927SAndroid Build Coastguard Worker */
138*61046927SAndroid Build Coastguard Worker uint32_t instr_align;
139*61046927SAndroid Build Coastguard Worker
140*61046927SAndroid Build Coastguard Worker /* on a3xx, the unit of indirect const load is higher than later gens (in
141*61046927SAndroid Build Coastguard Worker * vec4 units):
142*61046927SAndroid Build Coastguard Worker */
143*61046927SAndroid Build Coastguard Worker uint32_t const_upload_unit;
144*61046927SAndroid Build Coastguard Worker
145*61046927SAndroid Build Coastguard Worker /* The base number of threads per wave. Some stages may be able to double
146*61046927SAndroid Build Coastguard Worker * this.
147*61046927SAndroid Build Coastguard Worker */
148*61046927SAndroid Build Coastguard Worker uint32_t threadsize_base;
149*61046927SAndroid Build Coastguard Worker
150*61046927SAndroid Build Coastguard Worker /* On at least a6xx, waves are always launched in pairs. In calculations
151*61046927SAndroid Build Coastguard Worker * about occupancy, we pretend that each wave pair is actually one wave,
152*61046927SAndroid Build Coastguard Worker * which simplifies many of the calculations, but means we have to
153*61046927SAndroid Build Coastguard Worker * multiply threadsize_base by this number.
154*61046927SAndroid Build Coastguard Worker */
155*61046927SAndroid Build Coastguard Worker uint32_t wave_granularity;
156*61046927SAndroid Build Coastguard Worker
157*61046927SAndroid Build Coastguard Worker /* The maximum number of simultaneous waves per core. */
158*61046927SAndroid Build Coastguard Worker uint32_t max_waves;
159*61046927SAndroid Build Coastguard Worker
160*61046927SAndroid Build Coastguard Worker /* This is theoretical maximum number of vec4 registers that one wave of
161*61046927SAndroid Build Coastguard Worker * the base threadsize could use. To get the actual size of the register
162*61046927SAndroid Build Coastguard Worker * file in bytes one would need to compute:
163*61046927SAndroid Build Coastguard Worker *
164*61046927SAndroid Build Coastguard Worker * reg_size_vec4 * threadsize_base * wave_granularity * 16 (bytes per vec4)
165*61046927SAndroid Build Coastguard Worker *
166*61046927SAndroid Build Coastguard Worker * However this number is more often what we actually need. For example, a
167*61046927SAndroid Build Coastguard Worker * max_reg more than half of this will result in a doubled threadsize
168*61046927SAndroid Build Coastguard Worker * being impossible (because double-sized waves take up twice as many
169*61046927SAndroid Build Coastguard Worker * registers). Also, the formula for the occupancy given a particular
170*61046927SAndroid Build Coastguard Worker * register footprint is simpler.
171*61046927SAndroid Build Coastguard Worker *
172*61046927SAndroid Build Coastguard Worker * It is in vec4 units because the register file is allocated
173*61046927SAndroid Build Coastguard Worker * with vec4 granularity, so it's in the same units as max_reg.
174*61046927SAndroid Build Coastguard Worker */
175*61046927SAndroid Build Coastguard Worker uint32_t reg_size_vec4;
176*61046927SAndroid Build Coastguard Worker
177*61046927SAndroid Build Coastguard Worker /* The size of local memory in bytes */
178*61046927SAndroid Build Coastguard Worker uint32_t local_mem_size;
179*61046927SAndroid Build Coastguard Worker
180*61046927SAndroid Build Coastguard Worker /* The number of total branch stack entries, divided by wave_granularity. */
181*61046927SAndroid Build Coastguard Worker uint32_t branchstack_size;
182*61046927SAndroid Build Coastguard Worker
183*61046927SAndroid Build Coastguard Worker /* The byte increment of MEMSIZEPERITEM, the private memory per-fiber allocation. */
184*61046927SAndroid Build Coastguard Worker uint32_t pvtmem_per_fiber_align;
185*61046927SAndroid Build Coastguard Worker
186*61046927SAndroid Build Coastguard Worker /* Whether clip+cull distances are supported */
187*61046927SAndroid Build Coastguard Worker bool has_clip_cull;
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard Worker /* Whether private memory is supported */
190*61046927SAndroid Build Coastguard Worker bool has_pvtmem;
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Worker /* Whether SSBOs have descriptors for sampling with ISAM */
193*61046927SAndroid Build Coastguard Worker bool has_isam_ssbo;
194*61046927SAndroid Build Coastguard Worker
195*61046927SAndroid Build Coastguard Worker /* Whether isam.v is supported to sample multiple components from SSBOs */
196*61046927SAndroid Build Coastguard Worker bool has_isam_v;
197*61046927SAndroid Build Coastguard Worker
198*61046927SAndroid Build Coastguard Worker /* Whether isam/stib/ldib have immediate offsets. */
199*61046927SAndroid Build Coastguard Worker bool has_ssbo_imm_offsets;
200*61046927SAndroid Build Coastguard Worker
201*61046927SAndroid Build Coastguard Worker /* True if getfiberid, getlast.w8, brcst.active, and quad_shuffle
202*61046927SAndroid Build Coastguard Worker * instructions are supported which are necessary to support
203*61046927SAndroid Build Coastguard Worker * subgroup quad and arithmetic operations.
204*61046927SAndroid Build Coastguard Worker */
205*61046927SAndroid Build Coastguard Worker bool has_getfiberid;
206*61046927SAndroid Build Coastguard Worker
207*61046927SAndroid Build Coastguard Worker /* Number of available predicate registers (p0.c) */
208*61046927SAndroid Build Coastguard Worker uint32_t num_predicates;
209*61046927SAndroid Build Coastguard Worker
210*61046927SAndroid Build Coastguard Worker /* True if bitops (and.b, or.b, xor.b, not.b) can write to p0.c */
211*61046927SAndroid Build Coastguard Worker bool bitops_can_write_predicates;
212*61046927SAndroid Build Coastguard Worker
213*61046927SAndroid Build Coastguard Worker /* True if braa/brao are available. */
214*61046927SAndroid Build Coastguard Worker bool has_branch_and_or;
215*61046927SAndroid Build Coastguard Worker
216*61046927SAndroid Build Coastguard Worker /* True if predt/predf/prede are supported. */
217*61046927SAndroid Build Coastguard Worker bool has_predication;
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Worker /* MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB */
220*61046927SAndroid Build Coastguard Worker uint32_t max_variable_workgroup_size;
221*61046927SAndroid Build Coastguard Worker
222*61046927SAndroid Build Coastguard Worker bool has_dp2acc;
223*61046927SAndroid Build Coastguard Worker bool has_dp4acc;
224*61046927SAndroid Build Coastguard Worker bool has_compliant_dp4acc;
225*61046927SAndroid Build Coastguard Worker
226*61046927SAndroid Build Coastguard Worker /* Type to use for 1b nir bools: */
227*61046927SAndroid Build Coastguard Worker type_t bool_type;
228*61046927SAndroid Build Coastguard Worker
229*61046927SAndroid Build Coastguard Worker /* Whether compute invocation params are passed in via shared regfile or
230*61046927SAndroid Build Coastguard Worker * constbuf. a5xx+ has the shared regfile.
231*61046927SAndroid Build Coastguard Worker */
232*61046927SAndroid Build Coastguard Worker bool has_shared_regfile;
233*61046927SAndroid Build Coastguard Worker
234*61046927SAndroid Build Coastguard Worker /* True if preamble instructions (shps, shpe, etc.) are supported */
235*61046927SAndroid Build Coastguard Worker bool has_preamble;
236*61046927SAndroid Build Coastguard Worker
237*61046927SAndroid Build Coastguard Worker /* Where the shared consts start in constants file, in vec4's. */
238*61046927SAndroid Build Coastguard Worker uint16_t shared_consts_base_offset;
239*61046927SAndroid Build Coastguard Worker
240*61046927SAndroid Build Coastguard Worker /* The size of shared consts for CS and FS(in vec4's).
241*61046927SAndroid Build Coastguard Worker * Also the size that is actually used on geometry stages (on a6xx).
242*61046927SAndroid Build Coastguard Worker */
243*61046927SAndroid Build Coastguard Worker uint64_t shared_consts_size;
244*61046927SAndroid Build Coastguard Worker
245*61046927SAndroid Build Coastguard Worker /* Found on a6xx for geometry stages, that is different from
246*61046927SAndroid Build Coastguard Worker * actually used shared consts.
247*61046927SAndroid Build Coastguard Worker *
248*61046927SAndroid Build Coastguard Worker * TODO: Keep an eye on this for next gens.
249*61046927SAndroid Build Coastguard Worker */
250*61046927SAndroid Build Coastguard Worker uint64_t geom_shared_consts_size_quirk;
251*61046927SAndroid Build Coastguard Worker
252*61046927SAndroid Build Coastguard Worker bool has_fs_tex_prefetch;
253*61046927SAndroid Build Coastguard Worker
254*61046927SAndroid Build Coastguard Worker bool stsc_duplication_quirk;
255*61046927SAndroid Build Coastguard Worker
256*61046927SAndroid Build Coastguard Worker bool load_shader_consts_via_preamble;
257*61046927SAndroid Build Coastguard Worker bool load_inline_uniforms_via_preamble_ldgk;
258*61046927SAndroid Build Coastguard Worker
259*61046927SAndroid Build Coastguard Worker /* True if there is a scalar ALU capable of executing a subset of
260*61046927SAndroid Build Coastguard Worker * cat2-cat4 instructions with a shared register destination. This also
261*61046927SAndroid Build Coastguard Worker * implies expanded MOV/COV capability when writing to shared registers,
262*61046927SAndroid Build Coastguard Worker * as MOV/COV is now executed on the scalar ALU except when reading from a
263*61046927SAndroid Build Coastguard Worker * normal register, as well as the ability for ldc to write to a shared
264*61046927SAndroid Build Coastguard Worker * register.
265*61046927SAndroid Build Coastguard Worker */
266*61046927SAndroid Build Coastguard Worker bool has_scalar_alu;
267*61046927SAndroid Build Coastguard Worker
268*61046927SAndroid Build Coastguard Worker bool fs_must_have_non_zero_constlen_quirk;
269*61046927SAndroid Build Coastguard Worker
270*61046927SAndroid Build Coastguard Worker /* On all generations that support scalar ALU, there is also a copy of the
271*61046927SAndroid Build Coastguard Worker * scalar ALU and some other HW units in HLSQ that can execute preambles
272*61046927SAndroid Build Coastguard Worker * before work is dispatched to the SPs, called "early preamble". We detect
273*61046927SAndroid Build Coastguard Worker * whether the shader can use early preamble in ir3.
274*61046927SAndroid Build Coastguard Worker */
275*61046927SAndroid Build Coastguard Worker bool has_early_preamble;
276*61046927SAndroid Build Coastguard Worker
277*61046927SAndroid Build Coastguard Worker /* True if (rptN) is supported for bary.f. */
278*61046927SAndroid Build Coastguard Worker bool has_rpt_bary_f;
279*61046927SAndroid Build Coastguard Worker };
280*61046927SAndroid Build Coastguard Worker
281*61046927SAndroid Build Coastguard Worker void ir3_compiler_destroy(struct ir3_compiler *compiler);
282*61046927SAndroid Build Coastguard Worker struct ir3_compiler *ir3_compiler_create(struct fd_device *dev,
283*61046927SAndroid Build Coastguard Worker const struct fd_dev_id *dev_id,
284*61046927SAndroid Build Coastguard Worker const struct fd_dev_info *dev_info,
285*61046927SAndroid Build Coastguard Worker const struct ir3_compiler_options *options);
286*61046927SAndroid Build Coastguard Worker
287*61046927SAndroid Build Coastguard Worker void ir3_disk_cache_init(struct ir3_compiler *compiler);
288*61046927SAndroid Build Coastguard Worker void ir3_disk_cache_init_shader_key(struct ir3_compiler *compiler,
289*61046927SAndroid Build Coastguard Worker struct ir3_shader *shader);
290*61046927SAndroid Build Coastguard Worker struct ir3_shader_variant *ir3_retrieve_variant(struct blob_reader *blob,
291*61046927SAndroid Build Coastguard Worker struct ir3_compiler *compiler,
292*61046927SAndroid Build Coastguard Worker void *mem_ctx);
293*61046927SAndroid Build Coastguard Worker void ir3_store_variant(struct blob *blob, const struct ir3_shader_variant *v);
294*61046927SAndroid Build Coastguard Worker bool ir3_disk_cache_retrieve(struct ir3_shader *shader,
295*61046927SAndroid Build Coastguard Worker struct ir3_shader_variant *v);
296*61046927SAndroid Build Coastguard Worker void ir3_disk_cache_store(struct ir3_shader *shader,
297*61046927SAndroid Build Coastguard Worker struct ir3_shader_variant *v);
298*61046927SAndroid Build Coastguard Worker
299*61046927SAndroid Build Coastguard Worker const nir_shader_compiler_options *
300*61046927SAndroid Build Coastguard Worker ir3_get_compiler_options(struct ir3_compiler *compiler);
301*61046927SAndroid Build Coastguard Worker
302*61046927SAndroid Build Coastguard Worker int ir3_compile_shader_nir(struct ir3_compiler *compiler,
303*61046927SAndroid Build Coastguard Worker struct ir3_shader *shader,
304*61046927SAndroid Build Coastguard Worker struct ir3_shader_variant *so);
305*61046927SAndroid Build Coastguard Worker
306*61046927SAndroid Build Coastguard Worker /* gpu pointer size in units of 32bit registers/slots */
307*61046927SAndroid Build Coastguard Worker static inline unsigned
ir3_pointer_size(struct ir3_compiler * compiler)308*61046927SAndroid Build Coastguard Worker ir3_pointer_size(struct ir3_compiler *compiler)
309*61046927SAndroid Build Coastguard Worker {
310*61046927SAndroid Build Coastguard Worker return compiler->is_64bit ? 2 : 1;
311*61046927SAndroid Build Coastguard Worker }
312*61046927SAndroid Build Coastguard Worker
313*61046927SAndroid Build Coastguard Worker enum ir3_shader_debug {
314*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_VS = BITFIELD_BIT(0),
315*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_TCS = BITFIELD_BIT(1),
316*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_TES = BITFIELD_BIT(2),
317*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_GS = BITFIELD_BIT(3),
318*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_FS = BITFIELD_BIT(4),
319*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_CS = BITFIELD_BIT(5),
320*61046927SAndroid Build Coastguard Worker IR3_DBG_DISASM = BITFIELD_BIT(6),
321*61046927SAndroid Build Coastguard Worker IR3_DBG_OPTMSGS = BITFIELD_BIT(7),
322*61046927SAndroid Build Coastguard Worker IR3_DBG_FORCES2EN = BITFIELD_BIT(8),
323*61046927SAndroid Build Coastguard Worker IR3_DBG_NOUBOOPT = BITFIELD_BIT(9),
324*61046927SAndroid Build Coastguard Worker IR3_DBG_NOFP16 = BITFIELD_BIT(10),
325*61046927SAndroid Build Coastguard Worker IR3_DBG_NOCACHE = BITFIELD_BIT(11),
326*61046927SAndroid Build Coastguard Worker IR3_DBG_SPILLALL = BITFIELD_BIT(12),
327*61046927SAndroid Build Coastguard Worker IR3_DBG_NOPREAMBLE = BITFIELD_BIT(13),
328*61046927SAndroid Build Coastguard Worker IR3_DBG_SHADER_INTERNAL = BITFIELD_BIT(14),
329*61046927SAndroid Build Coastguard Worker IR3_DBG_FULLSYNC = BITFIELD_BIT(15),
330*61046927SAndroid Build Coastguard Worker IR3_DBG_FULLNOP = BITFIELD_BIT(16),
331*61046927SAndroid Build Coastguard Worker IR3_DBG_NOEARLYPREAMBLE = BITFIELD_BIT(17),
332*61046927SAndroid Build Coastguard Worker IR3_DBG_NODESCPREFETCH = BITFIELD_BIT(18),
333*61046927SAndroid Build Coastguard Worker IR3_DBG_EXPANDRPT = BITFIELD_BIT(19),
334*61046927SAndroid Build Coastguard Worker
335*61046927SAndroid Build Coastguard Worker /* MESA_DEBUG-only options: */
336*61046927SAndroid Build Coastguard Worker IR3_DBG_SCHEDMSGS = BITFIELD_BIT(20),
337*61046927SAndroid Build Coastguard Worker IR3_DBG_RAMSGS = BITFIELD_BIT(21),
338*61046927SAndroid Build Coastguard Worker
339*61046927SAndroid Build Coastguard Worker /* Only used for the disk-caching logic: */
340*61046927SAndroid Build Coastguard Worker IR3_DBG_ROBUST_UBO_ACCESS = BITFIELD_BIT(30),
341*61046927SAndroid Build Coastguard Worker };
342*61046927SAndroid Build Coastguard Worker
343*61046927SAndroid Build Coastguard Worker extern enum ir3_shader_debug ir3_shader_debug;
344*61046927SAndroid Build Coastguard Worker extern const char *ir3_shader_override_path;
345*61046927SAndroid Build Coastguard Worker
346*61046927SAndroid Build Coastguard Worker static inline bool
shader_debug_enabled(gl_shader_stage type,bool internal)347*61046927SAndroid Build Coastguard Worker shader_debug_enabled(gl_shader_stage type, bool internal)
348*61046927SAndroid Build Coastguard Worker {
349*61046927SAndroid Build Coastguard Worker if (internal)
350*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_INTERNAL);
351*61046927SAndroid Build Coastguard Worker
352*61046927SAndroid Build Coastguard Worker if (ir3_shader_debug & IR3_DBG_DISASM)
353*61046927SAndroid Build Coastguard Worker return true;
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker switch (type) {
356*61046927SAndroid Build Coastguard Worker case MESA_SHADER_VERTEX:
357*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_VS);
358*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_CTRL:
359*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_TCS);
360*61046927SAndroid Build Coastguard Worker case MESA_SHADER_TESS_EVAL:
361*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_TES);
362*61046927SAndroid Build Coastguard Worker case MESA_SHADER_GEOMETRY:
363*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_GS);
364*61046927SAndroid Build Coastguard Worker case MESA_SHADER_FRAGMENT:
365*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_FS);
366*61046927SAndroid Build Coastguard Worker case MESA_SHADER_COMPUTE:
367*61046927SAndroid Build Coastguard Worker case MESA_SHADER_KERNEL:
368*61046927SAndroid Build Coastguard Worker return !!(ir3_shader_debug & IR3_DBG_SHADER_CS);
369*61046927SAndroid Build Coastguard Worker default:
370*61046927SAndroid Build Coastguard Worker assert(0);
371*61046927SAndroid Build Coastguard Worker return false;
372*61046927SAndroid Build Coastguard Worker }
373*61046927SAndroid Build Coastguard Worker }
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker static inline void
ir3_debug_print(struct ir3 * ir,const char * when)376*61046927SAndroid Build Coastguard Worker ir3_debug_print(struct ir3 *ir, const char *when)
377*61046927SAndroid Build Coastguard Worker {
378*61046927SAndroid Build Coastguard Worker if (ir3_shader_debug & IR3_DBG_OPTMSGS) {
379*61046927SAndroid Build Coastguard Worker mesa_logi("%s:", when);
380*61046927SAndroid Build Coastguard Worker ir3_print(ir);
381*61046927SAndroid Build Coastguard Worker }
382*61046927SAndroid Build Coastguard Worker }
383*61046927SAndroid Build Coastguard Worker
384*61046927SAndroid Build Coastguard Worker ENDC;
385*61046927SAndroid Build Coastguard Worker
386*61046927SAndroid Build Coastguard Worker #endif /* IR3_COMPILER_H_ */
387