xref: /aosp_15_r20/external/mesa3d/src/freedreno/ir3/ir3_compiler.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright © 2015 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 #include "util/ralloc.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "freedreno_dev_info.h"
12*61046927SAndroid Build Coastguard Worker 
13*61046927SAndroid Build Coastguard Worker #include "ir3_compiler.h"
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker static const struct debug_named_value shader_debug_options[] = {
16*61046927SAndroid Build Coastguard Worker    /* clang-format off */
17*61046927SAndroid Build Coastguard Worker    {"vs",         IR3_DBG_SHADER_VS,  "Print shader disasm for vertex shaders"},
18*61046927SAndroid Build Coastguard Worker    {"tcs",        IR3_DBG_SHADER_TCS, "Print shader disasm for tess ctrl shaders"},
19*61046927SAndroid Build Coastguard Worker    {"tes",        IR3_DBG_SHADER_TES, "Print shader disasm for tess eval shaders"},
20*61046927SAndroid Build Coastguard Worker    {"gs",         IR3_DBG_SHADER_GS,  "Print shader disasm for geometry shaders"},
21*61046927SAndroid Build Coastguard Worker    {"fs",         IR3_DBG_SHADER_FS,  "Print shader disasm for fragment shaders"},
22*61046927SAndroid Build Coastguard Worker    {"cs",         IR3_DBG_SHADER_CS,  "Print shader disasm for compute shaders"},
23*61046927SAndroid Build Coastguard Worker    {"internal",   IR3_DBG_SHADER_INTERNAL, "Print shader disasm for internal shaders (normally not included in vs/fs/cs/etc)"},
24*61046927SAndroid Build Coastguard Worker    {"disasm",     IR3_DBG_DISASM,     "Dump NIR and adreno shader disassembly"},
25*61046927SAndroid Build Coastguard Worker    {"optmsgs",    IR3_DBG_OPTMSGS,    "Enable optimizer debug messages"},
26*61046927SAndroid Build Coastguard Worker    {"forces2en",  IR3_DBG_FORCES2EN,  "Force s2en mode for tex sampler instructions"},
27*61046927SAndroid Build Coastguard Worker    {"nouboopt",   IR3_DBG_NOUBOOPT,   "Disable lowering UBO to uniform"},
28*61046927SAndroid Build Coastguard Worker    {"nofp16",     IR3_DBG_NOFP16,     "Don't lower mediump to fp16"},
29*61046927SAndroid Build Coastguard Worker    {"nocache",    IR3_DBG_NOCACHE,    "Disable shader cache"},
30*61046927SAndroid Build Coastguard Worker    {"spillall",   IR3_DBG_SPILLALL,   "Spill as much as possible to test the spiller"},
31*61046927SAndroid Build Coastguard Worker    {"nopreamble", IR3_DBG_NOPREAMBLE, "Disable the preamble pass"},
32*61046927SAndroid Build Coastguard Worker    {"fullsync",   IR3_DBG_FULLSYNC,   "Add (sy) + (ss) after each cat5/cat6"},
33*61046927SAndroid Build Coastguard Worker    {"fullnop",    IR3_DBG_FULLNOP,    "Add nops before each instruction"},
34*61046927SAndroid Build Coastguard Worker    {"noearlypreamble", IR3_DBG_NOEARLYPREAMBLE, "Disable early preambles"},
35*61046927SAndroid Build Coastguard Worker    {"nodescprefetch", IR3_DBG_NODESCPREFETCH, "Disable descriptor prefetch optimization"},
36*61046927SAndroid Build Coastguard Worker    {"expandrpt",  IR3_DBG_EXPANDRPT,  "Expand rptN instructions"},
37*61046927SAndroid Build Coastguard Worker #if MESA_DEBUG
38*61046927SAndroid Build Coastguard Worker    /* MESA_DEBUG-only options: */
39*61046927SAndroid Build Coastguard Worker    {"schedmsgs",  IR3_DBG_SCHEDMSGS,  "Enable scheduler debug messages"},
40*61046927SAndroid Build Coastguard Worker    {"ramsgs",     IR3_DBG_RAMSGS,     "Enable register-allocation debug messages"},
41*61046927SAndroid Build Coastguard Worker #endif
42*61046927SAndroid Build Coastguard Worker    DEBUG_NAMED_VALUE_END
43*61046927SAndroid Build Coastguard Worker    /* clang-format on */
44*61046927SAndroid Build Coastguard Worker };
45*61046927SAndroid Build Coastguard Worker 
46*61046927SAndroid Build Coastguard Worker DEBUG_GET_ONCE_FLAGS_OPTION(ir3_shader_debug, "IR3_SHADER_DEBUG",
47*61046927SAndroid Build Coastguard Worker                             shader_debug_options, 0)
48*61046927SAndroid Build Coastguard Worker DEBUG_GET_ONCE_OPTION(ir3_shader_override_path, "IR3_SHADER_OVERRIDE_PATH",
49*61046927SAndroid Build Coastguard Worker                       NULL)
50*61046927SAndroid Build Coastguard Worker 
51*61046927SAndroid Build Coastguard Worker enum ir3_shader_debug ir3_shader_debug = 0;
52*61046927SAndroid Build Coastguard Worker const char *ir3_shader_override_path = NULL;
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker void
ir3_compiler_destroy(struct ir3_compiler * compiler)55*61046927SAndroid Build Coastguard Worker ir3_compiler_destroy(struct ir3_compiler *compiler)
56*61046927SAndroid Build Coastguard Worker {
57*61046927SAndroid Build Coastguard Worker    disk_cache_destroy(compiler->disk_cache);
58*61046927SAndroid Build Coastguard Worker    ralloc_free(compiler);
59*61046927SAndroid Build Coastguard Worker }
60*61046927SAndroid Build Coastguard Worker 
61*61046927SAndroid Build Coastguard Worker static const nir_shader_compiler_options ir3_base_options = {
62*61046927SAndroid Build Coastguard Worker    .compact_arrays = true,
63*61046927SAndroid Build Coastguard Worker    .lower_fpow = true,
64*61046927SAndroid Build Coastguard Worker    .lower_scmp = true,
65*61046927SAndroid Build Coastguard Worker    .lower_flrp16 = true,
66*61046927SAndroid Build Coastguard Worker    .lower_flrp32 = true,
67*61046927SAndroid Build Coastguard Worker    .lower_flrp64 = true,
68*61046927SAndroid Build Coastguard Worker    .lower_ffract = true,
69*61046927SAndroid Build Coastguard Worker    .lower_fmod = true,
70*61046927SAndroid Build Coastguard Worker    .lower_fdiv = true,
71*61046927SAndroid Build Coastguard Worker    .lower_isign = true,
72*61046927SAndroid Build Coastguard Worker    .lower_ldexp = true,
73*61046927SAndroid Build Coastguard Worker    .lower_uadd_carry = true,
74*61046927SAndroid Build Coastguard Worker    .lower_usub_borrow = true,
75*61046927SAndroid Build Coastguard Worker    .lower_mul_high = true,
76*61046927SAndroid Build Coastguard Worker    .lower_mul_2x32_64 = true,
77*61046927SAndroid Build Coastguard Worker    .fuse_ffma16 = true,
78*61046927SAndroid Build Coastguard Worker    .fuse_ffma32 = true,
79*61046927SAndroid Build Coastguard Worker    .fuse_ffma64 = true,
80*61046927SAndroid Build Coastguard Worker    .vertex_id_zero_based = false,
81*61046927SAndroid Build Coastguard Worker    .lower_extract_byte = true,
82*61046927SAndroid Build Coastguard Worker    .lower_extract_word = true,
83*61046927SAndroid Build Coastguard Worker    .lower_insert_byte = true,
84*61046927SAndroid Build Coastguard Worker    .lower_insert_word = true,
85*61046927SAndroid Build Coastguard Worker    .lower_helper_invocation = true,
86*61046927SAndroid Build Coastguard Worker    .lower_bitfield_insert = true,
87*61046927SAndroid Build Coastguard Worker    .lower_bitfield_extract = true,
88*61046927SAndroid Build Coastguard Worker    .lower_pack_half_2x16 = true,
89*61046927SAndroid Build Coastguard Worker    .lower_pack_snorm_4x8 = true,
90*61046927SAndroid Build Coastguard Worker    .lower_pack_snorm_2x16 = true,
91*61046927SAndroid Build Coastguard Worker    .lower_pack_unorm_4x8 = true,
92*61046927SAndroid Build Coastguard Worker    .lower_pack_unorm_2x16 = true,
93*61046927SAndroid Build Coastguard Worker    .lower_unpack_half_2x16 = true,
94*61046927SAndroid Build Coastguard Worker    .lower_unpack_snorm_4x8 = true,
95*61046927SAndroid Build Coastguard Worker    .lower_unpack_snorm_2x16 = true,
96*61046927SAndroid Build Coastguard Worker    .lower_unpack_unorm_4x8 = true,
97*61046927SAndroid Build Coastguard Worker    .lower_unpack_unorm_2x16 = true,
98*61046927SAndroid Build Coastguard Worker    .lower_pack_split = true,
99*61046927SAndroid Build Coastguard Worker    .use_interpolated_input_intrinsics = true,
100*61046927SAndroid Build Coastguard Worker    .lower_to_scalar = true,
101*61046927SAndroid Build Coastguard Worker    .has_imul24 = true,
102*61046927SAndroid Build Coastguard Worker    .has_fsub = true,
103*61046927SAndroid Build Coastguard Worker    .has_isub = true,
104*61046927SAndroid Build Coastguard Worker    .force_indirect_unrolling_sampler = true,
105*61046927SAndroid Build Coastguard Worker    .lower_uniforms_to_ubo = true,
106*61046927SAndroid Build Coastguard Worker    .max_unroll_iterations = 32,
107*61046927SAndroid Build Coastguard Worker 
108*61046927SAndroid Build Coastguard Worker    .lower_cs_local_index_to_id = true,
109*61046927SAndroid Build Coastguard Worker    .lower_wpos_pntc = true,
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker    .lower_int64_options = (nir_lower_int64_options)~0,
112*61046927SAndroid Build Coastguard Worker    .lower_doubles_options = (nir_lower_doubles_options)~0,
113*61046927SAndroid Build Coastguard Worker 
114*61046927SAndroid Build Coastguard Worker    .divergence_analysis_options = nir_divergence_uniform_load_tears,
115*61046927SAndroid Build Coastguard Worker    .has_ddx_intrinsics = true,
116*61046927SAndroid Build Coastguard Worker    .scalarize_ddx = true,
117*61046927SAndroid Build Coastguard Worker };
118*61046927SAndroid Build Coastguard Worker 
119*61046927SAndroid Build Coastguard Worker struct ir3_compiler *
ir3_compiler_create(struct fd_device * dev,const struct fd_dev_id * dev_id,const struct fd_dev_info * dev_info,const struct ir3_compiler_options * options)120*61046927SAndroid Build Coastguard Worker ir3_compiler_create(struct fd_device *dev, const struct fd_dev_id *dev_id,
121*61046927SAndroid Build Coastguard Worker                     const struct fd_dev_info *dev_info,
122*61046927SAndroid Build Coastguard Worker                     const struct ir3_compiler_options *options)
123*61046927SAndroid Build Coastguard Worker {
124*61046927SAndroid Build Coastguard Worker    struct ir3_compiler *compiler = rzalloc(NULL, struct ir3_compiler);
125*61046927SAndroid Build Coastguard Worker 
126*61046927SAndroid Build Coastguard Worker    ir3_shader_debug = debug_get_option_ir3_shader_debug();
127*61046927SAndroid Build Coastguard Worker    ir3_shader_override_path =
128*61046927SAndroid Build Coastguard Worker       __normal_user() ? debug_get_option_ir3_shader_override_path() : NULL;
129*61046927SAndroid Build Coastguard Worker 
130*61046927SAndroid Build Coastguard Worker    if (ir3_shader_override_path) {
131*61046927SAndroid Build Coastguard Worker       ir3_shader_debug |= IR3_DBG_NOCACHE;
132*61046927SAndroid Build Coastguard Worker    }
133*61046927SAndroid Build Coastguard Worker 
134*61046927SAndroid Build Coastguard Worker    compiler->dev = dev;
135*61046927SAndroid Build Coastguard Worker    compiler->dev_id = dev_id;
136*61046927SAndroid Build Coastguard Worker    compiler->gen = fd_dev_gen(dev_id);
137*61046927SAndroid Build Coastguard Worker    compiler->is_64bit = fd_dev_64b(dev_id);
138*61046927SAndroid Build Coastguard Worker    compiler->options = *options;
139*61046927SAndroid Build Coastguard Worker 
140*61046927SAndroid Build Coastguard Worker    /* TODO see if older GPU's were different here */
141*61046927SAndroid Build Coastguard Worker    compiler->branchstack_size = 64;
142*61046927SAndroid Build Coastguard Worker    compiler->wave_granularity = dev_info->wave_granularity;
143*61046927SAndroid Build Coastguard Worker    compiler->max_waves = dev_info->max_waves;
144*61046927SAndroid Build Coastguard Worker 
145*61046927SAndroid Build Coastguard Worker    compiler->max_variable_workgroup_size = 1024;
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker    compiler->local_mem_size = dev_info->cs_shared_mem_size;
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker    compiler->num_predicates = 1;
150*61046927SAndroid Build Coastguard Worker    compiler->bitops_can_write_predicates = false;
151*61046927SAndroid Build Coastguard Worker    compiler->has_branch_and_or = false;
152*61046927SAndroid Build Coastguard Worker    compiler->has_rpt_bary_f = false;
153*61046927SAndroid Build Coastguard Worker 
154*61046927SAndroid Build Coastguard Worker    if (compiler->gen >= 6) {
155*61046927SAndroid Build Coastguard Worker       compiler->samgq_workaround = true;
156*61046927SAndroid Build Coastguard Worker       /* a6xx split the pipeline state into geometry and fragment state, in
157*61046927SAndroid Build Coastguard Worker        * order to let the VS run ahead of the FS. As a result there are now
158*61046927SAndroid Build Coastguard Worker        * separate const files for the the fragment shader and everything
159*61046927SAndroid Build Coastguard Worker        * else, and separate limits. There seems to be a shared limit, but
160*61046927SAndroid Build Coastguard Worker        * it's higher than the vert or frag limits.
161*61046927SAndroid Build Coastguard Worker        *
162*61046927SAndroid Build Coastguard Worker        * Also, according to the observation on a630/a650/a660, max_const_pipeline
163*61046927SAndroid Build Coastguard Worker        * has to be 512 when all geometry stages are present. Otherwise a gpu hang
164*61046927SAndroid Build Coastguard Worker        * happens. Accordingly maximum safe size for each stage should be under
165*61046927SAndroid Build Coastguard Worker        * (max_const_pipeline / 5 (stages)) with 4 vec4's alignment considered for
166*61046927SAndroid Build Coastguard Worker        * const files.
167*61046927SAndroid Build Coastguard Worker        *
168*61046927SAndroid Build Coastguard Worker        * Only when VS and FS stages are present, the limit is 640.
169*61046927SAndroid Build Coastguard Worker        *
170*61046927SAndroid Build Coastguard Worker        * TODO: The shared limit seems to be different on different models.
171*61046927SAndroid Build Coastguard Worker        */
172*61046927SAndroid Build Coastguard Worker       compiler->max_const_pipeline = 512;
173*61046927SAndroid Build Coastguard Worker       compiler->max_const_frag = 512;
174*61046927SAndroid Build Coastguard Worker       compiler->max_const_geom = 512;
175*61046927SAndroid Build Coastguard Worker       compiler->max_const_safe = 100;
176*61046927SAndroid Build Coastguard Worker 
177*61046927SAndroid Build Coastguard Worker       /* Compute shaders don't share a const file with the FS. Instead they
178*61046927SAndroid Build Coastguard Worker        * have their own file, which is smaller than the FS one. On a7xx the size
179*61046927SAndroid Build Coastguard Worker        * was doubled.
180*61046927SAndroid Build Coastguard Worker        *
181*61046927SAndroid Build Coastguard Worker        * TODO: is this true on earlier gen's?
182*61046927SAndroid Build Coastguard Worker        */
183*61046927SAndroid Build Coastguard Worker       compiler->max_const_compute = compiler->gen >= 7 ? 512 : 256;
184*61046927SAndroid Build Coastguard Worker 
185*61046927SAndroid Build Coastguard Worker       /* TODO: implement clip+cull distances on earlier gen's */
186*61046927SAndroid Build Coastguard Worker       compiler->has_clip_cull = true;
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker       compiler->has_preamble = true;
189*61046927SAndroid Build Coastguard Worker 
190*61046927SAndroid Build Coastguard Worker       compiler->tess_use_shared = dev_info->a6xx.tess_use_shared;
191*61046927SAndroid Build Coastguard Worker 
192*61046927SAndroid Build Coastguard Worker       compiler->has_getfiberid = dev_info->a6xx.has_getfiberid;
193*61046927SAndroid Build Coastguard Worker 
194*61046927SAndroid Build Coastguard Worker       compiler->has_dp2acc = dev_info->a6xx.has_dp2acc;
195*61046927SAndroid Build Coastguard Worker       compiler->has_dp4acc = dev_info->a6xx.has_dp4acc;
196*61046927SAndroid Build Coastguard Worker       compiler->has_compliant_dp4acc = dev_info->a7xx.has_compliant_dp4acc;
197*61046927SAndroid Build Coastguard Worker 
198*61046927SAndroid Build Coastguard Worker       if (compiler->gen == 6 && options->shared_push_consts) {
199*61046927SAndroid Build Coastguard Worker          compiler->shared_consts_base_offset = 504;
200*61046927SAndroid Build Coastguard Worker          compiler->shared_consts_size = 8;
201*61046927SAndroid Build Coastguard Worker          compiler->geom_shared_consts_size_quirk = 16;
202*61046927SAndroid Build Coastguard Worker       } else {
203*61046927SAndroid Build Coastguard Worker          compiler->shared_consts_base_offset = -1;
204*61046927SAndroid Build Coastguard Worker          compiler->shared_consts_size = 0;
205*61046927SAndroid Build Coastguard Worker          compiler->geom_shared_consts_size_quirk = 0;
206*61046927SAndroid Build Coastguard Worker       }
207*61046927SAndroid Build Coastguard Worker 
208*61046927SAndroid Build Coastguard Worker       compiler->has_fs_tex_prefetch = dev_info->a6xx.has_fs_tex_prefetch;
209*61046927SAndroid Build Coastguard Worker       compiler->stsc_duplication_quirk = dev_info->a7xx.stsc_duplication_quirk;
210*61046927SAndroid Build Coastguard Worker       compiler->load_shader_consts_via_preamble = dev_info->a7xx.load_shader_consts_via_preamble;
211*61046927SAndroid Build Coastguard Worker       compiler->load_inline_uniforms_via_preamble_ldgk = dev_info->a7xx.load_inline_uniforms_via_preamble_ldgk;
212*61046927SAndroid Build Coastguard Worker       compiler->num_predicates = 4;
213*61046927SAndroid Build Coastguard Worker       compiler->bitops_can_write_predicates = true;
214*61046927SAndroid Build Coastguard Worker       compiler->has_branch_and_or = true;
215*61046927SAndroid Build Coastguard Worker       compiler->has_predication = true;
216*61046927SAndroid Build Coastguard Worker       compiler->has_scalar_alu = dev_info->a6xx.has_scalar_alu;
217*61046927SAndroid Build Coastguard Worker       compiler->has_isam_v = dev_info->a6xx.has_isam_v;
218*61046927SAndroid Build Coastguard Worker       compiler->has_ssbo_imm_offsets = dev_info->a6xx.has_ssbo_imm_offsets;
219*61046927SAndroid Build Coastguard Worker       compiler->fs_must_have_non_zero_constlen_quirk = dev_info->a7xx.fs_must_have_non_zero_constlen_quirk;
220*61046927SAndroid Build Coastguard Worker       compiler->has_early_preamble = dev_info->a6xx.has_early_preamble;
221*61046927SAndroid Build Coastguard Worker       compiler->has_rpt_bary_f = true;
222*61046927SAndroid Build Coastguard Worker    } else {
223*61046927SAndroid Build Coastguard Worker       compiler->max_const_pipeline = 512;
224*61046927SAndroid Build Coastguard Worker       compiler->max_const_geom = 512;
225*61046927SAndroid Build Coastguard Worker       compiler->max_const_frag = 512;
226*61046927SAndroid Build Coastguard Worker       compiler->max_const_compute = 512;
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker       /* Note: this will have to change if/when we support tess+GS on
229*61046927SAndroid Build Coastguard Worker        * earlier gen's.
230*61046927SAndroid Build Coastguard Worker        */
231*61046927SAndroid Build Coastguard Worker       compiler->max_const_safe = 256;
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker       compiler->has_scalar_alu = false;
234*61046927SAndroid Build Coastguard Worker       compiler->has_isam_v = false;
235*61046927SAndroid Build Coastguard Worker       compiler->has_ssbo_imm_offsets = false;
236*61046927SAndroid Build Coastguard Worker       compiler->has_early_preamble = false;
237*61046927SAndroid Build Coastguard Worker    }
238*61046927SAndroid Build Coastguard Worker 
239*61046927SAndroid Build Coastguard Worker    /* This is just a guess for a4xx. */
240*61046927SAndroid Build Coastguard Worker    compiler->pvtmem_per_fiber_align = compiler->gen >= 4 ? 512 : 128;
241*61046927SAndroid Build Coastguard Worker    /* TODO: implement private memory on earlier gen's */
242*61046927SAndroid Build Coastguard Worker    compiler->has_pvtmem = compiler->gen >= 5;
243*61046927SAndroid Build Coastguard Worker 
244*61046927SAndroid Build Coastguard Worker    compiler->has_isam_ssbo = compiler->gen >= 6;
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker    if (compiler->gen >= 6) {
247*61046927SAndroid Build Coastguard Worker       compiler->reg_size_vec4 = dev_info->a6xx.reg_size_vec4;
248*61046927SAndroid Build Coastguard Worker    } else if (compiler->gen >= 4) {
249*61046927SAndroid Build Coastguard Worker       /* On a4xx-a5xx, using r24.x and above requires using the smallest
250*61046927SAndroid Build Coastguard Worker        * threadsize.
251*61046927SAndroid Build Coastguard Worker        */
252*61046927SAndroid Build Coastguard Worker       compiler->reg_size_vec4 = 48;
253*61046927SAndroid Build Coastguard Worker    } else {
254*61046927SAndroid Build Coastguard Worker       /* TODO: confirm this */
255*61046927SAndroid Build Coastguard Worker       compiler->reg_size_vec4 = 96;
256*61046927SAndroid Build Coastguard Worker    }
257*61046927SAndroid Build Coastguard Worker 
258*61046927SAndroid Build Coastguard Worker    compiler->threadsize_base = dev_info->threadsize_base;
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker    if (compiler->gen >= 4) {
261*61046927SAndroid Build Coastguard Worker       /* need special handling for "flat" */
262*61046927SAndroid Build Coastguard Worker       compiler->flat_bypass = true;
263*61046927SAndroid Build Coastguard Worker       compiler->levels_add_one = false;
264*61046927SAndroid Build Coastguard Worker       compiler->unminify_coords = false;
265*61046927SAndroid Build Coastguard Worker       compiler->txf_ms_with_isaml = false;
266*61046927SAndroid Build Coastguard Worker       compiler->array_index_add_half = true;
267*61046927SAndroid Build Coastguard Worker       compiler->instr_align = 16;
268*61046927SAndroid Build Coastguard Worker       compiler->const_upload_unit = 4;
269*61046927SAndroid Build Coastguard Worker    } else {
270*61046927SAndroid Build Coastguard Worker       /* no special handling for "flat" */
271*61046927SAndroid Build Coastguard Worker       compiler->flat_bypass = false;
272*61046927SAndroid Build Coastguard Worker       compiler->levels_add_one = true;
273*61046927SAndroid Build Coastguard Worker       compiler->unminify_coords = true;
274*61046927SAndroid Build Coastguard Worker       compiler->txf_ms_with_isaml = true;
275*61046927SAndroid Build Coastguard Worker       compiler->array_index_add_half = false;
276*61046927SAndroid Build Coastguard Worker       compiler->instr_align = 4;
277*61046927SAndroid Build Coastguard Worker       compiler->const_upload_unit = 8;
278*61046927SAndroid Build Coastguard Worker    }
279*61046927SAndroid Build Coastguard Worker 
280*61046927SAndroid Build Coastguard Worker    compiler->bool_type = (compiler->gen >= 5) ? TYPE_U16 : TYPE_U32;
281*61046927SAndroid Build Coastguard Worker    compiler->has_shared_regfile = compiler->gen >= 5;
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    /* The driver can't request this unless preambles are supported. */
284*61046927SAndroid Build Coastguard Worker    if (options->push_ubo_with_preamble)
285*61046927SAndroid Build Coastguard Worker       assert(compiler->has_preamble);
286*61046927SAndroid Build Coastguard Worker 
287*61046927SAndroid Build Coastguard Worker    /* Set up nir shader compiler options, using device-specific overrides of our base settings. */
288*61046927SAndroid Build Coastguard Worker    compiler->nir_options = ir3_base_options;
289*61046927SAndroid Build Coastguard Worker 
290*61046927SAndroid Build Coastguard Worker    if (compiler->gen >= 6) {
291*61046927SAndroid Build Coastguard Worker       compiler->nir_options.vectorize_io = true,
292*61046927SAndroid Build Coastguard Worker       compiler->nir_options.force_indirect_unrolling = nir_var_all,
293*61046927SAndroid Build Coastguard Worker       compiler->nir_options.lower_device_index_to_zero = true;
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker       if (dev_info->a6xx.has_dp2acc || dev_info->a6xx.has_dp4acc) {
296*61046927SAndroid Build Coastguard Worker          compiler->nir_options.has_udot_4x8 =
297*61046927SAndroid Build Coastguard Worker             compiler->nir_options.has_udot_4x8_sat = true;
298*61046927SAndroid Build Coastguard Worker          compiler->nir_options.has_sudot_4x8 =
299*61046927SAndroid Build Coastguard Worker             compiler->nir_options.has_sudot_4x8_sat = true;
300*61046927SAndroid Build Coastguard Worker       }
301*61046927SAndroid Build Coastguard Worker 
302*61046927SAndroid Build Coastguard Worker       if (dev_info->a6xx.has_dp4acc && dev_info->a7xx.has_compliant_dp4acc) {
303*61046927SAndroid Build Coastguard Worker          compiler->nir_options.has_sdot_4x8 =
304*61046927SAndroid Build Coastguard Worker             compiler->nir_options.has_sdot_4x8_sat = true;
305*61046927SAndroid Build Coastguard Worker       }
306*61046927SAndroid Build Coastguard Worker    } else if (compiler->gen >= 3 && compiler->gen <= 5) {
307*61046927SAndroid Build Coastguard Worker       compiler->nir_options.vertex_id_zero_based = true;
308*61046927SAndroid Build Coastguard Worker    } else if (compiler->gen <= 2) {
309*61046927SAndroid Build Coastguard Worker       /* a2xx compiler doesn't handle indirect: */
310*61046927SAndroid Build Coastguard Worker       compiler->nir_options.force_indirect_unrolling = nir_var_all;
311*61046927SAndroid Build Coastguard Worker    }
312*61046927SAndroid Build Coastguard Worker 
313*61046927SAndroid Build Coastguard Worker    if (options->lower_base_vertex) {
314*61046927SAndroid Build Coastguard Worker       compiler->nir_options.lower_base_vertex = true;
315*61046927SAndroid Build Coastguard Worker    }
316*61046927SAndroid Build Coastguard Worker 
317*61046927SAndroid Build Coastguard Worker    /* 16-bit ALU op generation is mostly controlled by frontend compiler options, but
318*61046927SAndroid Build Coastguard Worker     * this core NIR option enables some optimizations of 16-bit operations.
319*61046927SAndroid Build Coastguard Worker     */
320*61046927SAndroid Build Coastguard Worker    if (compiler->gen >= 5 && !(ir3_shader_debug & IR3_DBG_NOFP16))
321*61046927SAndroid Build Coastguard Worker       compiler->nir_options.support_16bit_alu = true;
322*61046927SAndroid Build Coastguard Worker 
323*61046927SAndroid Build Coastguard Worker    if (!options->disable_cache)
324*61046927SAndroid Build Coastguard Worker       ir3_disk_cache_init(compiler);
325*61046927SAndroid Build Coastguard Worker 
326*61046927SAndroid Build Coastguard Worker    return compiler;
327*61046927SAndroid Build Coastguard Worker }
328*61046927SAndroid Build Coastguard Worker 
329*61046927SAndroid Build Coastguard Worker const nir_shader_compiler_options *
ir3_get_compiler_options(struct ir3_compiler * compiler)330*61046927SAndroid Build Coastguard Worker ir3_get_compiler_options(struct ir3_compiler *compiler)
331*61046927SAndroid Build Coastguard Worker {
332*61046927SAndroid Build Coastguard Worker    return &compiler->nir_options;
333*61046927SAndroid Build Coastguard Worker }
334