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

Reply via email to