radv: dump SPIRV when a GPU hang is detected
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Fri, 22 Sep 2017 14:56:40 +0000 (16:56 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Wed, 4 Oct 2017 17:37:08 +0000 (19:37 +0200)
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_debug.c
src/amd/vulkan/radv_debug.h
src/amd/vulkan/radv_shader.c
src/amd/vulkan/radv_shader.h

index 08ee54c97657f6d497849f893b64c373f722a878..cb9509117eb712b280ab0693cbe68f6994b014d0 100644 (file)
@@ -497,6 +497,11 @@ radv_dump_shader(struct radv_pipeline *pipeline,
 
        fprintf(f, "%s:\n\n", radv_get_shader_name(shader, stage));
 
+       if (shader->spirv) {
+               fprintf(f, "SPIRV:\n");
+               radv_print_spirv(shader->spirv, shader->spirv_size, f);
+       }
+
        if (shader->nir) {
                fprintf(f, "NIR:\n");
                nir_print_shader(shader->nir, f);
@@ -700,7 +705,7 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs)
 }
 
 void
-radv_print_spirv(struct radv_shader_module *module, FILE *fp)
+radv_print_spirv(uint32_t *data, uint32_t size, FILE *fp)
 {
        char path[] = "/tmp/fileXXXXXX";
        char line[2048], command[128];
@@ -712,7 +717,7 @@ radv_print_spirv(struct radv_shader_module *module, FILE *fp)
        if (fd < 0)
                return;
 
-       if (write(fd, module->data, module->size) == -1)
+       if (write(fd, data, size) == -1)
                goto fail;
 
        sprintf(command, "spirv-dis %s", path);
index 5c9cbade47c7d59b9a9ca764f8512d93750b7573..193bca5f81b518e304e93d2543ab89a4cc626a36 100644 (file)
@@ -55,6 +55,6 @@ void
 radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs);
 
 void
-radv_print_spirv(struct radv_shader_module *module, FILE *fp);
+radv_print_spirv(uint32_t *data, uint32_t size, FILE *fp);
 
 #endif
index 349e291b06a21726eef6bb2265e3ccc1641011d0..285f42e937720dca1fa2b6eb694f393ee1ac1361 100644 (file)
@@ -175,7 +175,7 @@ radv_shader_compile_to_nir(struct radv_device *device,
                assert(module->size % 4 == 0);
 
                if (device->debug_flags & RADV_DEBUG_DUMP_SPIRV)
-                       radv_print_spirv(module, stderr);
+                       radv_print_spirv(spirv, module->size, stderr);
 
                uint32_t num_spec_entries = 0;
                struct nir_spirv_specialization *spec_entries = NULL;
@@ -433,6 +433,8 @@ shader_variant_create(struct radv_device *device,
                variant->disasm_string = binary.disasm_string;
                if (!gs_copy_shader && !module->nir) {
                        variant->nir = shader;
+                       variant->spirv = (uint32_t *)module->data;
+                       variant->spirv_size = module->size;
                }
        } else {
                free(binary.disasm_string);
index 7ad38bf5792739e59625d50fb79fd2338214e470..1ef13968f97401070f1e409500206085ea66093a 100644 (file)
@@ -51,6 +51,8 @@ struct radv_shader_variant {
        unsigned rsrc2;
 
        /* debug only */
+       uint32_t *spirv;
+       uint32_t spirv_size;
        struct nir_shader *nir;
        char *disasm_string;