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