This will allow to dump the active shaders when a hang is detected. Only the ASM will be dumped for now.
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com> --- src/amd/vulkan/radv_shader.c | 27 ++++++++++++++------------- src/amd/vulkan/radv_shader.h | 1 + 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index de7d9a2752..44a1f64737 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -326,10 +326,10 @@ radv_destroy_shader_slabs(struct radv_device *device) static void radv_fill_shader_variant(struct radv_device *device, struct radv_shader_variant *variant, - struct ac_shader_binary *binary, gl_shader_stage stage) { bool scratch_enabled = variant->config.scratch_bytes_per_wave > 0; + struct ac_shader_binary *binary = &variant->binary; unsigned vgpr_comp_cnt = 0; if (scratch_enabled && !device->llvm_supports_spill) @@ -387,12 +387,13 @@ shader_variant_create(struct radv_device *device, bool dump_shaders = device->debug_flags & RADV_DEBUG_DUMP_SHADERS; enum ac_target_machine_options tm_options = 0; struct radv_shader_variant *variant; - struct ac_shader_binary binary; + struct ac_shader_binary *binary; LLVMTargetMachineRef tm; variant = calloc(1, sizeof(struct radv_shader_variant)); if (!variant) return NULL; + binary = &variant->binary; options->family = chip_family; options->chip_class = device->physical_device->rad_info.chip_class; @@ -404,28 +405,28 @@ shader_variant_create(struct radv_device *device, tm = ac_create_target_machine(chip_family, tm_options); if (gs_copy_shader) { - ac_create_gs_copy_shader(tm, shader, &binary, &variant->config, + ac_create_gs_copy_shader(tm, shader, binary, &variant->config, &variant->info, options, dump_shaders); } else { - ac_compile_nir_shader(tm, &binary, &variant->config, + ac_compile_nir_shader(tm, binary, &variant->config, &variant->info, shader, options, dump_shaders); } LLVMDisposeTargetMachine(tm); - radv_fill_shader_variant(device, variant, &binary, stage); + radv_fill_shader_variant(device, variant, stage); if (code_out) { - *code_out = binary.code; - *code_size_out = binary.code_size; + *code_out = binary->code; + *code_size_out = binary->code_size; } else - free(binary.code); - free(binary.config); - free(binary.rodata); - free(binary.global_symbol_offsets); - free(binary.relocs); - free(binary.disasm_string); + free(binary->code); + free(binary->config); + free(binary->rodata); + free(binary->global_symbol_offsets); + free(binary->relocs); + free(binary->disasm_string); variant->ref_count = 1; return variant; } diff --git a/src/amd/vulkan/radv_shader.h b/src/amd/vulkan/radv_shader.h index b0bf22eb76..aaf6e49e80 100644 --- a/src/amd/vulkan/radv_shader.h +++ b/src/amd/vulkan/radv_shader.h @@ -44,6 +44,7 @@ struct radv_shader_variant { struct radeon_winsys_bo *bo; uint64_t bo_offset; + struct ac_shader_binary binary; struct ac_shader_config config; struct ac_shader_variant_info info; unsigned rsrc1; -- 2.14.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev