xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/agx_compile.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2018-2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker  */
5*61046927SAndroid Build Coastguard Worker 
6*61046927SAndroid Build Coastguard Worker #pragma once
7*61046927SAndroid Build Coastguard Worker 
8*61046927SAndroid Build Coastguard Worker #include "compiler/nir/nir.h"
9*61046927SAndroid Build Coastguard Worker #include "util/u_dynarray.h"
10*61046927SAndroid Build Coastguard Worker #include "shader_enums.h"
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker struct agx_cf_binding {
13*61046927SAndroid Build Coastguard Worker    /* Base coefficient register */
14*61046927SAndroid Build Coastguard Worker    unsigned cf_base;
15*61046927SAndroid Build Coastguard Worker 
16*61046927SAndroid Build Coastguard Worker    /* Slot being bound */
17*61046927SAndroid Build Coastguard Worker    gl_varying_slot slot;
18*61046927SAndroid Build Coastguard Worker 
19*61046927SAndroid Build Coastguard Worker    /* First component bound.
20*61046927SAndroid Build Coastguard Worker     *
21*61046927SAndroid Build Coastguard Worker     * Must be 2 (Z) or 3 (W) if slot == VARYING_SLOT_POS.
22*61046927SAndroid Build Coastguard Worker     */
23*61046927SAndroid Build Coastguard Worker    unsigned offset : 2;
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker    /* Number of components bound */
26*61046927SAndroid Build Coastguard Worker    unsigned count : 3;
27*61046927SAndroid Build Coastguard Worker 
28*61046927SAndroid Build Coastguard Worker    /* Is smooth shading enabled? If false, flat shading is used */
29*61046927SAndroid Build Coastguard Worker    bool smooth : 1;
30*61046927SAndroid Build Coastguard Worker 
31*61046927SAndroid Build Coastguard Worker    /* Perspective correct interpolation */
32*61046927SAndroid Build Coastguard Worker    bool perspective : 1;
33*61046927SAndroid Build Coastguard Worker };
34*61046927SAndroid Build Coastguard Worker 
35*61046927SAndroid Build Coastguard Worker /* Conservative bound, * 4 due to offsets (TODO: maybe worth eliminating
36*61046927SAndroid Build Coastguard Worker  * coefficient register aliasing?)
37*61046927SAndroid Build Coastguard Worker  */
38*61046927SAndroid Build Coastguard Worker #define AGX_MAX_CF_BINDINGS (VARYING_SLOT_MAX * 4)
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker struct agx_varyings_fs {
41*61046927SAndroid Build Coastguard Worker    /* Number of coefficient registers used */
42*61046927SAndroid Build Coastguard Worker    unsigned nr_cf;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker    /* Number of coefficient register bindings */
45*61046927SAndroid Build Coastguard Worker    unsigned nr_bindings;
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker    /* Whether gl_FragCoord.z is read */
48*61046927SAndroid Build Coastguard Worker    bool reads_z;
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker    /* Coefficient register bindings */
51*61046927SAndroid Build Coastguard Worker    struct agx_cf_binding bindings[AGX_MAX_CF_BINDINGS];
52*61046927SAndroid Build Coastguard Worker };
53*61046927SAndroid Build Coastguard Worker 
54*61046927SAndroid Build Coastguard Worker union agx_varyings {
55*61046927SAndroid Build Coastguard Worker    struct agx_varyings_fs fs;
56*61046927SAndroid Build Coastguard Worker };
57*61046927SAndroid Build Coastguard Worker 
58*61046927SAndroid Build Coastguard Worker struct agx_interp_info {
59*61046927SAndroid Build Coastguard Worker    /* Bit masks indexed by I/O location of flat and linear varyings */
60*61046927SAndroid Build Coastguard Worker    uint64_t flat;
61*61046927SAndroid Build Coastguard Worker    uint64_t linear;
62*61046927SAndroid Build Coastguard Worker };
63*61046927SAndroid Build Coastguard Worker static_assert(sizeof(struct agx_interp_info) == 16, "packed");
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker struct agx_shader_info {
66*61046927SAndroid Build Coastguard Worker    enum pipe_shader_type stage;
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    union agx_varyings varyings;
69*61046927SAndroid Build Coastguard Worker 
70*61046927SAndroid Build Coastguard Worker    /* Number of uniforms */
71*61046927SAndroid Build Coastguard Worker    unsigned push_count;
72*61046927SAndroid Build Coastguard Worker 
73*61046927SAndroid Build Coastguard Worker    /* Local memory allocation in bytes */
74*61046927SAndroid Build Coastguard Worker    unsigned local_size;
75*61046927SAndroid Build Coastguard Worker 
76*61046927SAndroid Build Coastguard Worker    /* Local imageblock allocation in bytes per thread */
77*61046927SAndroid Build Coastguard Worker    unsigned imageblock_stride;
78*61046927SAndroid Build Coastguard Worker 
79*61046927SAndroid Build Coastguard Worker    /* Scratch memory allocation in bytes for main/preamble respectively */
80*61046927SAndroid Build Coastguard Worker    unsigned scratch_size, preamble_scratch_size;
81*61046927SAndroid Build Coastguard Worker 
82*61046927SAndroid Build Coastguard Worker    /* Size in bytes of the main sahder */
83*61046927SAndroid Build Coastguard Worker    unsigned main_size;
84*61046927SAndroid Build Coastguard Worker 
85*61046927SAndroid Build Coastguard Worker    /* Does the shader have a preamble? If so, it is at offset preamble_offset.
86*61046927SAndroid Build Coastguard Worker     * The main shader is at offset main_offset. The preamble is executed first.
87*61046927SAndroid Build Coastguard Worker     */
88*61046927SAndroid Build Coastguard Worker    bool has_preamble;
89*61046927SAndroid Build Coastguard Worker    unsigned preamble_offset, main_offset;
90*61046927SAndroid Build Coastguard Worker 
91*61046927SAndroid Build Coastguard Worker    /* Does the shader read the tilebuffer? */
92*61046927SAndroid Build Coastguard Worker    bool reads_tib;
93*61046927SAndroid Build Coastguard Worker 
94*61046927SAndroid Build Coastguard Worker    /* Does the shader require early fragment tests? */
95*61046927SAndroid Build Coastguard Worker    bool early_fragment_tests;
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker    /* Does the shader potentially draw to a nonzero viewport? */
98*61046927SAndroid Build Coastguard Worker    bool nonzero_viewport;
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker    /* Does the shader write layer and/or viewport index? Written together */
101*61046927SAndroid Build Coastguard Worker    bool writes_layer_viewport;
102*61046927SAndroid Build Coastguard Worker 
103*61046927SAndroid Build Coastguard Worker    /* Does the shader control the sample mask? */
104*61046927SAndroid Build Coastguard Worker    bool writes_sample_mask;
105*61046927SAndroid Build Coastguard Worker 
106*61046927SAndroid Build Coastguard Worker    /* Depth layout, never equal to NONE */
107*61046927SAndroid Build Coastguard Worker    enum gl_frag_depth_layout depth_layout;
108*61046927SAndroid Build Coastguard Worker 
109*61046927SAndroid Build Coastguard Worker    /* Based only the compiled shader, should tag writes be disabled? This is set
110*61046927SAndroid Build Coastguard Worker     * based on what is outputted. Note if rasterizer discard is used, that needs
111*61046927SAndroid Build Coastguard Worker     * to disable tag writes regardless of this flag.
112*61046927SAndroid Build Coastguard Worker     */
113*61046927SAndroid Build Coastguard Worker    bool tag_write_disable;
114*61046927SAndroid Build Coastguard Worker 
115*61046927SAndroid Build Coastguard Worker    /* Shader is incompatible with triangle merging */
116*61046927SAndroid Build Coastguard Worker    bool disable_tri_merging;
117*61046927SAndroid Build Coastguard Worker 
118*61046927SAndroid Build Coastguard Worker    /* Reads draw ID system value */
119*61046927SAndroid Build Coastguard Worker    bool uses_draw_id;
120*61046927SAndroid Build Coastguard Worker 
121*61046927SAndroid Build Coastguard Worker    /* Reads base vertex/instance */
122*61046927SAndroid Build Coastguard Worker    bool uses_base_param;
123*61046927SAndroid Build Coastguard Worker 
124*61046927SAndroid Build Coastguard Worker    /* Uses txf and hence needs a txf sampler mapped */
125*61046927SAndroid Build Coastguard Worker    bool uses_txf;
126*61046927SAndroid Build Coastguard Worker 
127*61046927SAndroid Build Coastguard Worker    /* Number of 16-bit registers used by the main shader and preamble
128*61046927SAndroid Build Coastguard Worker     * respectively.
129*61046927SAndroid Build Coastguard Worker     */
130*61046927SAndroid Build Coastguard Worker    unsigned nr_gprs, nr_preamble_gprs;
131*61046927SAndroid Build Coastguard Worker 
132*61046927SAndroid Build Coastguard Worker    /* Output mask set during driver lowering */
133*61046927SAndroid Build Coastguard Worker    uint64_t outputs;
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker    /* Immediate data that must be uploaded and mapped as uniform registers */
136*61046927SAndroid Build Coastguard Worker    unsigned immediate_base_uniform;
137*61046927SAndroid Build Coastguard Worker    unsigned immediate_size_16;
138*61046927SAndroid Build Coastguard Worker    uint16_t immediates[512];
139*61046927SAndroid Build Coastguard Worker };
140*61046927SAndroid Build Coastguard Worker 
141*61046927SAndroid Build Coastguard Worker struct agx_shader_part {
142*61046927SAndroid Build Coastguard Worker    struct agx_shader_info info;
143*61046927SAndroid Build Coastguard Worker    void *binary;
144*61046927SAndroid Build Coastguard Worker    size_t binary_size;
145*61046927SAndroid Build Coastguard Worker };
146*61046927SAndroid Build Coastguard Worker 
147*61046927SAndroid Build Coastguard Worker #define AGX_MAX_RTS (8)
148*61046927SAndroid Build Coastguard Worker 
149*61046927SAndroid Build Coastguard Worker enum agx_format {
150*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_I8 = 0,
151*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_I16 = 1,
152*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_I32 = 2,
153*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_F16 = 3,
154*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_U8NORM = 4,
155*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_S8NORM = 5,
156*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_U16NORM = 6,
157*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_S16NORM = 7,
158*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_RGB10A2 = 8,
159*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_SRGBA8 = 10,
160*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_RG11B10F = 12,
161*61046927SAndroid Build Coastguard Worker    AGX_FORMAT_RGB9E5 = 13,
162*61046927SAndroid Build Coastguard Worker 
163*61046927SAndroid Build Coastguard Worker    /* Keep last */
164*61046927SAndroid Build Coastguard Worker    AGX_NUM_FORMATS,
165*61046927SAndroid Build Coastguard Worker };
166*61046927SAndroid Build Coastguard Worker 
167*61046927SAndroid Build Coastguard Worker struct agx_fs_shader_key {
168*61046927SAndroid Build Coastguard Worker    /* Normally, access to the tilebuffer must be guarded by appropriate fencing
169*61046927SAndroid Build Coastguard Worker     * instructions to ensure correct results in the presence of out-of-order
170*61046927SAndroid Build Coastguard Worker     * hardware optimizations. However, specially dispatched clear shaders are
171*61046927SAndroid Build Coastguard Worker     * not subject to these conditions and can omit the wait instructions.
172*61046927SAndroid Build Coastguard Worker     *
173*61046927SAndroid Build Coastguard Worker     * Must (only) be set for special clear shaders.
174*61046927SAndroid Build Coastguard Worker     *
175*61046927SAndroid Build Coastguard Worker     * Must not be used with sample mask writes (including discards) or
176*61046927SAndroid Build Coastguard Worker     * tilebuffer loads (including blending).
177*61046927SAndroid Build Coastguard Worker     */
178*61046927SAndroid Build Coastguard Worker    bool ignore_tib_dependencies;
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker    /* When dynamic sample shading is used, the fragment shader is wrapped in a
181*61046927SAndroid Build Coastguard Worker     * loop external to the API shader. This bit indicates that we are compiling
182*61046927SAndroid Build Coastguard Worker     * inside the sample loop, meaning the execution nesting counter is already
183*61046927SAndroid Build Coastguard Worker     * zero and must be preserved.
184*61046927SAndroid Build Coastguard Worker     */
185*61046927SAndroid Build Coastguard Worker    bool inside_sample_loop;
186*61046927SAndroid Build Coastguard Worker 
187*61046927SAndroid Build Coastguard Worker    /* Base coefficient register. 0 for API shaders but nonzero for FS prolog */
188*61046927SAndroid Build Coastguard Worker    uint8_t cf_base;
189*61046927SAndroid Build Coastguard Worker };
190*61046927SAndroid Build Coastguard Worker 
191*61046927SAndroid Build Coastguard Worker struct agx_device_key {
192*61046927SAndroid Build Coastguard Worker    /* Does the target GPU need explicit cluster coherency for atomics?
193*61046927SAndroid Build Coastguard Worker     * Only used on G13X.
194*61046927SAndroid Build Coastguard Worker     */
195*61046927SAndroid Build Coastguard Worker    bool needs_g13x_coherency;
196*61046927SAndroid Build Coastguard Worker 
197*61046927SAndroid Build Coastguard Worker    /* Is soft fault enabled? This is technically system-wide policy set by the
198*61046927SAndroid Build Coastguard Worker     * kernel, but that's functionally a hardware feature.
199*61046927SAndroid Build Coastguard Worker     */
200*61046927SAndroid Build Coastguard Worker    bool soft_fault;
201*61046927SAndroid Build Coastguard Worker };
202*61046927SAndroid Build Coastguard Worker 
203*61046927SAndroid Build Coastguard Worker struct agx_shader_key {
204*61046927SAndroid Build Coastguard Worker    /* Device info */
205*61046927SAndroid Build Coastguard Worker    struct agx_device_key dev;
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker    /* Number of reserved preamble slots at the start */
208*61046927SAndroid Build Coastguard Worker    unsigned reserved_preamble;
209*61046927SAndroid Build Coastguard Worker 
210*61046927SAndroid Build Coastguard Worker    /* Library routines to link against */
211*61046927SAndroid Build Coastguard Worker    const nir_shader *libagx;
212*61046927SAndroid Build Coastguard Worker 
213*61046927SAndroid Build Coastguard Worker    /* Whether scratch memory is available in the given shader stage */
214*61046927SAndroid Build Coastguard Worker    bool has_scratch;
215*61046927SAndroid Build Coastguard Worker 
216*61046927SAndroid Build Coastguard Worker    /* Whether we're compiling the helper program used for scratch allocation.
217*61046927SAndroid Build Coastguard Worker     * This has special register allocation requirements.
218*61046927SAndroid Build Coastguard Worker     */
219*61046927SAndroid Build Coastguard Worker    bool is_helper;
220*61046927SAndroid Build Coastguard Worker 
221*61046927SAndroid Build Coastguard Worker    /* Whether the driver supports uploading constants for this shader. If
222*61046927SAndroid Build Coastguard Worker     * false, constants will not be promoted to uniforms.
223*61046927SAndroid Build Coastguard Worker     */
224*61046927SAndroid Build Coastguard Worker    bool promote_constants;
225*61046927SAndroid Build Coastguard Worker 
226*61046927SAndroid Build Coastguard Worker    /* Set if this is a non-monolithic shader that must be linked with additional
227*61046927SAndroid Build Coastguard Worker     * shader parts before the program can be used. This suppresses omission of
228*61046927SAndroid Build Coastguard Worker     * `stop` instructions, which the linker must insert instead.
229*61046927SAndroid Build Coastguard Worker     */
230*61046927SAndroid Build Coastguard Worker    bool no_stop;
231*61046927SAndroid Build Coastguard Worker 
232*61046927SAndroid Build Coastguard Worker    /* Set if this is a secondary shader part (prolog or epilog). This prevents
233*61046927SAndroid Build Coastguard Worker     * the compiler from allocating uniform registers. For example, this turns
234*61046927SAndroid Build Coastguard Worker     * off preambles.
235*61046927SAndroid Build Coastguard Worker     */
236*61046927SAndroid Build Coastguard Worker    bool secondary;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker    union {
239*61046927SAndroid Build Coastguard Worker       struct agx_fs_shader_key fs;
240*61046927SAndroid Build Coastguard Worker    };
241*61046927SAndroid Build Coastguard Worker };
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker struct agx_interp_info agx_gather_interp_info(nir_shader *nir);
244*61046927SAndroid Build Coastguard Worker uint64_t agx_gather_texcoords(nir_shader *nir);
245*61046927SAndroid Build Coastguard Worker 
246*61046927SAndroid Build Coastguard Worker void agx_link_libagx(nir_shader *nir, const nir_shader *libagx);
247*61046927SAndroid Build Coastguard Worker void agx_preprocess_nir(nir_shader *nir, const nir_shader *libagx);
248*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_discard_zs_emit(nir_shader *s);
249*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_sample_mask(nir_shader *s);
250*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_interpolation(nir_shader *s);
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_cull_distance_vs(struct nir_shader *s);
253*61046927SAndroid Build Coastguard Worker bool agx_nir_lower_cull_distance_fs(struct nir_shader *s,
254*61046927SAndroid Build Coastguard Worker                                     unsigned nr_distances);
255*61046927SAndroid Build Coastguard Worker 
256*61046927SAndroid Build Coastguard Worker void agx_compile_shader_nir(nir_shader *nir, struct agx_shader_key *key,
257*61046927SAndroid Build Coastguard Worker                             struct util_debug_callback *debug,
258*61046927SAndroid Build Coastguard Worker                             struct agx_shader_part *out);
259*61046927SAndroid Build Coastguard Worker 
260*61046927SAndroid Build Coastguard Worker struct agx_occupancy {
261*61046927SAndroid Build Coastguard Worker    unsigned max_registers;
262*61046927SAndroid Build Coastguard Worker    unsigned max_threads;
263*61046927SAndroid Build Coastguard Worker };
264*61046927SAndroid Build Coastguard Worker 
265*61046927SAndroid Build Coastguard Worker struct agx_occupancy agx_occupancy_for_register_count(unsigned halfregs);
266*61046927SAndroid Build Coastguard Worker unsigned agx_max_registers_for_occupancy(unsigned occupancy);
267*61046927SAndroid Build Coastguard Worker 
268*61046927SAndroid Build Coastguard Worker static const nir_shader_compiler_options agx_nir_options = {
269*61046927SAndroid Build Coastguard Worker    .lower_fdiv = true,
270*61046927SAndroid Build Coastguard Worker    .fuse_ffma16 = true,
271*61046927SAndroid Build Coastguard Worker    .fuse_ffma32 = true,
272*61046927SAndroid Build Coastguard Worker    .lower_flrp16 = true,
273*61046927SAndroid Build Coastguard Worker    .lower_flrp32 = true,
274*61046927SAndroid Build Coastguard Worker    .lower_fpow = true,
275*61046927SAndroid Build Coastguard Worker    .lower_fmod = true,
276*61046927SAndroid Build Coastguard Worker    .lower_bitfield_insert = true,
277*61046927SAndroid Build Coastguard Worker    .lower_ifind_msb = true,
278*61046927SAndroid Build Coastguard Worker    .lower_find_lsb = true,
279*61046927SAndroid Build Coastguard Worker    .lower_uadd_carry = true,
280*61046927SAndroid Build Coastguard Worker    .lower_usub_borrow = true,
281*61046927SAndroid Build Coastguard Worker    .lower_fisnormal = true,
282*61046927SAndroid Build Coastguard Worker    .lower_scmp = true,
283*61046927SAndroid Build Coastguard Worker    .lower_isign = true,
284*61046927SAndroid Build Coastguard Worker    .lower_fsign = true,
285*61046927SAndroid Build Coastguard Worker    .lower_iabs = true,
286*61046927SAndroid Build Coastguard Worker    .lower_fminmax_signed_zero = true,
287*61046927SAndroid Build Coastguard Worker    .lower_fdph = true,
288*61046927SAndroid Build Coastguard Worker    .lower_ffract = true,
289*61046927SAndroid Build Coastguard Worker    .lower_ldexp = true,
290*61046927SAndroid Build Coastguard Worker    .lower_pack_half_2x16 = true,
291*61046927SAndroid Build Coastguard Worker    .lower_pack_unorm_2x16 = true,
292*61046927SAndroid Build Coastguard Worker    .lower_pack_snorm_2x16 = true,
293*61046927SAndroid Build Coastguard Worker    .lower_pack_unorm_4x8 = true,
294*61046927SAndroid Build Coastguard Worker    .lower_pack_snorm_4x8 = true,
295*61046927SAndroid Build Coastguard Worker    .lower_pack_64_2x32 = true,
296*61046927SAndroid Build Coastguard Worker    .lower_unpack_half_2x16 = true,
297*61046927SAndroid Build Coastguard Worker    .lower_unpack_unorm_2x16 = true,
298*61046927SAndroid Build Coastguard Worker    .lower_unpack_snorm_2x16 = true,
299*61046927SAndroid Build Coastguard Worker    .lower_unpack_unorm_4x8 = true,
300*61046927SAndroid Build Coastguard Worker    .lower_unpack_snorm_4x8 = true,
301*61046927SAndroid Build Coastguard Worker    .lower_extract_byte = true,
302*61046927SAndroid Build Coastguard Worker    .lower_insert_byte = true,
303*61046927SAndroid Build Coastguard Worker    .lower_insert_word = true,
304*61046927SAndroid Build Coastguard Worker    .has_cs_global_id = true,
305*61046927SAndroid Build Coastguard Worker    .lower_device_index_to_zero = true,
306*61046927SAndroid Build Coastguard Worker    .lower_hadd = true,
307*61046927SAndroid Build Coastguard Worker    .vectorize_io = true,
308*61046927SAndroid Build Coastguard Worker    .use_interpolated_input_intrinsics = true,
309*61046927SAndroid Build Coastguard Worker    .has_isub = true,
310*61046927SAndroid Build Coastguard Worker    .support_16bit_alu = true,
311*61046927SAndroid Build Coastguard Worker    .max_unroll_iterations = 32,
312*61046927SAndroid Build Coastguard Worker    .lower_uniforms_to_ubo = true,
313*61046927SAndroid Build Coastguard Worker    .lower_int64_options =
314*61046927SAndroid Build Coastguard Worker       (nir_lower_int64_options) ~(nir_lower_iadd64 | nir_lower_imul_2x32_64),
315*61046927SAndroid Build Coastguard Worker    .lower_doubles_options = (nir_lower_doubles_options)(~0),
316*61046927SAndroid Build Coastguard Worker    .lower_fquantize2f16 = true,
317*61046927SAndroid Build Coastguard Worker    .compact_arrays = true,
318*61046927SAndroid Build Coastguard Worker    .discard_is_demote = true,
319*61046927SAndroid Build Coastguard Worker    .has_ddx_intrinsics = true,
320*61046927SAndroid Build Coastguard Worker    .scalarize_ddx = true,
321*61046927SAndroid Build Coastguard Worker };
322