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