Home | History | Annotate | Line # | Download | only in vulkan
      1 /*
      2  * Copyright  2016 Red Hat.
      3  * Copyright  2016 Bas Nieuwenhuizen
      4  *
      5  * based in part on anv driver which is:
      6  * Copyright  2015 Intel Corporation
      7  *
      8  * Permission is hereby granted, free of charge, to any person obtaining a
      9  * copy of this software and associated documentation files (the "Software"),
     10  * to deal in the Software without restriction, including without limitation
     11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     12  * and/or sell copies of the Software, and to permit persons to whom the
     13  * Software is furnished to do so, subject to the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the next
     16  * paragraph) shall be included in all copies or substantial portions of the
     17  * Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     20  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     21  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     22  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     23  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     24  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     25  * IN THE SOFTWARE.
     26  */
     27 
     28 #include "radv_shader.h"
     29 #include "nir/nir.h"
     30 #include "nir/nir_builder.h"
     31 #include "spirv/nir_spirv.h"
     32 #include "util/memstream.h"
     33 #include "util/mesa-sha1.h"
     34 #include "util/u_atomic.h"
     35 #include "radv_debug.h"
     36 #include "radv_private.h"
     37 #include "radv_shader_args.h"
     38 
     39 #include "util/debug.h"
     40 #include "ac_binary.h"
     41 #include "ac_exp_param.h"
     42 #include "ac_nir.h"
     43 #include "ac_rtld.h"
     44 #include "aco_interface.h"
     45 #include "sid.h"
     46 #include "vk_format.h"
     47 
     48 #ifdef LLVM_AVAILABLE
     49 #include "ac_llvm_util.h"
     50 #endif
     51 
     52 void
     53 radv_get_nir_options(struct radv_physical_device *device)
     54 {
     55    device->nir_options = (nir_shader_compiler_options){
     56       .vertex_id_zero_based = true,
     57       .lower_scmp = true,
     58       .lower_flrp16 = true,
     59       .lower_flrp32 = true,
     60       .lower_flrp64 = true,
     61       .lower_device_index_to_zero = true,
     62       .lower_fdiv = true,
     63       .lower_fmod = true,
     64       .lower_ineg = true,
     65       .lower_bitfield_insert_to_bitfield_select = true,
     66       .lower_bitfield_extract = true,
     67       .lower_pack_snorm_2x16 = true,
     68       .lower_pack_snorm_4x8 = true,
     69       .lower_pack_unorm_2x16 = true,
     70       .lower_pack_unorm_4x8 = true,
     71       .lower_pack_half_2x16 = true,
     72       .lower_pack_64_2x32 = true,
     73       .lower_pack_64_4x16 = true,
     74       .lower_pack_32_2x16 = true,
     75       .lower_unpack_snorm_2x16 = true,
     76       .lower_unpack_snorm_4x8 = true,
     77       .lower_unpack_unorm_2x16 = true,
     78       .lower_unpack_unorm_4x8 = true,
     79       .lower_unpack_half_2x16 = true,
     80       .lower_ffma16 = true,
     81       .lower_ffma32 = true,
     82       .lower_ffma64 = true,
     83       .lower_fpow = true,
     84       .lower_mul_2x32_64 = true,
     85       .lower_rotate = true,
     86       .lower_iadd_sat = device->rad_info.chip_class <= GFX8,
     87       .has_fsub = true,
     88       .has_isub = true,
     89       .has_dot_4x8 = device->rad_info.has_accelerated_dot_product,
     90       .has_dot_2x16 = device->rad_info.has_accelerated_dot_product,
     91       .use_scoped_barrier = true,
     92       .max_unroll_iterations = 32,
     93       .max_unroll_iterations_aggressive = 128,
     94       .use_interpolated_input_intrinsics = true,
     95       .vectorize_vec2_16bit = true,
     96       /* nir_lower_int64() isn't actually called for the LLVM backend,
     97        * but this helps the loop unrolling heuristics. */
     98       .lower_int64_options = nir_lower_imul64 | nir_lower_imul_high64 | nir_lower_imul_2x32_64 |
     99                              nir_lower_divmod64 | nir_lower_minmax64 | nir_lower_iabs64,
    100       .lower_doubles_options = nir_lower_drcp | nir_lower_dsqrt | nir_lower_drsq | nir_lower_ddiv,
    101       .divergence_analysis_options = nir_divergence_view_index_uniform,
    102    };
    103 }
    104 
    105 bool
    106 radv_can_dump_shader(struct radv_device *device, struct vk_shader_module *module,
    107                      bool meta_shader)
    108 {
    109    if (!(device->instance->debug_flags & RADV_DEBUG_DUMP_SHADERS))
    110       return false;
    111    if (module)
    112       return !module->nir || (device->instance->debug_flags & RADV_DEBUG_DUMP_META_SHADERS);
    113 
    114    return meta_shader;
    115 }
    116 
    117 bool
    118 radv_can_dump_shader_stats(struct radv_device *device, struct vk_shader_module *module)
    119 {
    120    /* Only dump non-meta shader stats. */
    121    return device->instance->debug_flags & RADV_DEBUG_DUMP_SHADER_STATS && module && !module->nir;
    122 }
    123 
    124 void
    125 radv_optimize_nir(const struct radv_device *device, struct nir_shader *shader,
    126                   bool optimize_conservatively, bool allow_copies)
    127 {
    128    bool progress;
    129 
    130    do {
    131       progress = false;
    132 
    133       NIR_PASS(progress, shader, nir_split_array_vars, nir_var_function_temp);
    134       NIR_PASS(progress, shader, nir_shrink_vec_array_vars, nir_var_function_temp);
    135 
    136       NIR_PASS_V(shader, nir_lower_vars_to_ssa);
    137 
    138       if (allow_copies) {
    139          /* Only run this pass in the first call to
    140           * radv_optimize_nir.  Later calls assume that we've
    141           * lowered away any copy_deref instructions and we
    142           *  don't want to introduce any more.
    143           */
    144          NIR_PASS(progress, shader, nir_opt_find_array_copies);
    145       }
    146 
    147       NIR_PASS(progress, shader, nir_opt_copy_prop_vars);
    148       NIR_PASS(progress, shader, nir_opt_dead_write_vars);
    149       NIR_PASS(progress, shader, nir_remove_dead_variables,
    150                nir_var_function_temp | nir_var_shader_in | nir_var_shader_out, NULL);
    151 
    152       NIR_PASS_V(shader, nir_lower_alu_to_scalar, NULL, NULL);
    153       NIR_PASS_V(shader, nir_lower_phis_to_scalar, true);
    154 
    155       NIR_PASS(progress, shader, nir_copy_prop);
    156       NIR_PASS(progress, shader, nir_opt_remove_phis);
    157       NIR_PASS(progress, shader, nir_opt_dce);
    158       if (nir_opt_trivial_continues(shader)) {
    159          progress = true;
    160          NIR_PASS(progress, shader, nir_copy_prop);
    161          NIR_PASS(progress, shader, nir_opt_remove_phis);
    162          NIR_PASS(progress, shader, nir_opt_dce);
    163       }
    164       NIR_PASS(progress, shader, nir_opt_if, true);
    165       NIR_PASS(progress, shader, nir_opt_dead_cf);
    166       NIR_PASS(progress, shader, nir_opt_cse);
    167       NIR_PASS(progress, shader, nir_opt_peephole_select, 8, true, true);
    168       NIR_PASS(progress, shader, nir_opt_constant_folding);
    169       NIR_PASS(progress, shader, nir_opt_algebraic);
    170 
    171       NIR_PASS(progress, shader, nir_opt_undef);
    172       NIR_PASS(progress, shader, nir_opt_shrink_vectors,
    173                !device->instance->disable_shrink_image_store);
    174       if (shader->options->max_unroll_iterations) {
    175          NIR_PASS(progress, shader, nir_opt_loop_unroll);
    176       }
    177    } while (progress && !optimize_conservatively);
    178 
    179    NIR_PASS(progress, shader, nir_opt_conditional_discard);
    180    NIR_PASS(progress, shader, nir_opt_move, nir_move_load_ubo);
    181 }
    182 
    183 void
    184 radv_optimize_nir_algebraic(nir_shader *nir, bool opt_offsets)
    185 {
    186    bool more_algebraic = true;
    187    while (more_algebraic) {
    188       more_algebraic = false;
    189       NIR_PASS_V(nir, nir_copy_prop);
    190       NIR_PASS_V(nir, nir_opt_dce);
    191       NIR_PASS_V(nir, nir_opt_constant_folding);
    192       NIR_PASS_V(nir, nir_opt_cse);
    193       NIR_PASS(more_algebraic, nir, nir_opt_algebraic);
    194    }
    195 
    196    if (opt_offsets)
    197       NIR_PASS_V(nir, nir_opt_offsets);
    198 
    199    /* Do late algebraic optimization to turn add(a,
    200     * neg(b)) back into subs, then the mandatory cleanup
    201     * after algebraic.  Note that it may produce fnegs,
    202     * and if so then we need to keep running to squash
    203     * fneg(fneg(a)).
    204     */
    205    bool more_late_algebraic = true;
    206    while (more_late_algebraic) {
    207       more_late_algebraic = false;
    208       NIR_PASS(more_late_algebraic, nir, nir_opt_algebraic_late);
    209       NIR_PASS_V(nir, nir_opt_constant_folding);
    210       NIR_PASS_V(nir, nir_copy_prop);
    211       NIR_PASS_V(nir, nir_opt_dce);
    212       NIR_PASS_V(nir, nir_opt_cse);
    213    }
    214 }
    215 
    216 static void
    217 shared_var_info(const struct glsl_type *type, unsigned *size, unsigned *align)
    218 {
    219    assert(glsl_type_is_vector_or_scalar(type));
    220 
    221    uint32_t comp_size = glsl_type_is_boolean(type) ? 4 : glsl_get_bit_size(type) / 8;
    222    unsigned length = glsl_get_vector_elements(type);
    223    *size = comp_size * length, *align = comp_size;
    224 }
    225 
    226 struct radv_shader_debug_data {
    227    struct radv_device *device;
    228    const struct vk_shader_module *module;
    229 };
    230 
    231 static void
    232 radv_spirv_nir_debug(void *private_data, enum nir_spirv_debug_level level, size_t spirv_offset,
    233                      const char *message)
    234 {
    235    struct radv_shader_debug_data *debug_data = private_data;
    236    struct radv_instance *instance = debug_data->device->instance;
    237 
    238    static const VkDebugReportFlagsEXT vk_flags[] = {
    239       [NIR_SPIRV_DEBUG_LEVEL_INFO] = VK_DEBUG_REPORT_INFORMATION_BIT_EXT,
    240       [NIR_SPIRV_DEBUG_LEVEL_WARNING] = VK_DEBUG_REPORT_WARNING_BIT_EXT,
    241       [NIR_SPIRV_DEBUG_LEVEL_ERROR] = VK_DEBUG_REPORT_ERROR_BIT_EXT,
    242    };
    243    char buffer[256];
    244 
    245    snprintf(buffer, sizeof(buffer), "SPIR-V offset %lu: %s", (unsigned long)spirv_offset, message);
    246 
    247    vk_debug_report(&instance->vk, vk_flags[level], &debug_data->module->base, 0, 0, "radv", buffer);
    248 }
    249 
    250 static void
    251 radv_compiler_debug(void *private_data, enum radv_compiler_debug_level level, const char *message)
    252 {
    253    struct radv_shader_debug_data *debug_data = private_data;
    254    struct radv_instance *instance = debug_data->device->instance;
    255 
    256    static const VkDebugReportFlagsEXT vk_flags[] = {
    257       [RADV_COMPILER_DEBUG_LEVEL_PERFWARN] = VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
    258       [RADV_COMPILER_DEBUG_LEVEL_ERROR] = VK_DEBUG_REPORT_ERROR_BIT_EXT,
    259    };
    260 
    261    /* VK_DEBUG_REPORT_DEBUG_BIT_EXT specifies diagnostic information
    262     * from the implementation and layers.
    263     */
    264    vk_debug_report(&instance->vk, vk_flags[level] | VK_DEBUG_REPORT_DEBUG_BIT_EXT,
    265                    &debug_data->module->base, 0, 0, "radv", message);
    266 }
    267 
    268 static nir_ssa_def *
    269 convert_pointer_to_64(nir_builder *b, const struct radv_physical_device *pdev, nir_ssa_def *ptr)
    270 {
    271    nir_ssa_def *comp[] = {ptr, nir_imm_int(b, pdev->rad_info.address32_hi)};
    272    return nir_pack_64_2x32(b, nir_vec(b, comp, 2));
    273 }
    274 
    275 static bool
    276 lower_intrinsics(nir_shader *nir, const struct radv_pipeline_key *key,
    277                  const struct radv_pipeline_layout *layout, const struct radv_physical_device *pdev)
    278 {
    279    nir_function_impl *entry = nir_shader_get_entrypoint(nir);
    280    bool progress = false;
    281    nir_builder b;
    282 
    283    nir_builder_init(&b, entry);
    284 
    285    nir_foreach_block (block, entry) {
    286       nir_foreach_instr_safe (instr, block) {
    287          if (instr->type != nir_instr_type_intrinsic)
    288             continue;
    289 
    290          nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
    291          b.cursor = nir_before_instr(&intrin->instr);
    292 
    293          nir_ssa_def *def = NULL;
    294          switch (intrin->intrinsic) {
    295          case nir_intrinsic_load_vulkan_descriptor:
    296             if (nir_intrinsic_desc_type(intrin) == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR) {
    297                nir_ssa_def *addr =
    298                   convert_pointer_to_64(&b, pdev,
    299                                         nir_iadd(&b, nir_channel(&b, intrin->src[0].ssa, 0),
    300                                                  nir_channel(&b, intrin->src[0].ssa, 1)));
    301 
    302                def = nir_build_load_global(&b, 1, 64, addr, .access = ACCESS_NON_WRITEABLE,
    303                                            .align_mul = 8, .align_offset = 0);
    304             } else {
    305                def = nir_vector_insert_imm(&b, intrin->src[0].ssa, nir_imm_int(&b, 0), 2);
    306             }
    307             break;
    308          case nir_intrinsic_vulkan_resource_index: {
    309             unsigned desc_set = nir_intrinsic_desc_set(intrin);
    310             unsigned binding = nir_intrinsic_binding(intrin);
    311             struct radv_descriptor_set_layout *desc_layout = layout->set[desc_set].layout;
    312 
    313             nir_ssa_def *new_res = nir_vulkan_resource_index(
    314                &b, 3, 32, intrin->src[0].ssa, .desc_set = desc_set, .binding = binding,
    315                .desc_type = nir_intrinsic_desc_type(intrin));
    316 
    317             nir_ssa_def *stride;
    318             if (desc_layout->binding[binding].type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC ||
    319                 desc_layout->binding[binding].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC) {
    320                stride = nir_imm_int(&b, 16);
    321             } else {
    322                stride = nir_imm_int(&b, desc_layout->binding[binding].size);
    323             }
    324             def = nir_vector_insert_imm(&b, new_res, stride, 2);
    325             break;
    326          }
    327          case nir_intrinsic_vulkan_resource_reindex: {
    328             nir_ssa_def *binding_ptr = nir_channel(&b, intrin->src[0].ssa, 1);
    329             nir_ssa_def *stride = nir_channel(&b, intrin->src[0].ssa, 2);
    330             binding_ptr = nir_iadd(&b, binding_ptr, nir_imul(&b, intrin->src[1].ssa, stride));
    331             def = nir_vector_insert_imm(&b, intrin->src[0].ssa, binding_ptr, 1);
    332             break;
    333          }
    334          case nir_intrinsic_is_sparse_texels_resident:
    335             def = nir_ieq_imm(&b, intrin->src[0].ssa, 0);
    336             break;
    337          case nir_intrinsic_sparse_residency_code_and:
    338             def = nir_ior(&b, intrin->src[0].ssa, intrin->src[1].ssa);
    339             break;
    340          case nir_intrinsic_load_view_index:
    341             if (key->has_multiview_view_index)
    342                continue;
    343             def = nir_imm_zero(&b, 1, 32);
    344             break;
    345          default:
    346             continue;
    347          }
    348 
    349          nir_ssa_def_rewrite_uses(&intrin->dest.ssa, def);
    350 
    351          nir_instr_remove(instr);
    352          progress = true;
    353       }
    354    }
    355 
    356    return progress;
    357 }
    358 
    359 static bool
    360 radv_lower_primitive_shading_rate(nir_shader *nir)
    361 {
    362    nir_function_impl *impl = nir_shader_get_entrypoint(nir);
    363    bool progress = false;
    364 
    365    nir_builder b;
    366    nir_builder_init(&b, impl);
    367 
    368    /* Iterate in reverse order since there should be only one deref store to PRIMITIVE_SHADING_RATE
    369     * after lower_io_to_temporaries for vertex shaders.
    370     */
    371    nir_foreach_block_reverse(block, impl) {
    372       nir_foreach_instr_reverse(instr, block) {
    373          if (instr->type != nir_instr_type_intrinsic)
    374             continue;
    375 
    376          nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
    377          if (intr->intrinsic != nir_intrinsic_store_deref)
    378             continue;
    379 
    380          nir_variable *var = nir_intrinsic_get_var(intr, 0);
    381          if (var->data.mode != nir_var_shader_out ||
    382              var->data.location != VARYING_SLOT_PRIMITIVE_SHADING_RATE)
    383             continue;
    384 
    385          b.cursor = nir_before_instr(instr);
    386 
    387          nir_ssa_def *val = nir_ssa_for_src(&b, intr->src[1], 1);
    388 
    389          /* x_rate = (shadingRate & (Horizontal2Pixels | Horizontal4Pixels)) ? 0x1 : 0x0; */
    390          nir_ssa_def *x_rate = nir_iand(&b, val, nir_imm_int(&b, 12));
    391          x_rate = nir_b2i32(&b, nir_ine(&b, x_rate, nir_imm_int(&b, 0)));
    392 
    393          /* y_rate = (shadingRate & (Vertical2Pixels | Vertical4Pixels)) ? 0x1 : 0x0; */
    394          nir_ssa_def *y_rate = nir_iand(&b, val, nir_imm_int(&b, 3));
    395          y_rate = nir_b2i32(&b, nir_ine(&b, y_rate, nir_imm_int(&b, 0)));
    396 
    397          /* Bits [2:3] = VRS rate X
    398           * Bits [4:5] = VRS rate Y
    399           * HW shading rate = (xRate << 2) | (yRate << 4)
    400           */
    401          nir_ssa_def *out = nir_ior(&b, nir_ishl(&b, x_rate, nir_imm_int(&b, 2)),
    402                                         nir_ishl(&b, y_rate, nir_imm_int(&b, 4)));
    403 
    404          nir_instr_rewrite_src(&intr->instr, &intr->src[1], nir_src_for_ssa(out));
    405 
    406          progress = true;
    407          if (nir->info.stage == MESA_SHADER_VERTEX)
    408             return progress;
    409       }
    410    }
    411 
    412    return progress;
    413 }
    414 
    415 nir_shader *
    416 radv_shader_compile_to_nir(struct radv_device *device, struct vk_shader_module *module,
    417                            const char *entrypoint_name, gl_shader_stage stage,
    418                            const VkSpecializationInfo *spec_info,
    419                            const struct radv_pipeline_layout *layout,
    420                            const struct radv_pipeline_key *key)
    421 {
    422    unsigned subgroup_size = 64, ballot_bit_size = 64;
    423    if (key->cs.compute_subgroup_size) {
    424       /* Only compute shaders currently support requiring a
    425        * specific subgroup size.
    426        */
    427       assert(stage == MESA_SHADER_COMPUTE);
    428       subgroup_size = key->cs.compute_subgroup_size;
    429       ballot_bit_size = key->cs.compute_subgroup_size;
    430    }
    431 
    432    nir_shader *nir;
    433 
    434    if (module->nir) {
    435       /* Some things such as our meta clear/blit code will give us a NIR
    436        * shader directly.  In that case, we just ignore the SPIR-V entirely
    437        * and just use the NIR shader */
    438       nir = module->nir;
    439       nir->options = &device->physical_device->nir_options;
    440       nir_validate_shader(nir, "in internal shader");
    441 
    442       assert(exec_list_length(&nir->functions) == 1);
    443    } else {
    444       uint32_t *spirv = (uint32_t *)module->data;
    445       assert(module->size % 4 == 0);
    446 
    447       if (device->instance->debug_flags & RADV_DEBUG_DUMP_SPIRV)
    448          radv_print_spirv(module->data, module->size, stderr);
    449 
    450       uint32_t num_spec_entries = 0;
    451       struct nir_spirv_specialization *spec_entries =
    452          vk_spec_info_to_nir_spirv(spec_info, &num_spec_entries);
    453       struct radv_shader_debug_data spirv_debug_data = {
    454          .device = device,
    455          .module = module,
    456       };
    457       const struct spirv_to_nir_options spirv_options = {
    458          .caps =
    459             {
    460                .amd_fragment_mask = true,
    461                .amd_gcn_shader = true,
    462                .amd_image_gather_bias_lod = true,
    463                .amd_image_read_write_lod = true,
    464                .amd_shader_ballot = true,
    465                .amd_shader_explicit_vertex_parameter = true,
    466                .amd_trinary_minmax = true,
    467                .demote_to_helper_invocation = true,
    468                .derivative_group = true,
    469                .descriptor_array_dynamic_indexing = true,
    470                .descriptor_array_non_uniform_indexing = true,
    471                .descriptor_indexing = true,
    472                .device_group = true,
    473                .draw_parameters = true,
    474                .float_controls = true,
    475                .float16 = device->physical_device->rad_info.has_packed_math_16bit,
    476                .float32_atomic_add = true,
    477                .float32_atomic_min_max = true,
    478                .float64 = true,
    479                .float64_atomic_min_max = true,
    480                .geometry_streams = true,
    481                .groups = true,
    482                .image_atomic_int64 = true,
    483                .image_ms_array = true,
    484                .image_read_without_format = true,
    485                .image_write_without_format = true,
    486                .int8 = true,
    487                .int16 = true,
    488                .int64 = true,
    489                .int64_atomics = true,
    490                .min_lod = true,
    491                .multiview = true,
    492                .physical_storage_buffer_address = true,
    493                .post_depth_coverage = true,
    494                .ray_tracing = true,
    495                .runtime_descriptor_array = true,
    496                .shader_clock = true,
    497                .shader_viewport_index_layer = true,
    498                .sparse_residency = true,
    499                .stencil_export = true,
    500                .storage_8bit = true,
    501                .storage_16bit = true,
    502                .storage_image_ms = true,
    503                .subgroup_arithmetic = true,
    504                .subgroup_ballot = true,
    505                .subgroup_basic = true,
    506                .subgroup_quad = true,
    507                .subgroup_shuffle = true,
    508                .subgroup_uniform_control_flow = true,
    509                .subgroup_vote = true,
    510                .tessellation = true,
    511                .transform_feedback = true,
    512                .variable_pointers = true,
    513                .vk_memory_model = true,
    514                .vk_memory_model_device_scope = true,
    515                .fragment_shading_rate = device->physical_device->rad_info.chip_class >= GFX10_3,
    516                .workgroup_memory_explicit_layout = true,
    517             },
    518          .ubo_addr_format = nir_address_format_vec2_index_32bit_offset,
    519          .ssbo_addr_format = nir_address_format_vec2_index_32bit_offset,
    520          .phys_ssbo_addr_format = nir_address_format_64bit_global,
    521          .push_const_addr_format = nir_address_format_logical,
    522          .shared_addr_format = nir_address_format_32bit_offset,
    523          .constant_addr_format = nir_address_format_64bit_global,
    524          .use_deref_buffer_array_length = true,
    525          .debug =
    526             {
    527                .func = radv_spirv_nir_debug,
    528                .private_data = &spirv_debug_data,
    529             },
    530       };
    531       nir = spirv_to_nir(spirv, module->size / 4, spec_entries, num_spec_entries, stage,
    532                          entrypoint_name, &spirv_options, &device->physical_device->nir_options);
    533       assert(nir->info.stage == stage);
    534       nir_validate_shader(nir, "after spirv_to_nir");
    535 
    536       free(spec_entries);
    537 
    538       const struct nir_lower_sysvals_to_varyings_options sysvals_to_varyings = {
    539          .point_coord = true,
    540       };
    541       NIR_PASS_V(nir, nir_lower_sysvals_to_varyings, &sysvals_to_varyings);
    542 
    543       /* We have to lower away local constant initializers right before we
    544        * inline functions.  That way they get properly initialized at the top
    545        * of the function and not at the top of its caller.
    546        */
    547       NIR_PASS_V(nir, nir_lower_variable_initializers, nir_var_function_temp);
    548       NIR_PASS_V(nir, nir_lower_returns);
    549       NIR_PASS_V(nir, nir_inline_functions);
    550       NIR_PASS_V(nir, nir_copy_prop);
    551       NIR_PASS_V(nir, nir_opt_deref);
    552 
    553       /* Pick off the single entrypoint that we want */
    554       foreach_list_typed_safe(nir_function, func, node, &nir->functions)
    555       {
    556          if (func->is_entrypoint)
    557             func->name = ralloc_strdup(func, "main");
    558          else
    559             exec_node_remove(&func->node);
    560       }
    561       assert(exec_list_length(&nir->functions) == 1);
    562 
    563       /* Make sure we lower constant initializers on output variables so that
    564        * nir_remove_dead_variables below sees the corresponding stores
    565        */
    566       NIR_PASS_V(nir, nir_lower_variable_initializers, nir_var_shader_out);
    567 
    568       /* Now that we've deleted all but the main function, we can go ahead and
    569        * lower the rest of the constant initializers.
    570        */
    571       NIR_PASS_V(nir, nir_lower_variable_initializers, ~0);
    572 
    573       /* Split member structs.  We do this before lower_io_to_temporaries so that
    574        * it doesn't lower system values to temporaries by accident.
    575        */
    576       NIR_PASS_V(nir, nir_split_var_copies);
    577       NIR_PASS_V(nir, nir_split_per_member_structs);
    578 
    579       if (nir->info.stage == MESA_SHADER_FRAGMENT)
    580          NIR_PASS_V(nir, nir_lower_io_to_vector, nir_var_shader_out);
    581       if (nir->info.stage == MESA_SHADER_FRAGMENT)
    582          NIR_PASS_V(nir, nir_lower_input_attachments,
    583                     &(nir_input_attachment_options){
    584                        .use_fragcoord_sysval = true,
    585                        .use_layer_id_sysval = false,
    586                     });
    587 
    588       NIR_PASS_V(nir, nir_remove_dead_variables,
    589                  nir_var_shader_in | nir_var_shader_out | nir_var_system_value | nir_var_mem_shared,
    590                  NULL);
    591 
    592       /* Variables can make nir_propagate_invariant more conservative
    593        * than it needs to be.
    594        */
    595       NIR_PASS_V(nir, nir_lower_global_vars_to_local);
    596       NIR_PASS_V(nir, nir_lower_vars_to_ssa);
    597 
    598       NIR_PASS_V(nir, nir_propagate_invariant, key->invariant_geom);
    599 
    600       NIR_PASS_V(nir, nir_lower_clip_cull_distance_arrays);
    601 
    602       NIR_PASS_V(nir, nir_lower_discard_or_demote, key->ps.lower_discard_to_demote);
    603 
    604       nir_lower_doubles_options lower_doubles = nir->options->lower_doubles_options;
    605 
    606       if (device->physical_device->rad_info.chip_class == GFX6) {
    607          /* GFX6 doesn't support v_floor_f64 and the precision
    608           * of v_fract_f64 which is used to implement 64-bit
    609           * floor is less than what Vulkan requires.
    610           */
    611          lower_doubles |= nir_lower_dfloor;
    612       }
    613 
    614       NIR_PASS_V(nir, nir_lower_doubles, NULL, lower_doubles);
    615    }
    616 
    617    NIR_PASS_V(nir, nir_lower_system_values);
    618    NIR_PASS_V(nir, nir_lower_compute_system_values, NULL);
    619 
    620    /* Vulkan uses the separate-shader linking model */
    621    nir->info.separate_shader = true;
    622 
    623    nir_shader_gather_info(nir, nir_shader_get_entrypoint(nir));
    624 
    625    if (nir->info.stage == MESA_SHADER_GEOMETRY) {
    626       unsigned nir_gs_flags = nir_lower_gs_intrinsics_per_stream;
    627 
    628       if (key->use_ngg && !radv_use_llvm_for_stage(device, stage)) {
    629          /* ACO needs NIR to do some of the hard lifting */
    630          nir_gs_flags |= nir_lower_gs_intrinsics_count_primitives |
    631                          nir_lower_gs_intrinsics_count_vertices_per_primitive |
    632                          nir_lower_gs_intrinsics_overwrite_incomplete;
    633       }
    634 
    635       nir_lower_gs_intrinsics(nir, nir_gs_flags);
    636    }
    637 
    638    static const nir_lower_tex_options tex_options = {
    639       .lower_txp = ~0,
    640       .lower_tg4_offsets = true,
    641       .lower_txs_cube_array = true,
    642       .lower_to_fragment_fetch_amd = true,
    643    };
    644 
    645    nir_lower_tex(nir, &tex_options);
    646 
    647    static const nir_lower_image_options image_options = {
    648       .lower_cube_size = true,
    649    };
    650 
    651    nir_lower_image(nir, &image_options);
    652 
    653    nir_lower_vars_to_ssa(nir);
    654 
    655    if (nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_GEOMETRY ||
    656        nir->info.stage == MESA_SHADER_FRAGMENT) {
    657       NIR_PASS_V(nir, nir_lower_io_to_temporaries, nir_shader_get_entrypoint(nir), true, true);
    658    } else if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
    659       NIR_PASS_V(nir, nir_lower_io_to_temporaries, nir_shader_get_entrypoint(nir), true, false);
    660    }
    661 
    662    nir_split_var_copies(nir);
    663 
    664    nir_lower_global_vars_to_local(nir);
    665    nir_remove_dead_variables(nir, nir_var_function_temp, NULL);
    666    bool gfx7minus = device->physical_device->rad_info.chip_class <= GFX7;
    667    nir_lower_subgroups(nir, &(struct nir_lower_subgroups_options){
    668                                .subgroup_size = subgroup_size,
    669                                .ballot_bit_size = ballot_bit_size,
    670                                .ballot_components = 1,
    671                                .lower_to_scalar = 1,
    672                                .lower_subgroup_masks = 1,
    673                                .lower_shuffle = 1,
    674                                .lower_shuffle_to_32bit = 1,
    675                                .lower_vote_eq = 1,
    676                                .lower_quad_broadcast_dynamic = 1,
    677                                .lower_quad_broadcast_dynamic_to_const = gfx7minus,
    678                                .lower_shuffle_to_swizzle_amd = 1,
    679                             });
    680 
    681    nir_lower_load_const_to_scalar(nir);
    682 
    683    if (!key->optimisations_disabled)
    684       radv_optimize_nir(device, nir, false, true);
    685 
    686    /* call radv_nir_lower_ycbcr_textures() late as there might still be
    687     * tex with undef texture/sampler before first optimization */
    688    NIR_PASS_V(nir, radv_nir_lower_ycbcr_textures, layout);
    689 
    690    /* We call nir_lower_var_copies() after the first radv_optimize_nir()
    691     * to remove any copies introduced by nir_opt_find_array_copies().
    692     */
    693    nir_lower_var_copies(nir);
    694 
    695    unsigned lower_flrp = (nir->options->lower_flrp16 ? 16 : 0) |
    696                          (nir->options->lower_flrp32 ? 32 : 0) |
    697                          (nir->options->lower_flrp64 ? 64 : 0);
    698    if (lower_flrp != 0) {
    699       if (nir_lower_flrp(nir, lower_flrp, false /* always_precise */))
    700          NIR_PASS_V(nir, nir_opt_constant_folding);
    701    }
    702 
    703    const nir_opt_access_options opt_access_options = {
    704       .is_vulkan = true,
    705       .infer_non_readable = true,
    706    };
    707    NIR_PASS_V(nir, nir_opt_access, &opt_access_options);
    708 
    709    NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_push_const, nir_address_format_32bit_offset);
    710 
    711    NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_ubo | nir_var_mem_ssbo,
    712               nir_address_format_vec2_index_32bit_offset);
    713 
    714    NIR_PASS_V(nir, lower_intrinsics, key, layout, device->physical_device);
    715 
    716    /* Lower deref operations for compute shared memory. */
    717    if (nir->info.stage == MESA_SHADER_COMPUTE) {
    718       if (!nir->info.shared_memory_explicit_layout) {
    719          NIR_PASS_V(nir, nir_lower_vars_to_explicit_types, nir_var_mem_shared, shared_var_info);
    720       }
    721       NIR_PASS_V(nir, nir_lower_explicit_io, nir_var_mem_shared, nir_address_format_32bit_offset);
    722 
    723       if (nir->info.zero_initialize_shared_memory && nir->info.shared_size > 0) {
    724          const unsigned chunk_size = 16; /* max single store size */
    725          const unsigned shared_size = ALIGN(nir->info.shared_size, chunk_size);
    726          NIR_PASS_V(nir, nir_zero_initialize_shared_memory, shared_size, chunk_size);
    727       }
    728    }
    729 
    730    nir_lower_explicit_io(nir, nir_var_mem_global | nir_var_mem_constant,
    731                          nir_address_format_64bit_global);
    732 
    733    /* Lower large variables that are always constant with load_constant
    734     * intrinsics, which get turned into PC-relative loads from a data
    735     * section next to the shader.
    736     */
    737    NIR_PASS_V(nir, nir_opt_large_constants, glsl_get_natural_size_align_bytes, 16);
    738 
    739    /* Lower primitive shading rate to match HW requirements. */
    740    if ((nir->info.stage == MESA_SHADER_VERTEX ||
    741         nir->info.stage == MESA_SHADER_GEOMETRY) &&
    742        nir->info.outputs_written & BITFIELD64_BIT(VARYING_SLOT_PRIMITIVE_SHADING_RATE)) {
    743       NIR_PASS_V(nir, radv_lower_primitive_shading_rate);
    744    }
    745 
    746    /* Indirect lowering must be called after the radv_optimize_nir() loop
    747     * has been called at least once. Otherwise indirect lowering can
    748     * bloat the instruction count of the loop and cause it to be
    749     * considered too large for unrolling.
    750     */
    751    if (ac_nir_lower_indirect_derefs(nir, device->physical_device->rad_info.chip_class) &&
    752        !key->optimisations_disabled && nir->info.stage != MESA_SHADER_COMPUTE) {
    753       /* Optimize the lowered code before the linking optimizations. */
    754       radv_optimize_nir(device, nir, false, false);
    755    }
    756 
    757    return nir;
    758 }
    759 
    760 static int
    761 type_size_vec4(const struct glsl_type *type, bool bindless)
    762 {
    763    return glsl_count_attribute_slots(type, false);
    764 }
    765 
    766 static nir_variable *
    767 find_layer_in_var(nir_shader *nir)
    768 {
    769    nir_variable *var = nir_find_variable_with_location(nir, nir_var_shader_in, VARYING_SLOT_LAYER);
    770    if (var != NULL)
    771       return var;
    772 
    773    var = nir_variable_create(nir, nir_var_shader_in, glsl_int_type(), "layer id");
    774    var->data.location = VARYING_SLOT_LAYER;
    775    var->data.interpolation = INTERP_MODE_FLAT;
    776    return var;
    777 }
    778 
    779 /* We use layered rendering to implement multiview, which means we need to map
    780  * view_index to gl_Layer. The code generates a load from the layer_id sysval,
    781  * but since we don't have a way to get at this information from the fragment
    782  * shader, we also need to lower this to the gl_Layer varying.  This pass
    783  * lowers both to a varying load from the LAYER slot, before lowering io, so
    784  * that nir_assign_var_locations() will give the LAYER varying the correct
    785  * driver_location.
    786  */
    787 
    788 static bool
    789 lower_view_index(nir_shader *nir)
    790 {
    791    bool progress = false;
    792    nir_function_impl *entry = nir_shader_get_entrypoint(nir);
    793    nir_builder b;
    794    nir_builder_init(&b, entry);
    795 
    796    nir_variable *layer = NULL;
    797    nir_foreach_block (block, entry) {
    798       nir_foreach_instr_safe (instr, block) {
    799          if (instr->type != nir_instr_type_intrinsic)
    800             continue;
    801 
    802          nir_intrinsic_instr *load = nir_instr_as_intrinsic(instr);
    803          if (load->intrinsic != nir_intrinsic_load_view_index)
    804             continue;
    805 
    806          if (!layer)
    807             layer = find_layer_in_var(nir);
    808 
    809          b.cursor = nir_before_instr(instr);
    810          nir_ssa_def *def = nir_load_var(&b, layer);
    811          nir_ssa_def_rewrite_uses(&load->dest.ssa, def);
    812 
    813          nir_instr_remove(instr);
    814          progress = true;
    815       }
    816    }
    817 
    818    return progress;
    819 }
    820 
    821 void
    822 radv_lower_io(struct radv_device *device, nir_shader *nir)
    823 {
    824    if (nir->info.stage == MESA_SHADER_COMPUTE)
    825       return;
    826 
    827    if (nir->info.stage == MESA_SHADER_FRAGMENT) {
    828       NIR_PASS_V(nir, lower_view_index);
    829       nir_assign_io_var_locations(nir, nir_var_shader_in, &nir->num_inputs, MESA_SHADER_FRAGMENT);
    830    }
    831 
    832    /* The RADV/LLVM backend expects 64-bit IO to be lowered. */
    833    nir_lower_io_options options =
    834       radv_use_llvm_for_stage(device, nir->info.stage) ? nir_lower_io_lower_64bit_to_32 : 0;
    835 
    836    NIR_PASS_V(nir, nir_lower_io, nir_var_shader_in | nir_var_shader_out, type_size_vec4, options);
    837 
    838    /* This pass needs actual constants */
    839    nir_opt_constant_folding(nir);
    840 
    841    NIR_PASS_V(nir, nir_io_add_const_offset_to_base, nir_var_shader_in | nir_var_shader_out);
    842 }
    843 
    844 bool
    845 radv_lower_io_to_mem(struct radv_device *device, struct nir_shader *nir,
    846                      const struct radv_shader_info *info, const struct radv_pipeline_key *pl_key)
    847 {
    848    if (nir->info.stage == MESA_SHADER_VERTEX) {
    849       if (info->vs.as_ls) {
    850          ac_nir_lower_ls_outputs_to_mem(nir, info->vs.tcs_in_out_eq,
    851                                         info->vs.tcs_temp_only_input_mask,
    852                                         info->vs.num_linked_outputs);
    853          return true;
    854       } else if (info->vs.as_es) {
    855          ac_nir_lower_es_outputs_to_mem(nir, device->physical_device->rad_info.chip_class,
    856                                         info->vs.num_linked_outputs);
    857          return true;
    858       }
    859    } else if (nir->info.stage == MESA_SHADER_TESS_CTRL) {
    860       ac_nir_lower_hs_inputs_to_mem(nir, info->vs.tcs_in_out_eq, info->tcs.num_linked_inputs);
    861       ac_nir_lower_hs_outputs_to_mem(
    862          nir, device->physical_device->rad_info.chip_class, info->tcs.tes_reads_tess_factors,
    863          info->tcs.tes_inputs_read, info->tcs.tes_patch_inputs_read, info->tcs.num_linked_inputs,
    864          info->tcs.num_linked_outputs, info->tcs.num_linked_patch_outputs, true);
    865       ac_nir_lower_tess_to_const(nir, pl_key->tcs.tess_input_vertices, info->num_tess_patches,
    866                                  ac_nir_lower_patch_vtx_in | ac_nir_lower_num_patches);
    867 
    868       return true;
    869    } else if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
    870       ac_nir_lower_tes_inputs_to_mem(nir, info->tes.num_linked_inputs,
    871                                      info->tes.num_linked_patch_inputs);
    872       ac_nir_lower_tess_to_const(nir, nir->info.tess.tcs_vertices_out, info->num_tess_patches,
    873                                  ac_nir_lower_patch_vtx_in | ac_nir_lower_num_patches);
    874 
    875       if (info->tes.as_es) {
    876          ac_nir_lower_es_outputs_to_mem(nir, device->physical_device->rad_info.chip_class,
    877                                         info->tes.num_linked_outputs);
    878       }
    879 
    880       return true;
    881    } else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
    882       ac_nir_lower_gs_inputs_to_mem(nir, device->physical_device->rad_info.chip_class,
    883                                     info->gs.num_linked_inputs);
    884       return true;
    885    }
    886 
    887    return false;
    888 }
    889 
    890 bool
    891 radv_consider_culling(struct radv_device *device, struct nir_shader *nir, uint64_t ps_inputs_read,
    892                       unsigned num_vertices_per_primitive, const struct radv_shader_info *info)
    893 {
    894    /* Culling doesn't make sense for meta shaders. */
    895    if (!!nir->info.name)
    896       return false;
    897 
    898    /* We don't support culling with multiple viewports yet. */
    899    if (nir->info.outputs_written & (VARYING_BIT_VIEWPORT | VARYING_BIT_VIEWPORT_MASK))
    900       return false;
    901 
    902    /* We don't support culling with vertex shader prologs. */
    903    if (info->vs.has_prolog)
    904       return false;
    905 
    906    if (!device->physical_device->use_ngg_culling)
    907       return false;
    908 
    909    /* Shader based culling efficiency can depend on PS throughput.
    910     * Estimate an upper limit for PS input param count based on GPU info.
    911     */
    912    unsigned max_ps_params;
    913    unsigned max_render_backends = device->physical_device->rad_info.max_render_backends;
    914    unsigned max_se = device->physical_device->rad_info.max_se;
    915 
    916    if (max_render_backends / max_se == 4)
    917       max_ps_params = 6; /* Sienna Cichlid and other GFX10.3 dGPUs. */
    918    else
    919       max_ps_params = 4; /* Navi 1x. */
    920 
    921    /* TODO: consider other heuristics here, such as PS execution time */
    922    if (util_bitcount64(ps_inputs_read & ~VARYING_BIT_POS) > max_ps_params)
    923       return false;
    924 
    925    /* Only triangle culling is supported. */
    926    if (num_vertices_per_primitive != 3)
    927       return false;
    928 
    929    /* When the shader writes memory, it is difficult to guarantee correctness.
    930     * Future work:
    931     * - if only write-only SSBOs are used
    932     * - if we can prove that non-position outputs don't rely on memory stores
    933     * then may be okay to keep the memory stores in the 1st shader part, and delete them from the 2nd.
    934     */
    935    if (nir->info.writes_memory)
    936       return false;
    937 
    938    /* When the shader relies on the subgroup invocation ID, we'd break it, because the ID changes after the culling.
    939     * Future work: try to save this to LDS and reload, but it can still be broken in subtle ways.
    940     */
    941    if (BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SUBGROUP_INVOCATION))
    942       return false;
    943 
    944    return true;
    945 }
    946 
    947 void radv_lower_ngg(struct radv_device *device, struct nir_shader *nir,
    948                     const struct radv_shader_info *info,
    949                     const struct radv_pipeline_key *pl_key)
    950 {
    951    /* TODO: support the LLVM backend with the NIR lowering */
    952    assert(!radv_use_llvm_for_stage(device, nir->info.stage));
    953 
    954    assert(nir->info.stage == MESA_SHADER_VERTEX ||
    955           nir->info.stage == MESA_SHADER_TESS_EVAL ||
    956           nir->info.stage == MESA_SHADER_GEOMETRY);
    957 
    958    const struct gfx10_ngg_info *ngg_info = &info->ngg_info;
    959    unsigned num_vertices_per_prim = 3;
    960 
    961    /* Get the number of vertices per input primitive */
    962    if (nir->info.stage == MESA_SHADER_TESS_EVAL) {
    963       if (nir->info.tess.point_mode)
    964          num_vertices_per_prim = 1;
    965       else if (nir->info.tess.primitive_mode == GL_ISOLINES)
    966          num_vertices_per_prim = 2;
    967 
    968       /* Manually mark the primitive ID used, so the shader can repack it. */
    969       if (info->tes.outinfo.export_prim_id)
    970          BITSET_SET(nir->info.system_values_read, SYSTEM_VALUE_PRIMITIVE_ID);
    971 
    972    } else if (nir->info.stage == MESA_SHADER_VERTEX) {
    973       /* Need to add 1, because: V_028A6C_POINTLIST=0, V_028A6C_LINESTRIP=1, V_028A6C_TRISTRIP=2, etc. */
    974       num_vertices_per_prim = si_conv_prim_to_gs_out(pl_key->vs.topology) + 1;
    975 
    976       /* Manually mark the instance ID used, so the shader can repack it. */
    977       if (pl_key->vs.instance_rate_inputs)
    978          BITSET_SET(nir->info.system_values_read, SYSTEM_VALUE_INSTANCE_ID);
    979 
    980    } else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
    981       num_vertices_per_prim = nir->info.gs.vertices_in;
    982    } else {
    983       unreachable("NGG needs to be VS, TES or GS.");
    984    }
    985 
    986    /* Invocations that process an input vertex */
    987    unsigned max_vtx_in = MIN2(256, ngg_info->enable_vertex_grouping ? ngg_info->hw_max_esverts : num_vertices_per_prim * ngg_info->max_gsprims);
    988 
    989    if (nir->info.stage == MESA_SHADER_VERTEX ||
    990        nir->info.stage == MESA_SHADER_TESS_EVAL) {
    991       bool export_prim_id;
    992 
    993       assert(info->is_ngg);
    994 
    995       if (info->has_ngg_culling)
    996          radv_optimize_nir_algebraic(nir, false);
    997 
    998       if (nir->info.stage == MESA_SHADER_VERTEX) {
    999          export_prim_id = info->vs.outinfo.export_prim_id;
   1000       } else {
   1001          export_prim_id = info->tes.outinfo.export_prim_id;
   1002       }
   1003 
   1004       ac_nir_lower_ngg_nogs(
   1005          nir,
   1006          max_vtx_in,
   1007          num_vertices_per_prim,
   1008          info->workgroup_size,
   1009          info->wave_size,
   1010          info->has_ngg_culling,
   1011          info->has_ngg_early_prim_export,
   1012          info->is_ngg_passthrough,
   1013          export_prim_id,
   1014          pl_key->vs.provoking_vtx_last,
   1015          false,
   1016          pl_key->vs.instance_rate_inputs);
   1017    } else if (nir->info.stage == MESA_SHADER_GEOMETRY) {
   1018       assert(info->is_ngg);
   1019       ac_nir_lower_ngg_gs(
   1020          nir, info->wave_size, info->workgroup_size,
   1021          info->ngg_info.esgs_ring_size,
   1022          info->gs.gsvs_vertex_size,
   1023          info->ngg_info.ngg_emit_size * 4u,
   1024          pl_key->vs.provoking_vtx_last);
   1025    } else {
   1026       unreachable("invalid SW stage passed to radv_lower_ngg");
   1027    }
   1028 }
   1029 
   1030 static unsigned
   1031 get_size_class(unsigned size, bool round_up)
   1032 {
   1033    size = round_up ? util_logbase2_ceil(size) : util_logbase2(size);
   1034    unsigned size_class =
   1035       MAX2(size, RADV_SHADER_ALLOC_MIN_SIZE_CLASS) - RADV_SHADER_ALLOC_MIN_SIZE_CLASS;
   1036    return MIN2(size_class, RADV_SHADER_ALLOC_NUM_FREE_LISTS - 1);
   1037 }
   1038 
   1039 static void
   1040 remove_hole(struct radv_device *device, union radv_shader_arena_block *hole)
   1041 {
   1042    unsigned size_class = get_size_class(hole->size, false);
   1043    list_del(&hole->freelist);
   1044    if (list_is_empty(&device->shader_free_lists[size_class]))
   1045       device->shader_free_list_mask &= ~(1u << size_class);
   1046 }
   1047 
   1048 static void
   1049 add_hole(struct radv_device *device, union radv_shader_arena_block *hole)
   1050 {
   1051    unsigned size_class = get_size_class(hole->size, false);
   1052    list_addtail(&hole->freelist, &device->shader_free_lists[size_class]);
   1053    device->shader_free_list_mask |= 1u << size_class;
   1054 }
   1055 
   1056 static union radv_shader_arena_block *
   1057 alloc_block_obj(struct radv_device *device)
   1058 {
   1059    if (!list_is_empty(&device->shader_block_obj_pool)) {
   1060       union radv_shader_arena_block *block =
   1061          list_first_entry(&device->shader_block_obj_pool, union radv_shader_arena_block, pool);
   1062       list_del(&block->pool);
   1063       return block;
   1064    }
   1065 
   1066    return malloc(sizeof(union radv_shader_arena_block));
   1067 }
   1068 
   1069 static void
   1070 free_block_obj(struct radv_device *device, union radv_shader_arena_block *block)
   1071 {
   1072    list_add(&block->pool, &device->shader_block_obj_pool);
   1073 }
   1074 
   1075 /* Segregated fit allocator, implementing a good-fit allocation policy.
   1076  *
   1077  * This is an variation of sequential fit allocation with several lists of free blocks ("holes")
   1078  * instead of one. Each list of holes only contains holes of a certain range of sizes, so holes that
   1079  * are too small can easily be ignored while allocating. Because this also ignores holes that are
   1080  * larger than necessary (approximating best-fit allocation), this could be described as a
   1081  * "good-fit" allocator.
   1082  *
   1083  * Typically, shaders are allocated and only free'd when the device is destroyed. For this pattern,
   1084  * this should allocate blocks for shaders fast and with no fragmentation, while still allowing
   1085  * free'd memory to be re-used.
   1086  */
   1087 static union radv_shader_arena_block *
   1088 alloc_shader_memory(struct radv_device *device, uint32_t size, void *ptr)
   1089 {
   1090    size = align(size, RADV_SHADER_ALLOC_ALIGNMENT);
   1091 
   1092    mtx_lock(&device->shader_arena_mutex);
   1093 
   1094    /* Try to use an existing hole. Unless the shader is very large, this should only have to look
   1095     * at the first one available.
   1096     */
   1097    unsigned free_list_mask = BITFIELD_MASK(RADV_SHADER_ALLOC_NUM_FREE_LISTS);
   1098    unsigned size_class =
   1099       ffs(device->shader_free_list_mask & (free_list_mask << get_size_class(size, true)));
   1100    if (size_class) {
   1101       size_class--;
   1102 
   1103       list_for_each_entry(union radv_shader_arena_block, hole,
   1104                           &device->shader_free_lists[size_class], freelist)
   1105       {
   1106          if (hole->size < size)
   1107             continue;
   1108 
   1109          assert(hole->offset % RADV_SHADER_ALLOC_ALIGNMENT == 0);
   1110 
   1111          if (size == hole->size) {
   1112             remove_hole(device, hole);
   1113             hole->freelist.next = ptr;
   1114             mtx_unlock(&device->shader_arena_mutex);
   1115             return hole;
   1116          } else {
   1117             union radv_shader_arena_block *alloc = alloc_block_obj(device);
   1118             if (!alloc) {
   1119                mtx_unlock(&device->shader_arena_mutex);
   1120                return NULL;
   1121             }
   1122             list_addtail(&alloc->list, &hole->list);
   1123             alloc->freelist.prev = NULL;
   1124             alloc->freelist.next = ptr;
   1125             alloc->arena = hole->arena;
   1126             alloc->offset = hole->offset;
   1127             alloc->size = size;
   1128 
   1129             remove_hole(device, hole);
   1130             hole->offset += size;
   1131             hole->size -= size;
   1132             add_hole(device, hole);
   1133 
   1134             mtx_unlock(&device->shader_arena_mutex);
   1135             return alloc;
   1136          }
   1137       }
   1138    }
   1139 
   1140    /* Allocate a new shader arena. */
   1141    struct radv_shader_arena *arena = calloc(1, sizeof(struct radv_shader_arena));
   1142    union radv_shader_arena_block *alloc = NULL, *hole = NULL;
   1143    if (!arena)
   1144       goto fail;
   1145 
   1146    unsigned arena_size = MAX2(RADV_SHADER_ALLOC_MIN_ARENA_SIZE, size);
   1147    VkResult result = device->ws->buffer_create(
   1148       device->ws, arena_size, RADV_SHADER_ALLOC_ALIGNMENT, RADEON_DOMAIN_VRAM,
   1149       RADEON_FLAG_NO_INTERPROCESS_SHARING | RADEON_FLAG_32BIT |
   1150          (device->physical_device->rad_info.cpdma_prefetch_writes_memory ? 0
   1151                                                                          : RADEON_FLAG_READ_ONLY),
   1152       RADV_BO_PRIORITY_SHADER, 0, &arena->bo);
   1153    if (result != VK_SUCCESS)
   1154       goto fail;
   1155 
   1156    list_inithead(&arena->entries);
   1157 
   1158    arena->ptr = (char *)device->ws->buffer_map(arena->bo);
   1159    if (!arena->ptr)
   1160       goto fail;
   1161 
   1162    alloc = alloc_block_obj(device);
   1163    hole = arena_size - size > 0 ? alloc_block_obj(device) : alloc;
   1164    if (!alloc || !hole)
   1165       goto fail;
   1166    list_addtail(&alloc->list, &arena->entries);
   1167    alloc->freelist.prev = NULL;
   1168    alloc->freelist.next = ptr;
   1169    alloc->arena = arena;
   1170    alloc->offset = 0;
   1171    alloc->size = size;
   1172 
   1173    if (hole != alloc) {
   1174       hole->arena = arena;
   1175       hole->offset = size;
   1176       hole->size = arena_size - size;
   1177 
   1178       list_addtail(&hole->list, &arena->entries);
   1179       add_hole(device, hole);
   1180    }
   1181 
   1182    list_addtail(&arena->list, &device->shader_arenas);
   1183 
   1184    mtx_unlock(&device->shader_arena_mutex);
   1185    return alloc;
   1186 
   1187 fail:
   1188    mtx_unlock(&device->shader_arena_mutex);
   1189    free(alloc);
   1190    free(hole);
   1191    if (arena && arena->bo)
   1192       device->ws->buffer_destroy(device->ws, arena->bo);
   1193    free(arena);
   1194    return NULL;
   1195 }
   1196 
   1197 static union radv_shader_arena_block *
   1198 get_hole(struct radv_shader_arena *arena, struct list_head *head)
   1199 {
   1200    if (head == &arena->entries)
   1201       return NULL;
   1202 
   1203    union radv_shader_arena_block *hole = LIST_ENTRY(union radv_shader_arena_block, head, list);
   1204    return hole->freelist.prev ? hole : NULL;
   1205 }
   1206 
   1207 static void
   1208 free_shader_memory(struct radv_device *device, union radv_shader_arena_block *alloc)
   1209 {
   1210    mtx_lock(&device->shader_arena_mutex);
   1211 
   1212    union radv_shader_arena_block *hole_prev = get_hole(alloc->arena, alloc->list.prev);
   1213    union radv_shader_arena_block *hole_next = get_hole(alloc->arena, alloc->list.next);
   1214 
   1215    union radv_shader_arena_block *hole = alloc;
   1216 
   1217    /* merge with previous hole */
   1218    if (hole_prev) {
   1219       remove_hole(device, hole_prev);
   1220 
   1221       hole_prev->size += hole->size;
   1222       list_del(&hole->list);
   1223       free_block_obj(device, hole);
   1224 
   1225       hole = hole_prev;
   1226    }
   1227 
   1228    /* merge with next hole */
   1229    if (hole_next) {
   1230       remove_hole(device, hole_next);
   1231 
   1232       hole_next->offset -= hole->size;
   1233       hole_next->size += hole->size;
   1234       list_del(&hole->list);
   1235       free_block_obj(device, hole);
   1236 
   1237       hole = hole_next;
   1238    }
   1239 
   1240    if (list_is_singular(&hole->list)) {
   1241       struct radv_shader_arena *arena = hole->arena;
   1242       free_block_obj(device, hole);
   1243 
   1244       device->ws->buffer_destroy(device->ws, arena->bo);
   1245       list_del(&arena->list);
   1246       free(arena);
   1247    } else {
   1248       add_hole(device, hole);
   1249    }
   1250 
   1251    mtx_unlock(&device->shader_arena_mutex);
   1252 }
   1253 
   1254 static void *
   1255 radv_alloc_shader_memory(struct radv_device *device, struct radv_shader_variant *shader)
   1256 {
   1257    shader->alloc = alloc_shader_memory(device, shader->code_size, shader);
   1258    if (!shader->alloc)
   1259       return NULL;
   1260    shader->bo = shader->alloc->arena->bo;
   1261    return shader->alloc->arena->ptr + shader->alloc->offset;
   1262 }
   1263 
   1264 void
   1265 radv_init_shader_arenas(struct radv_device *device)
   1266 {
   1267    mtx_init(&device->shader_arena_mutex, mtx_plain);
   1268 
   1269    device->shader_free_list_mask = 0;
   1270 
   1271    list_inithead(&device->shader_arenas);
   1272    list_inithead(&device->shader_block_obj_pool);
   1273    for (unsigned i = 0; i < RADV_SHADER_ALLOC_NUM_FREE_LISTS; i++)
   1274       list_inithead(&device->shader_free_lists[i]);
   1275 }
   1276 
   1277 void
   1278 radv_destroy_shader_arenas(struct radv_device *device)
   1279 {
   1280    list_for_each_entry_safe(union radv_shader_arena_block, block, &device->shader_block_obj_pool,
   1281                             pool) free(block);
   1282 
   1283    list_for_each_entry_safe(struct radv_shader_arena, arena, &device->shader_arenas, list)
   1284    {
   1285       device->ws->buffer_destroy(device->ws, arena->bo);
   1286       free(arena);
   1287    }
   1288    mtx_destroy(&device->shader_arena_mutex);
   1289 }
   1290 
   1291 /* For the UMR disassembler. */
   1292 #define DEBUGGER_END_OF_CODE_MARKER 0xbf9f0000 /* invalid instruction */
   1293 #define DEBUGGER_NUM_MARKERS        5
   1294 
   1295 static unsigned
   1296 radv_get_shader_binary_size(size_t code_size)
   1297 {
   1298    return code_size + DEBUGGER_NUM_MARKERS * 4;
   1299 }
   1300 
   1301 static bool
   1302 radv_should_use_wgp_mode(const struct radv_device *device, gl_shader_stage stage,
   1303                          const struct radv_shader_info *info)
   1304 {
   1305    enum chip_class chip = device->physical_device->rad_info.chip_class;
   1306    switch (stage) {
   1307    case MESA_SHADER_COMPUTE:
   1308    case MESA_SHADER_TESS_CTRL:
   1309       return chip >= GFX10;
   1310    case MESA_SHADER_GEOMETRY:
   1311       return chip == GFX10 || (chip >= GFX10_3 && !info->is_ngg);
   1312    case MESA_SHADER_VERTEX:
   1313    case MESA_SHADER_TESS_EVAL:
   1314       return chip == GFX10 && info->is_ngg;
   1315    default:
   1316       return false;
   1317    }
   1318 }
   1319 
   1320 static void
   1321 radv_postprocess_config(const struct radv_device *device, const struct ac_shader_config *config_in,
   1322                         const struct radv_shader_info *info, gl_shader_stage stage,
   1323                         struct ac_shader_config *config_out)
   1324 {
   1325    const struct radv_physical_device *pdevice = device->physical_device;
   1326    bool scratch_enabled = config_in->scratch_bytes_per_wave > 0;
   1327    bool trap_enabled = !!device->trap_handler_shader;
   1328    unsigned vgpr_comp_cnt = 0;
   1329    unsigned num_input_vgprs = info->num_input_vgprs;
   1330 
   1331    if (stage == MESA_SHADER_FRAGMENT) {
   1332       num_input_vgprs = ac_get_fs_input_vgpr_cnt(config_in, NULL, NULL);
   1333    }
   1334 
   1335    unsigned num_vgprs = MAX2(config_in->num_vgprs, num_input_vgprs);
   1336    /* +3 for scratch wave offset and VCC */
   1337    unsigned num_sgprs = MAX2(config_in->num_sgprs, info->num_input_sgprs + 3);
   1338    unsigned num_shared_vgprs = config_in->num_shared_vgprs;
   1339    /* shared VGPRs are introduced in Navi and are allocated in blocks of 8 (RDNA ref 3.6.5) */
   1340    assert((pdevice->rad_info.chip_class >= GFX10 && num_shared_vgprs % 8 == 0) ||
   1341           (pdevice->rad_info.chip_class < GFX10 && num_shared_vgprs == 0));
   1342    unsigned num_shared_vgpr_blocks = num_shared_vgprs / 8;
   1343    unsigned excp_en = 0;
   1344 
   1345    *config_out = *config_in;
   1346    config_out->num_vgprs = num_vgprs;
   1347    config_out->num_sgprs = num_sgprs;
   1348    config_out->num_shared_vgprs = num_shared_vgprs;
   1349 
   1350    config_out->rsrc2 = S_00B12C_USER_SGPR(info->num_user_sgprs) |
   1351                        S_00B12C_SCRATCH_EN(scratch_enabled) | S_00B12C_TRAP_PRESENT(trap_enabled);
   1352 
   1353    if (trap_enabled) {
   1354       /* Configure the shader exceptions like memory violation, etc.
   1355        * TODO: Enable (and validate) more exceptions.
   1356        */
   1357       excp_en = 1 << 8; /* mem_viol */
   1358    }
   1359 
   1360    if (!pdevice->use_ngg_streamout) {
   1361       config_out->rsrc2 |=
   1362          S_00B12C_SO_BASE0_EN(!!info->so.strides[0]) | S_00B12C_SO_BASE1_EN(!!info->so.strides[1]) |
   1363          S_00B12C_SO_BASE2_EN(!!info->so.strides[2]) | S_00B12C_SO_BASE3_EN(!!info->so.strides[3]) |
   1364          S_00B12C_SO_EN(!!info->so.num_outputs);
   1365    }
   1366 
   1367    config_out->rsrc1 = S_00B848_VGPRS((num_vgprs - 1) / (info->wave_size == 32 ? 8 : 4)) |
   1368                        S_00B848_DX10_CLAMP(1) | S_00B848_FLOAT_MODE(config_out->float_mode);
   1369 
   1370    if (pdevice->rad_info.chip_class >= GFX10) {
   1371       config_out->rsrc2 |= S_00B22C_USER_SGPR_MSB_GFX10(info->num_user_sgprs >> 5);
   1372    } else {
   1373       config_out->rsrc1 |= S_00B228_SGPRS((num_sgprs - 1) / 8);
   1374       config_out->rsrc2 |= S_00B22C_USER_SGPR_MSB_GFX9(info->num_user_sgprs >> 5);
   1375    }
   1376 
   1377    bool wgp_mode = radv_should_use_wgp_mode(device, stage, info);
   1378 
   1379    switch (stage) {
   1380    case MESA_SHADER_TESS_EVAL:
   1381       if (info->is_ngg) {
   1382          config_out->rsrc1 |= S_00B228_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1383          config_out->rsrc2 |= S_00B22C_OC_LDS_EN(1) | S_00B22C_EXCP_EN(excp_en);
   1384       } else if (info->tes.as_es) {
   1385          assert(pdevice->rad_info.chip_class <= GFX8);
   1386          vgpr_comp_cnt = info->uses_prim_id ? 3 : 2;
   1387 
   1388          config_out->rsrc2 |= S_00B12C_OC_LDS_EN(1) | S_00B12C_EXCP_EN(excp_en);
   1389       } else {
   1390          bool enable_prim_id = info->tes.outinfo.export_prim_id || info->uses_prim_id;
   1391          vgpr_comp_cnt = enable_prim_id ? 3 : 2;
   1392 
   1393          config_out->rsrc1 |= S_00B128_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1394          config_out->rsrc2 |= S_00B12C_OC_LDS_EN(1) | S_00B12C_EXCP_EN(excp_en);
   1395       }
   1396       config_out->rsrc2 |= S_00B22C_SHARED_VGPR_CNT(num_shared_vgpr_blocks);
   1397       break;
   1398    case MESA_SHADER_TESS_CTRL:
   1399       if (pdevice->rad_info.chip_class >= GFX9) {
   1400          /* We need at least 2 components for LS.
   1401           * VGPR0-3: (VertexID, RelAutoindex, InstanceID / StepRate0, InstanceID).
   1402           * StepRate0 is set to 1. so that VGPR3 doesn't have to be loaded.
   1403           */
   1404          if (pdevice->rad_info.chip_class >= GFX10) {
   1405             vgpr_comp_cnt = info->vs.needs_instance_id ? 3 : 1;
   1406             config_out->rsrc2 |=
   1407                S_00B42C_LDS_SIZE_GFX10(info->tcs.num_lds_blocks) | S_00B42C_EXCP_EN_GFX6(excp_en);
   1408          } else {
   1409             vgpr_comp_cnt = info->vs.needs_instance_id ? 2 : 1;
   1410             config_out->rsrc2 |=
   1411                S_00B42C_LDS_SIZE_GFX9(info->tcs.num_lds_blocks) | S_00B42C_EXCP_EN_GFX9(excp_en);
   1412          }
   1413       } else {
   1414          config_out->rsrc2 |= S_00B12C_OC_LDS_EN(1) | S_00B12C_EXCP_EN(excp_en);
   1415       }
   1416       config_out->rsrc1 |=
   1417          S_00B428_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10) | S_00B428_WGP_MODE(wgp_mode);
   1418       config_out->rsrc2 |= S_00B42C_SHARED_VGPR_CNT(num_shared_vgpr_blocks);
   1419       break;
   1420    case MESA_SHADER_VERTEX:
   1421       if (info->is_ngg) {
   1422          config_out->rsrc1 |= S_00B228_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1423       } else if (info->vs.as_ls) {
   1424          assert(pdevice->rad_info.chip_class <= GFX8);
   1425          /* We need at least 2 components for LS.
   1426           * VGPR0-3: (VertexID, RelAutoindex, InstanceID / StepRate0, InstanceID).
   1427           * StepRate0 is set to 1. so that VGPR3 doesn't have to be loaded.
   1428           */
   1429          vgpr_comp_cnt = info->vs.needs_instance_id ? 2 : 1;
   1430       } else if (info->vs.as_es) {
   1431          assert(pdevice->rad_info.chip_class <= GFX8);
   1432          /* VGPR0-3: (VertexID, InstanceID / StepRate0, ...) */
   1433          vgpr_comp_cnt = info->vs.needs_instance_id ? 1 : 0;
   1434       } else {
   1435          /* VGPR0-3: (VertexID, InstanceID / StepRate0, PrimID, InstanceID)
   1436           * If PrimID is disabled. InstanceID / StepRate1 is loaded instead.
   1437           * StepRate0 is set to 1. so that VGPR3 doesn't have to be loaded.
   1438           */
   1439          if (info->vs.needs_instance_id && pdevice->rad_info.chip_class >= GFX10) {
   1440             vgpr_comp_cnt = 3;
   1441          } else if (info->vs.outinfo.export_prim_id) {
   1442             vgpr_comp_cnt = 2;
   1443          } else if (info->vs.needs_instance_id) {
   1444             vgpr_comp_cnt = 1;
   1445          } else {
   1446             vgpr_comp_cnt = 0;
   1447          }
   1448 
   1449          config_out->rsrc1 |= S_00B128_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1450       }
   1451       config_out->rsrc2 |=
   1452          S_00B12C_SHARED_VGPR_CNT(num_shared_vgpr_blocks) | S_00B12C_EXCP_EN(excp_en);
   1453       break;
   1454    case MESA_SHADER_FRAGMENT:
   1455       config_out->rsrc1 |= S_00B028_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1456       config_out->rsrc2 |= S_00B02C_SHARED_VGPR_CNT(num_shared_vgpr_blocks) |
   1457                            S_00B02C_EXCP_EN(excp_en);
   1458       break;
   1459    case MESA_SHADER_GEOMETRY:
   1460       config_out->rsrc1 |= S_00B228_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10);
   1461       config_out->rsrc2 |=
   1462          S_00B22C_SHARED_VGPR_CNT(num_shared_vgpr_blocks) | S_00B22C_EXCP_EN(excp_en);
   1463       break;
   1464    case MESA_SHADER_COMPUTE:
   1465       config_out->rsrc1 |=
   1466          S_00B848_MEM_ORDERED(pdevice->rad_info.chip_class >= GFX10) | S_00B848_WGP_MODE(wgp_mode);
   1467       config_out->rsrc2 |= S_00B84C_TGID_X_EN(info->cs.uses_block_id[0]) |
   1468                            S_00B84C_TGID_Y_EN(info->cs.uses_block_id[1]) |
   1469                            S_00B84C_TGID_Z_EN(info->cs.uses_block_id[2]) |
   1470                            S_00B84C_TIDIG_COMP_CNT(info->cs.uses_thread_id[2]   ? 2
   1471                                                    : info->cs.uses_thread_id[1] ? 1
   1472                                                                                 : 0) |
   1473                            S_00B84C_TG_SIZE_EN(info->cs.uses_local_invocation_idx) |
   1474                            S_00B84C_LDS_SIZE(config_in->lds_size) | S_00B84C_EXCP_EN(excp_en);
   1475       config_out->rsrc3 |= S_00B8A0_SHARED_VGPR_CNT(num_shared_vgpr_blocks);
   1476 
   1477       break;
   1478    default:
   1479       unreachable("unsupported shader type");
   1480       break;
   1481    }
   1482 
   1483    if (pdevice->rad_info.chip_class >= GFX10 && info->is_ngg &&
   1484        (stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_TESS_EVAL ||
   1485         stage == MESA_SHADER_GEOMETRY)) {
   1486       unsigned gs_vgpr_comp_cnt, es_vgpr_comp_cnt;
   1487       gl_shader_stage es_stage = stage;
   1488       if (stage == MESA_SHADER_GEOMETRY)
   1489          es_stage = info->gs.es_type;
   1490 
   1491       /* VGPR5-8: (VertexID, UserVGPR0, UserVGPR1, UserVGPR2 / InstanceID) */
   1492       if (es_stage == MESA_SHADER_VERTEX) {
   1493          es_vgpr_comp_cnt = info->vs.needs_instance_id ? 3 : 0;
   1494       } else if (es_stage == MESA_SHADER_TESS_EVAL) {
   1495          bool enable_prim_id = info->tes.outinfo.export_prim_id || info->uses_prim_id;
   1496          es_vgpr_comp_cnt = enable_prim_id ? 3 : 2;
   1497       } else
   1498          unreachable("Unexpected ES shader stage");
   1499 
   1500       bool nggc = info->has_ngg_culling; /* Culling uses GS vertex offsets 0, 1, 2. */
   1501       bool tes_triangles =
   1502          stage == MESA_SHADER_TESS_EVAL && info->tes.primitive_mode >= 4; /* GL_TRIANGLES */
   1503       if (info->uses_invocation_id) {
   1504          gs_vgpr_comp_cnt = 3; /* VGPR3 contains InvocationID. */
   1505       } else if (info->uses_prim_id || (es_stage == MESA_SHADER_VERTEX &&
   1506                                         info->vs.outinfo.export_prim_id)) {
   1507          gs_vgpr_comp_cnt = 2; /* VGPR2 contains PrimitiveID. */
   1508       } else if (info->gs.vertices_in >= 3 || tes_triangles || nggc) {
   1509          gs_vgpr_comp_cnt = 1; /* VGPR1 contains offsets 2, 3 */
   1510       } else {
   1511          gs_vgpr_comp_cnt = 0; /* VGPR0 contains offsets 0, 1 */
   1512       }
   1513 
   1514       /* Disable the WGP mode on gfx10.3 because it can hang. (it
   1515        * happened on VanGogh) Let's disable it on all chips that
   1516        * disable exactly 1 CU per SA for GS.
   1517        */
   1518       config_out->rsrc1 |=
   1519          S_00B228_GS_VGPR_COMP_CNT(gs_vgpr_comp_cnt) | S_00B228_WGP_MODE(wgp_mode);
   1520       config_out->rsrc2 |= S_00B22C_ES_VGPR_COMP_CNT(es_vgpr_comp_cnt) |
   1521                            S_00B22C_LDS_SIZE(config_in->lds_size) |
   1522                            S_00B22C_OC_LDS_EN(es_stage == MESA_SHADER_TESS_EVAL);
   1523    } else if (pdevice->rad_info.chip_class >= GFX9 && stage == MESA_SHADER_GEOMETRY) {
   1524       unsigned es_type = info->gs.es_type;
   1525       unsigned gs_vgpr_comp_cnt, es_vgpr_comp_cnt;
   1526 
   1527       if (es_type == MESA_SHADER_VERTEX) {
   1528          /* VGPR0-3: (VertexID, InstanceID / StepRate0, ...) */
   1529          if (info->vs.needs_instance_id) {
   1530             es_vgpr_comp_cnt = pdevice->rad_info.chip_class >= GFX10 ? 3 : 1;
   1531          } else {
   1532             es_vgpr_comp_cnt = 0;
   1533          }
   1534       } else if (es_type == MESA_SHADER_TESS_EVAL) {
   1535          es_vgpr_comp_cnt = info->uses_prim_id ? 3 : 2;
   1536       } else {
   1537          unreachable("invalid shader ES type");
   1538       }
   1539 
   1540       /* If offsets 4, 5 are used, GS_VGPR_COMP_CNT is ignored and
   1541        * VGPR[0:4] are always loaded.
   1542        */
   1543       if (info->uses_invocation_id) {
   1544          gs_vgpr_comp_cnt = 3; /* VGPR3 contains InvocationID. */
   1545       } else if (info->uses_prim_id) {
   1546          gs_vgpr_comp_cnt = 2; /* VGPR2 contains PrimitiveID. */
   1547       } else if (info->gs.vertices_in >= 3) {
   1548          gs_vgpr_comp_cnt = 1; /* VGPR1 contains offsets 2, 3 */
   1549       } else {
   1550          gs_vgpr_comp_cnt = 0; /* VGPR0 contains offsets 0, 1 */
   1551       }
   1552 
   1553       config_out->rsrc1 |=
   1554          S_00B228_GS_VGPR_COMP_CNT(gs_vgpr_comp_cnt) | S_00B228_WGP_MODE(wgp_mode);
   1555       config_out->rsrc2 |= S_00B22C_ES_VGPR_COMP_CNT(es_vgpr_comp_cnt) |
   1556                            S_00B22C_OC_LDS_EN(es_type == MESA_SHADER_TESS_EVAL);
   1557    } else if (pdevice->rad_info.chip_class >= GFX9 && stage == MESA_SHADER_TESS_CTRL) {
   1558       config_out->rsrc1 |= S_00B428_LS_VGPR_COMP_CNT(vgpr_comp_cnt);
   1559    } else {
   1560       config_out->rsrc1 |= S_00B128_VGPR_COMP_CNT(vgpr_comp_cnt);
   1561    }
   1562 }
   1563 
   1564 struct radv_shader_variant *
   1565 radv_shader_variant_create(struct radv_device *device, const struct radv_shader_binary *binary,
   1566                            bool keep_shader_info, bool from_cache)
   1567 {
   1568    struct ac_shader_config config = {0};
   1569    struct ac_rtld_binary rtld_binary = {0};
   1570    struct radv_shader_variant *variant = calloc(1, sizeof(struct radv_shader_variant));
   1571    if (!variant)
   1572       return NULL;
   1573 
   1574    variant->ref_count = 1;
   1575 
   1576    if (binary->type == RADV_BINARY_TYPE_RTLD) {
   1577       struct ac_rtld_symbol lds_symbols[2];
   1578       unsigned num_lds_symbols = 0;
   1579       const char *elf_data = (const char *)((struct radv_shader_binary_rtld *)binary)->data;
   1580       size_t elf_size = ((struct radv_shader_binary_rtld *)binary)->elf_size;
   1581 
   1582       if (device->physical_device->rad_info.chip_class >= GFX9 &&
   1583           (binary->stage == MESA_SHADER_GEOMETRY || binary->info.is_ngg) &&
   1584           !binary->is_gs_copy_shader) {
   1585          struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++];
   1586          sym->name = "esgs_ring";
   1587          sym->size = binary->info.ngg_info.esgs_ring_size;
   1588          sym->align = 64 * 1024;
   1589       }
   1590 
   1591       if (binary->info.is_ngg && binary->stage == MESA_SHADER_GEOMETRY) {
   1592          struct ac_rtld_symbol *sym = &lds_symbols[num_lds_symbols++];
   1593          sym->name = "ngg_emit";
   1594          sym->size = binary->info.ngg_info.ngg_emit_size * 4;
   1595          sym->align = 4;
   1596       }
   1597 
   1598       struct ac_rtld_open_info open_info = {
   1599          .info = &device->physical_device->rad_info,
   1600          .shader_type = binary->stage,
   1601          .wave_size = binary->info.wave_size,
   1602          .num_parts = 1,
   1603          .elf_ptrs = &elf_data,
   1604          .elf_sizes = &elf_size,
   1605          .num_shared_lds_symbols = num_lds_symbols,
   1606          .shared_lds_symbols = lds_symbols,
   1607       };
   1608 
   1609       if (!ac_rtld_open(&rtld_binary, open_info)) {
   1610          free(variant);
   1611          return NULL;
   1612       }
   1613 
   1614       if (!ac_rtld_read_config(&device->physical_device->rad_info, &rtld_binary, &config)) {
   1615          ac_rtld_close(&rtld_binary);
   1616          free(variant);
   1617          return NULL;
   1618       }
   1619 
   1620       if (rtld_binary.lds_size > 0) {
   1621          unsigned encode_granularity = device->physical_device->rad_info.lds_encode_granularity;
   1622          config.lds_size = align(rtld_binary.lds_size, encode_granularity) / encode_granularity;
   1623       }
   1624       if (!config.lds_size && binary->stage == MESA_SHADER_TESS_CTRL) {
   1625          /* This is used for reporting LDS statistics */
   1626          config.lds_size = binary->info.tcs.num_lds_blocks;
   1627       }
   1628 
   1629       variant->code_size = rtld_binary.rx_size;
   1630       variant->exec_size = rtld_binary.exec_size;
   1631    } else {
   1632       assert(binary->type == RADV_BINARY_TYPE_LEGACY);
   1633       config = ((struct radv_shader_binary_legacy *)binary)->base.config;
   1634       variant->code_size =
   1635          radv_get_shader_binary_size(((struct radv_shader_binary_legacy *)binary)->code_size);
   1636       variant->exec_size = ((struct radv_shader_binary_legacy *)binary)->exec_size;
   1637    }
   1638 
   1639    variant->info = binary->info;
   1640 
   1641    if (from_cache) {
   1642       /* Copy the shader binary configuration from the cache. */
   1643       memcpy(&variant->config, &binary->config, sizeof(variant->config));
   1644    } else {
   1645       radv_postprocess_config(device, &config, &binary->info, binary->stage, &variant->config);
   1646    }
   1647 
   1648    void *dest_ptr = radv_alloc_shader_memory(device, variant);
   1649    if (!dest_ptr) {
   1650       if (binary->type == RADV_BINARY_TYPE_RTLD)
   1651          ac_rtld_close(&rtld_binary);
   1652       free(variant);
   1653       return NULL;
   1654    }
   1655 
   1656    if (binary->type == RADV_BINARY_TYPE_RTLD) {
   1657       struct radv_shader_binary_rtld *bin = (struct radv_shader_binary_rtld *)binary;
   1658       struct ac_rtld_upload_info info = {
   1659          .binary = &rtld_binary,
   1660          .rx_va = radv_shader_variant_get_va(variant),
   1661          .rx_ptr = dest_ptr,
   1662       };
   1663 
   1664       if (!ac_rtld_upload(&info)) {
   1665          radv_shader_variant_destroy(device, variant);
   1666          ac_rtld_close(&rtld_binary);
   1667          return NULL;
   1668       }
   1669 
   1670       if (keep_shader_info || (device->instance->debug_flags & RADV_DEBUG_DUMP_SHADERS)) {
   1671          const char *disasm_data;
   1672          size_t disasm_size;
   1673          if (!ac_rtld_get_section_by_name(&rtld_binary, ".AMDGPU.disasm", &disasm_data,
   1674                                           &disasm_size)) {
   1675             radv_shader_variant_destroy(device, variant);
   1676             ac_rtld_close(&rtld_binary);
   1677             return NULL;
   1678          }
   1679 
   1680          variant->ir_string =
   1681             bin->llvm_ir_size ? strdup((const char *)(bin->data + bin->elf_size)) : NULL;
   1682          variant->disasm_string = malloc(disasm_size + 1);
   1683          memcpy(variant->disasm_string, disasm_data, disasm_size);
   1684          variant->disasm_string[disasm_size] = 0;
   1685       }
   1686 
   1687       variant->code_ptr = dest_ptr;
   1688       ac_rtld_close(&rtld_binary);
   1689    } else {
   1690       struct radv_shader_binary_legacy *bin = (struct radv_shader_binary_legacy *)binary;
   1691       memcpy(dest_ptr, bin->data + bin->stats_size, bin->code_size);
   1692 
   1693       /* Add end-of-code markers for the UMR disassembler. */
   1694       uint32_t *ptr32 = (uint32_t *)dest_ptr + bin->code_size / 4;
   1695       for (unsigned i = 0; i < DEBUGGER_NUM_MARKERS; i++)
   1696          ptr32[i] = DEBUGGER_END_OF_CODE_MARKER;
   1697 
   1698       variant->code_ptr = dest_ptr;
   1699       variant->ir_string =
   1700          bin->ir_size ? strdup((const char *)(bin->data + bin->stats_size + bin->code_size)) : NULL;
   1701       variant->disasm_string =
   1702          bin->disasm_size
   1703             ? strdup((const char *)(bin->data + bin->stats_size + bin->code_size + bin->ir_size))
   1704             : NULL;
   1705 
   1706       if (bin->stats_size) {
   1707          variant->statistics = calloc(bin->stats_size, 1);
   1708          memcpy(variant->statistics, bin->data, bin->stats_size);
   1709       }
   1710    }
   1711    return variant;
   1712 }
   1713 
   1714 static char *
   1715 radv_dump_nir_shaders(struct nir_shader *const *shaders, int shader_count)
   1716 {
   1717    char *data = NULL;
   1718    char *ret = NULL;
   1719    size_t size = 0;
   1720    struct u_memstream mem;
   1721    if (u_memstream_open(&mem, &data, &size)) {
   1722       FILE *const memf = u_memstream_get(&mem);
   1723       for (int i = 0; i < shader_count; ++i)
   1724          nir_print_shader(shaders[i], memf);
   1725       u_memstream_close(&mem);
   1726    }
   1727 
   1728    ret = malloc(size + 1);
   1729    if (ret) {
   1730       memcpy(ret, data, size);
   1731       ret[size] = 0;
   1732    }
   1733    free(data);
   1734    return ret;
   1735 }
   1736 
   1737 static struct radv_shader_variant *
   1738 shader_variant_compile(struct radv_device *device, struct vk_shader_module *module,
   1739                        struct nir_shader *const *shaders, int shader_count, gl_shader_stage stage,
   1740                        struct radv_shader_info *info, struct radv_nir_compiler_options *options,
   1741                        bool gs_copy_shader, bool trap_handler_shader, bool keep_shader_info,
   1742                        bool keep_statistic_info, struct radv_shader_binary **binary_out)
   1743 {
   1744    enum radeon_family chip_family = device->physical_device->rad_info.family;
   1745    struct radv_shader_binary *binary = NULL;
   1746 
   1747    struct radv_shader_debug_data debug_data = {
   1748       .device = device,
   1749       .module = module,
   1750    };
   1751 
   1752    options->family = chip_family;
   1753    options->chip_class = device->physical_device->rad_info.chip_class;
   1754    options->info = &device->physical_device->rad_info;
   1755    options->dump_shader = radv_can_dump_shader(device, module, gs_copy_shader || trap_handler_shader);
   1756    options->dump_preoptir =
   1757       options->dump_shader && device->instance->debug_flags & RADV_DEBUG_PREOPTIR;
   1758    options->record_ir = keep_shader_info;
   1759    options->record_stats = keep_statistic_info;
   1760    options->check_ir = device->instance->debug_flags & RADV_DEBUG_CHECKIR;
   1761    options->address32_hi = device->physical_device->rad_info.address32_hi;
   1762    options->has_ls_vgpr_init_bug = device->physical_device->rad_info.has_ls_vgpr_init_bug;
   1763    options->enable_mrt_output_nan_fixup =
   1764       module && !module->nir && options->key.ps.enable_mrt_output_nan_fixup;
   1765    options->adjust_frag_coord_z = device->adjust_frag_coord_z;
   1766    options->has_image_load_dcc_bug = device->physical_device->rad_info.has_image_load_dcc_bug;
   1767    options->debug.func = radv_compiler_debug;
   1768    options->debug.private_data = &debug_data;
   1769 
   1770    switch (options->key.ps.force_vrs) {
   1771    case RADV_FORCE_VRS_2x2:
   1772       options->force_vrs_rates = (1u << 2) | (1u << 4);
   1773       break;
   1774    case RADV_FORCE_VRS_2x1:
   1775       options->force_vrs_rates = (1u << 2) | (0u << 4);
   1776       break;
   1777    case RADV_FORCE_VRS_1x2:
   1778       options->force_vrs_rates = (0u << 2) | (1u << 4);
   1779       break;
   1780    default:
   1781       break;
   1782    }
   1783 
   1784    struct radv_shader_args args = {0};
   1785    args.options = options;
   1786    args.shader_info = info;
   1787    args.is_gs_copy_shader = gs_copy_shader;
   1788    args.is_trap_handler_shader = trap_handler_shader;
   1789 
   1790    radv_declare_shader_args(
   1791       &args, gs_copy_shader ? MESA_SHADER_VERTEX : shaders[shader_count - 1]->info.stage,
   1792       shader_count >= 2,
   1793       shader_count >= 2 ? shaders[shader_count - 2]->info.stage : MESA_SHADER_VERTEX);
   1794 
   1795 #ifdef LLVM_AVAILABLE
   1796    if (radv_use_llvm_for_stage(device, stage) || options->dump_shader || options->record_ir)
   1797       ac_init_llvm_once();
   1798 
   1799    if (radv_use_llvm_for_stage(device, stage)) {
   1800       llvm_compile_shader(device, shader_count, shaders, &binary, &args);
   1801 #else
   1802    if (false) {
   1803 #endif
   1804    } else {
   1805       aco_compile_shader(shader_count, shaders, &binary, &args);
   1806    }
   1807 
   1808    binary->info = *info;
   1809 
   1810    struct radv_shader_variant *variant =
   1811       radv_shader_variant_create(device, binary, keep_shader_info, false);
   1812    if (!variant) {
   1813       free(binary);
   1814       return NULL;
   1815    }
   1816 
   1817    if (options->dump_shader) {
   1818       fprintf(stderr, "%s", radv_get_shader_name(info, shaders[0]->info.stage));
   1819       for (int i = 1; i < shader_count; ++i)
   1820          fprintf(stderr, " + %s", radv_get_shader_name(info, shaders[i]->info.stage));
   1821 
   1822       fprintf(stderr, "\ndisasm:\n%s\n", variant->disasm_string);
   1823    }
   1824 
   1825    if (keep_shader_info) {
   1826       variant->nir_string = radv_dump_nir_shaders(shaders, shader_count);
   1827       if (!gs_copy_shader && !trap_handler_shader && !module->nir) {
   1828          variant->spirv = malloc(module->size);
   1829          if (!variant->spirv) {
   1830             free(variant);
   1831             free(binary);
   1832             return NULL;
   1833          }
   1834 
   1835          memcpy(variant->spirv, module->data, module->size);
   1836          variant->spirv_size = module->size;
   1837       }
   1838    }
   1839 
   1840    /* Copy the shader binary configuration to store it in the cache. */
   1841    memcpy(&binary->config, &variant->config, sizeof(binary->config));
   1842 
   1843    if (binary_out)
   1844       *binary_out = binary;
   1845    else
   1846       free(binary);
   1847 
   1848    return variant;
   1849 }
   1850 
   1851 struct radv_shader_variant *
   1852 radv_shader_variant_compile(struct radv_device *device, struct vk_shader_module *module,
   1853                             struct nir_shader *const *shaders, int shader_count,
   1854                             struct radv_pipeline_layout *layout,
   1855                             const struct radv_pipeline_key *key,
   1856                             struct radv_shader_info *info, bool keep_shader_info,
   1857                             bool keep_statistic_info,
   1858                             struct radv_shader_binary **binary_out)
   1859 {
   1860    gl_shader_stage stage = shaders[shader_count - 1]->info.stage;
   1861    struct radv_nir_compiler_options options = {0};
   1862 
   1863    options.layout = layout;
   1864    if (key)
   1865       options.key = *key;
   1866 
   1867    options.explicit_scratch_args = !radv_use_llvm_for_stage(device, stage);
   1868    options.remap_spi_ps_input = !radv_use_llvm_for_stage(device, stage);
   1869    options.robust_buffer_access = device->robust_buffer_access;
   1870    options.wgp_mode = radv_should_use_wgp_mode(device, stage, info);
   1871 
   1872    return shader_variant_compile(device, module, shaders, shader_count, stage, info, &options,
   1873                                  false, false, keep_shader_info, keep_statistic_info, binary_out);
   1874 }
   1875 
   1876 struct radv_shader_variant *
   1877 radv_create_gs_copy_shader(struct radv_device *device, struct nir_shader *shader,
   1878                            struct radv_shader_info *info, struct radv_shader_binary **binary_out,
   1879                            bool keep_shader_info, bool keep_statistic_info, bool multiview,
   1880                            bool disable_optimizations)
   1881 {
   1882    struct radv_nir_compiler_options options = {0};
   1883    gl_shader_stage stage = MESA_SHADER_VERTEX;
   1884 
   1885    options.explicit_scratch_args = !radv_use_llvm_for_stage(device, stage);
   1886    options.remap_spi_ps_input = !radv_use_llvm_for_stage(device, stage);
   1887    options.key.has_multiview_view_index = multiview;
   1888    options.key.optimisations_disabled = disable_optimizations;
   1889 
   1890    return shader_variant_compile(device, NULL, &shader, 1, stage, info, &options, true, false,
   1891                                  keep_shader_info, keep_statistic_info, binary_out);
   1892 }
   1893 
   1894 struct radv_shader_variant *
   1895 radv_create_trap_handler_shader(struct radv_device *device)
   1896 {
   1897    struct radv_nir_compiler_options options = {0};
   1898    struct radv_shader_variant *shader = NULL;
   1899    struct radv_shader_binary *binary = NULL;
   1900    struct radv_shader_info info = {0};
   1901 
   1902    nir_builder b = nir_builder_init_simple_shader(MESA_SHADER_COMPUTE, NULL, "meta_trap_handler");
   1903 
   1904    options.explicit_scratch_args = true;
   1905    options.wgp_mode = radv_should_use_wgp_mode(device, MESA_SHADER_COMPUTE, &info);
   1906    info.wave_size = 64;
   1907 
   1908    shader = shader_variant_compile(device, NULL, &b.shader, 1, MESA_SHADER_COMPUTE, &info, &options,
   1909                                    false, true, true, false, &binary);
   1910 
   1911    ralloc_free(b.shader);
   1912    free(binary);
   1913 
   1914    return shader;
   1915 }
   1916 
   1917 static struct radv_shader_prolog *
   1918 upload_vs_prolog(struct radv_device *device, struct radv_prolog_binary *bin, unsigned wave_size)
   1919 {
   1920    struct radv_shader_prolog *prolog = malloc(sizeof(struct radv_shader_prolog));
   1921    if (!prolog)
   1922       return NULL;
   1923 
   1924    prolog->alloc = alloc_shader_memory(device, bin->code_size, NULL);
   1925    if (!prolog->alloc) {
   1926       free(prolog);
   1927       return NULL;
   1928    }
   1929 
   1930    prolog->bo = prolog->alloc->arena->bo;
   1931    char *dest_ptr = prolog->alloc->arena->ptr + prolog->alloc->offset;
   1932 
   1933    memcpy(dest_ptr, bin->data, bin->code_size);
   1934 
   1935    prolog->rsrc1 = S_00B848_VGPRS((bin->num_vgprs - 1) / (wave_size == 32 ? 8 : 4)) |
   1936                    S_00B228_SGPRS((bin->num_sgprs - 1) / 8);
   1937    prolog->num_preserved_sgprs = bin->num_preserved_sgprs;
   1938 
   1939    return prolog;
   1940 }
   1941 
   1942 struct radv_shader_prolog *
   1943 radv_create_vs_prolog(struct radv_device *device, const struct radv_vs_prolog_key *key)
   1944 {
   1945    struct radv_nir_compiler_options options = {0};
   1946    options.explicit_scratch_args = true;
   1947    options.family = device->physical_device->rad_info.family;
   1948    options.chip_class = device->physical_device->rad_info.chip_class;
   1949    options.info = &device->physical_device->rad_info;
   1950    options.address32_hi = device->physical_device->rad_info.address32_hi;
   1951    options.dump_shader = device->instance->debug_flags & RADV_DEBUG_DUMP_PROLOGS;
   1952 
   1953    struct radv_shader_info info = {0};
   1954    info.wave_size = key->wave32 ? 32 : 64;
   1955    info.vs.needs_instance_id = true;
   1956    info.vs.needs_base_instance = true;
   1957    info.vs.needs_draw_id = true;
   1958    info.vs.use_per_attribute_vb_descs = true;
   1959    info.vs.vb_desc_usage_mask = BITFIELD_MASK(key->num_attributes);
   1960    info.vs.has_prolog = true;
   1961    info.vs.as_ls = key->as_ls;
   1962    info.is_ngg = key->is_ngg;
   1963 
   1964    struct radv_shader_args args = {0};
   1965    args.options = &options;
   1966    args.shader_info = &info;
   1967    radv_declare_shader_args(&args, key->next_stage, key->next_stage != MESA_SHADER_VERTEX,
   1968                             MESA_SHADER_VERTEX);
   1969 
   1970 #ifdef LLVM_AVAILABLE
   1971    if (options.dump_shader)
   1972       ac_init_llvm_once();
   1973 #endif
   1974 
   1975    struct radv_prolog_binary *binary = NULL;
   1976    aco_compile_vs_prolog(key, &binary, &args);
   1977    struct radv_shader_prolog *prolog = upload_vs_prolog(device, binary, info.wave_size);
   1978    if (prolog) {
   1979       prolog->nontrivial_divisors = key->state->nontrivial_divisors;
   1980    }
   1981    free(binary);
   1982 
   1983    return prolog;
   1984 }
   1985 
   1986 void
   1987 radv_shader_variant_destroy(struct radv_device *device, struct radv_shader_variant *variant)
   1988 {
   1989    if (!p_atomic_dec_zero(&variant->ref_count))
   1990       return;
   1991 
   1992    free_shader_memory(device, variant->alloc);
   1993 
   1994    free(variant->spirv);
   1995    free(variant->nir_string);
   1996    free(variant->disasm_string);
   1997    free(variant->ir_string);
   1998    free(variant->statistics);
   1999    free(variant);
   2000 }
   2001 
   2002 void
   2003 radv_prolog_destroy(struct radv_device *device, struct radv_shader_prolog *prolog)
   2004 {
   2005    if (!prolog)
   2006       return;
   2007 
   2008    free_shader_memory(device, prolog->alloc);
   2009    free(prolog);
   2010 }
   2011 
   2012 uint64_t
   2013 radv_shader_variant_get_va(const struct radv_shader_variant *variant)
   2014 {
   2015    return radv_buffer_get_va(variant->bo) + variant->alloc->offset;
   2016 }
   2017 
   2018 struct radv_shader_variant *
   2019 radv_find_shader_variant(struct radv_device *device, uint64_t pc)
   2020 {
   2021    mtx_lock(&device->shader_arena_mutex);
   2022    list_for_each_entry(struct radv_shader_arena, arena, &device->shader_arenas, list)
   2023    {
   2024 #ifdef __GNUC__
   2025 #pragma GCC diagnostic push
   2026 #pragma GCC diagnostic ignored "-Wshadow"
   2027 #endif
   2028       list_for_each_entry(union radv_shader_arena_block, block, &arena->entries, list)
   2029       {
   2030 #ifdef __GNUC__
   2031 #pragma GCC diagnostic pop
   2032 #endif
   2033          uint64_t start = radv_buffer_get_va(block->arena->bo) + block->offset;
   2034          if (!block->freelist.prev && pc >= start && pc < start + block->size) {
   2035             mtx_unlock(&device->shader_arena_mutex);
   2036             return (struct radv_shader_variant *)block->freelist.next;
   2037          }
   2038       }
   2039    }
   2040 
   2041    mtx_unlock(&device->shader_arena_mutex);
   2042    return NULL;
   2043 }
   2044 
   2045 const char *
   2046 radv_get_shader_name(struct radv_shader_info *info, gl_shader_stage stage)
   2047 {
   2048    switch (stage) {
   2049    case MESA_SHADER_VERTEX:
   2050       if (info->vs.as_ls)
   2051          return "Vertex Shader as LS";
   2052       else if (info->vs.as_es)
   2053          return "Vertex Shader as ES";
   2054       else if (info->is_ngg)
   2055          return "Vertex Shader as ESGS";
   2056       else
   2057          return "Vertex Shader as VS";
   2058    case MESA_SHADER_TESS_CTRL:
   2059       return "Tessellation Control Shader";
   2060    case MESA_SHADER_TESS_EVAL:
   2061       if (info->tes.as_es)
   2062          return "Tessellation Evaluation Shader as ES";
   2063       else if (info->is_ngg)
   2064          return "Tessellation Evaluation Shader as ESGS";
   2065       else
   2066          return "Tessellation Evaluation Shader as VS";
   2067    case MESA_SHADER_GEOMETRY:
   2068       return "Geometry Shader";
   2069    case MESA_SHADER_FRAGMENT:
   2070       return "Pixel Shader";
   2071    case MESA_SHADER_COMPUTE:
   2072       return "Compute Shader";
   2073    default:
   2074       return "Unknown shader";
   2075    };
   2076 }
   2077 
   2078 unsigned
   2079 radv_get_max_waves(const struct radv_device *device, struct radv_shader_variant *variant,
   2080                    gl_shader_stage stage)
   2081 {
   2082    struct radeon_info *info = &device->physical_device->rad_info;
   2083    enum chip_class chip_class = info->chip_class;
   2084    uint8_t wave_size = variant->info.wave_size;
   2085    struct ac_shader_config *conf = &variant->config;
   2086    unsigned max_simd_waves;
   2087    unsigned lds_per_wave = 0;
   2088 
   2089    max_simd_waves = info->max_wave64_per_simd * (64 / wave_size);
   2090 
   2091    if (stage == MESA_SHADER_FRAGMENT) {
   2092       lds_per_wave =
   2093          conf->lds_size * info->lds_encode_granularity + variant->info.ps.num_interp * 48;
   2094       lds_per_wave = align(lds_per_wave, info->lds_alloc_granularity);
   2095    } else if (stage == MESA_SHADER_COMPUTE) {
   2096       unsigned max_workgroup_size = variant->info.workgroup_size;
   2097       lds_per_wave =
   2098          align(conf->lds_size * info->lds_encode_granularity, info->lds_alloc_granularity);
   2099       lds_per_wave /= DIV_ROUND_UP(max_workgroup_size, wave_size);
   2100    }
   2101 
   2102    if (conf->num_sgprs && chip_class < GFX10) {
   2103       unsigned sgprs = align(conf->num_sgprs, chip_class >= GFX8 ? 16 : 8);
   2104       max_simd_waves = MIN2(max_simd_waves, info->num_physical_sgprs_per_simd / sgprs);
   2105    }
   2106 
   2107    if (conf->num_vgprs) {
   2108       unsigned physical_vgprs = info->num_physical_wave64_vgprs_per_simd * (64 / wave_size);
   2109       unsigned vgprs = align(conf->num_vgprs, wave_size == 32 ? 8 : 4);
   2110       if (chip_class >= GFX10_3)
   2111          vgprs = align(vgprs, wave_size == 32 ? 16 : 8);
   2112       max_simd_waves = MIN2(max_simd_waves, physical_vgprs / vgprs);
   2113    }
   2114 
   2115    unsigned simd_per_workgroup = info->num_simd_per_compute_unit;
   2116    if (chip_class >= GFX10)
   2117       simd_per_workgroup *= 2; /* like lds_size_per_workgroup, assume WGP on GFX10+ */
   2118 
   2119    unsigned max_lds_per_simd = info->lds_size_per_workgroup / simd_per_workgroup;
   2120    if (lds_per_wave)
   2121       max_simd_waves = MIN2(max_simd_waves, DIV_ROUND_UP(max_lds_per_simd, lds_per_wave));
   2122 
   2123    return chip_class >= GFX10 ? max_simd_waves * (wave_size / 32) : max_simd_waves;
   2124 }
   2125 
   2126 unsigned
   2127 radv_compute_spi_ps_input(const struct radv_device *device,
   2128                           const struct radv_shader_info *info)
   2129 {
   2130    unsigned spi_ps_input;
   2131 
   2132    spi_ps_input = S_0286CC_PERSP_CENTER_ENA(info->ps.reads_persp_center) |
   2133                   S_0286CC_PERSP_CENTROID_ENA(info->ps.reads_persp_centroid) |
   2134                   S_0286CC_PERSP_SAMPLE_ENA(info->ps.reads_persp_sample) |
   2135                   S_0286CC_LINEAR_CENTER_ENA(info->ps.reads_linear_center) |
   2136                   S_0286CC_LINEAR_CENTROID_ENA(info->ps.reads_linear_centroid) |
   2137                   S_0286CC_LINEAR_SAMPLE_ENA(info->ps.reads_linear_sample)|
   2138                   S_0286CC_PERSP_PULL_MODEL_ENA(info->ps.reads_barycentric_model) |
   2139                   S_0286CC_FRONT_FACE_ENA(info->ps.reads_front_face);
   2140 
   2141    if (info->ps.reads_frag_coord_mask ||
   2142        info->ps.reads_sample_pos_mask) {
   2143       uint8_t mask = info->ps.reads_frag_coord_mask | info->ps.reads_sample_pos_mask;
   2144 
   2145       for (unsigned i = 0; i < 4; i++) {
   2146          if (mask & (1 << i))
   2147             spi_ps_input |= S_0286CC_POS_X_FLOAT_ENA(1) << i;
   2148       }
   2149 
   2150       if (device->adjust_frag_coord_z && info->ps.reads_frag_coord_mask & (1 << 2)) {
   2151          spi_ps_input |= S_0286CC_ANCILLARY_ENA(1);
   2152       }
   2153    }
   2154 
   2155    if (info->ps.reads_sample_id || info->ps.reads_frag_shading_rate || info->ps.reads_sample_mask_in) {
   2156       spi_ps_input |= S_0286CC_ANCILLARY_ENA(1);
   2157    }
   2158 
   2159    if (info->ps.reads_sample_mask_in) {
   2160       spi_ps_input |= S_0286CC_SAMPLE_COVERAGE_ENA(1);
   2161    }
   2162 
   2163    if (G_0286CC_POS_W_FLOAT_ENA(spi_ps_input)) {
   2164       /* If POS_W_FLOAT (11) is enabled, at least one of PERSP_* must be enabled too */
   2165       spi_ps_input |= S_0286CC_PERSP_CENTER_ENA(1);
   2166    }
   2167 
   2168    if (!(spi_ps_input & 0x7F)) {
   2169       /* At least one of PERSP_* (0xF) or LINEAR_* (0x70) must be enabled */
   2170       spi_ps_input |= S_0286CC_PERSP_CENTER_ENA(1);
   2171    }
   2172 
   2173    return spi_ps_input;
   2174 }
   2175 
   2176 VkResult
   2177 radv_GetShaderInfoAMD(VkDevice _device, VkPipeline _pipeline, VkShaderStageFlagBits shaderStage,
   2178                       VkShaderInfoTypeAMD infoType, size_t *pInfoSize, void *pInfo)
   2179 {
   2180    RADV_FROM_HANDLE(radv_device, device, _device);
   2181    RADV_FROM_HANDLE(radv_pipeline, pipeline, _pipeline);
   2182    gl_shader_stage stage = vk_to_mesa_shader_stage(shaderStage);
   2183    struct radv_shader_variant *variant = pipeline->shaders[stage];
   2184    VkResult result = VK_SUCCESS;
   2185 
   2186    /* Spec doesn't indicate what to do if the stage is invalid, so just
   2187     * return no info for this. */
   2188    if (!variant)
   2189       return vk_error(device, VK_ERROR_FEATURE_NOT_PRESENT);
   2190 
   2191    switch (infoType) {
   2192    case VK_SHADER_INFO_TYPE_STATISTICS_AMD:
   2193       if (!pInfo) {
   2194          *pInfoSize = sizeof(VkShaderStatisticsInfoAMD);
   2195       } else {
   2196          unsigned lds_multiplier = device->physical_device->rad_info.lds_encode_granularity;
   2197          struct ac_shader_config *conf = &variant->config;
   2198 
   2199          VkShaderStatisticsInfoAMD statistics = {0};
   2200          statistics.shaderStageMask = shaderStage;
   2201          statistics.numPhysicalVgprs =
   2202             device->physical_device->rad_info.num_physical_wave64_vgprs_per_simd;
   2203          statistics.numPhysicalSgprs =
   2204             device->physical_device->rad_info.num_physical_sgprs_per_simd;
   2205          statistics.numAvailableSgprs = statistics.numPhysicalSgprs;
   2206 
   2207          if (stage == MESA_SHADER_COMPUTE) {
   2208             unsigned *local_size = variant->info.cs.block_size;
   2209             unsigned workgroup_size = pipeline->shaders[MESA_SHADER_COMPUTE]->info.workgroup_size;
   2210 
   2211             statistics.numAvailableVgprs =
   2212                statistics.numPhysicalVgprs /
   2213                ceil((double)workgroup_size / statistics.numPhysicalVgprs);
   2214 
   2215             statistics.computeWorkGroupSize[0] = local_size[0];
   2216             statistics.computeWorkGroupSize[1] = local_size[1];
   2217             statistics.computeWorkGroupSize[2] = local_size[2];
   2218          } else {
   2219             statistics.numAvailableVgprs = statistics.numPhysicalVgprs;
   2220          }
   2221 
   2222          statistics.resourceUsage.numUsedVgprs = conf->num_vgprs;
   2223          statistics.resourceUsage.numUsedSgprs = conf->num_sgprs;
   2224          statistics.resourceUsage.ldsSizePerLocalWorkGroup = 32768;
   2225          statistics.resourceUsage.ldsUsageSizeInBytes = conf->lds_size * lds_multiplier;
   2226          statistics.resourceUsage.scratchMemUsageInBytes = conf->scratch_bytes_per_wave;
   2227 
   2228          size_t size = *pInfoSize;
   2229          *pInfoSize = sizeof(statistics);
   2230 
   2231          memcpy(pInfo, &statistics, MIN2(size, *pInfoSize));
   2232 
   2233          if (size < *pInfoSize)
   2234             result = VK_INCOMPLETE;
   2235       }
   2236 
   2237       break;
   2238    case VK_SHADER_INFO_TYPE_DISASSEMBLY_AMD: {
   2239       char *out;
   2240       size_t outsize;
   2241       struct u_memstream mem;
   2242       u_memstream_open(&mem, &out, &outsize);
   2243       FILE *const memf = u_memstream_get(&mem);
   2244 
   2245       fprintf(memf, "%s:\n", radv_get_shader_name(&variant->info, stage));
   2246       fprintf(memf, "%s\n\n", variant->ir_string);
   2247       if (variant->disasm_string) {
   2248          fprintf(memf, "%s\n\n", variant->disasm_string);
   2249       }
   2250       radv_dump_shader_stats(device, pipeline, stage, memf);
   2251       u_memstream_close(&mem);
   2252 
   2253       /* Need to include the null terminator. */
   2254       size_t length = outsize + 1;
   2255 
   2256       if (!pInfo) {
   2257          *pInfoSize = length;
   2258       } else {
   2259          size_t size = *pInfoSize;
   2260          *pInfoSize = length;
   2261 
   2262          memcpy(pInfo, out, MIN2(size, length));
   2263 
   2264          if (size < length)
   2265             result = VK_INCOMPLETE;
   2266       }
   2267 
   2268       free(out);
   2269       break;
   2270    }
   2271    default:
   2272       /* VK_SHADER_INFO_TYPE_BINARY_AMD unimplemented for now. */
   2273       result = VK_ERROR_FEATURE_NOT_PRESENT;
   2274       break;
   2275    }
   2276 
   2277    return result;
   2278 }
   2279 
   2280 VkResult
   2281 radv_dump_shader_stats(struct radv_device *device, struct radv_pipeline *pipeline,
   2282                        gl_shader_stage stage, FILE *output)
   2283 {
   2284    struct radv_shader_variant *shader = pipeline->shaders[stage];
   2285    VkPipelineExecutablePropertiesKHR *props = NULL;
   2286    uint32_t prop_count = 0;
   2287    VkResult result;
   2288 
   2289    VkPipelineInfoKHR pipeline_info = {0};
   2290    pipeline_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR;
   2291    pipeline_info.pipeline = radv_pipeline_to_handle(pipeline);
   2292 
   2293    result = radv_GetPipelineExecutablePropertiesKHR(radv_device_to_handle(device), &pipeline_info,
   2294                                                     &prop_count, NULL);
   2295    if (result != VK_SUCCESS)
   2296       return result;
   2297 
   2298    props = calloc(prop_count, sizeof(*props));
   2299    if (!props)
   2300       return VK_ERROR_OUT_OF_HOST_MEMORY;
   2301 
   2302    result = radv_GetPipelineExecutablePropertiesKHR(radv_device_to_handle(device), &pipeline_info,
   2303                                                     &prop_count, props);
   2304    if (result != VK_SUCCESS)
   2305       goto fail;
   2306 
   2307    for (unsigned exec_idx = 0; exec_idx < prop_count; exec_idx++) {
   2308       if (!(props[exec_idx].stages & mesa_to_vk_shader_stage(stage)))
   2309          continue;
   2310 
   2311       VkPipelineExecutableStatisticKHR *stats = NULL;
   2312       uint32_t stat_count = 0;
   2313 
   2314       VkPipelineExecutableInfoKHR exec_info = {0};
   2315       exec_info.pipeline = radv_pipeline_to_handle(pipeline);
   2316       exec_info.executableIndex = exec_idx;
   2317 
   2318       result = radv_GetPipelineExecutableStatisticsKHR(radv_device_to_handle(device), &exec_info,
   2319                                                        &stat_count, NULL);
   2320       if (result != VK_SUCCESS)
   2321          goto fail;
   2322 
   2323       stats = calloc(stat_count, sizeof(*stats));
   2324       if (!stats) {
   2325          result = VK_ERROR_OUT_OF_HOST_MEMORY;
   2326          goto fail;
   2327       }
   2328 
   2329       result = radv_GetPipelineExecutableStatisticsKHR(radv_device_to_handle(device), &exec_info,
   2330                                                        &stat_count, stats);
   2331       if (result != VK_SUCCESS) {
   2332          free(stats);
   2333          goto fail;
   2334       }
   2335 
   2336       fprintf(output, "\n%s:\n", radv_get_shader_name(&shader->info, stage));
   2337       fprintf(output, "*** SHADER STATS ***\n");
   2338 
   2339       for (unsigned i = 0; i < stat_count; i++) {
   2340          fprintf(output, "%s: ", stats[i].name);
   2341          switch (stats[i].format) {
   2342          case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_BOOL32_KHR:
   2343             fprintf(output, "%s", stats[i].value.b32 == VK_TRUE ? "true" : "false");
   2344             break;
   2345          case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_INT64_KHR:
   2346             fprintf(output, "%" PRIi64, stats[i].value.i64);
   2347             break;
   2348          case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_UINT64_KHR:
   2349             fprintf(output, "%" PRIu64, stats[i].value.u64);
   2350             break;
   2351          case VK_PIPELINE_EXECUTABLE_STATISTIC_FORMAT_FLOAT64_KHR:
   2352             fprintf(output, "%f", stats[i].value.f64);
   2353             break;
   2354          default:
   2355             unreachable("Invalid pipeline statistic format");
   2356          }
   2357          fprintf(output, "\n");
   2358       }
   2359 
   2360       fprintf(output, "********************\n\n\n");
   2361 
   2362       free(stats);
   2363    }
   2364 
   2365 fail:
   2366    free(props);
   2367    return result;
   2368 }
   2369