radv: report correct backend IR in hang reports when ACO is used
[mesa.git] / src / amd / vulkan / radv_debug.c
index ce48079456061ec634b772331c3ed67f6669a817..77a136f94a12d5a8312697c08b280c7d0d972395 100644 (file)
@@ -62,7 +62,8 @@ radv_init_trace(struct radv_device *device)
        device->trace_bo = ws->buffer_create(ws, TRACE_BO_SIZE, 8,
                                             RADEON_DOMAIN_VRAM,
                                             RADEON_FLAG_CPU_ACCESS|
-                                            RADEON_FLAG_NO_INTERPROCESS_SHARING,
+                                            RADEON_FLAG_NO_INTERPROCESS_SHARING |
+                                            RADEON_FLAG_ZERO_VRAM,
                                             RADV_BO_PRIORITY_UPLOAD_BUFFER);
        if (!device->trace_bo)
                return false;
@@ -71,8 +72,6 @@ radv_init_trace(struct radv_device *device)
        if (!device->trace_id_ptr)
                return false;
 
-       memset(device->trace_id_ptr, 0, TRACE_BO_SIZE);
-
        ac_vm_fault_occured(device->physical_device->rad_info.chip_class,
                            &device->dmesg_timestamp, NULL);
 
@@ -193,9 +192,10 @@ radv_dump_combined_image_sampler_descriptor(enum chip_class chip_class,
 }
 
 static void
-radv_dump_descriptor_set(enum chip_class chip_class,
+radv_dump_descriptor_set(struct radv_device *device,
                         struct radv_descriptor_set *set, unsigned id, FILE *f)
 {
+       enum chip_class chip_class = device->physical_device->rad_info.chip_class;
        const struct radv_descriptor_set_layout *layout;
        int i;
 
@@ -239,19 +239,17 @@ radv_dump_descriptor_set(enum chip_class chip_class,
 }
 
 static void
-radv_dump_descriptors(struct radv_pipeline *pipeline, FILE *f)
+radv_dump_descriptors(struct radv_device *device, FILE *f)
 {
-       struct radv_device *device = pipeline->device;
-       enum chip_class chip_class = device->physical_device->rad_info.chip_class;
        uint64_t *ptr = (uint64_t *)device->trace_id_ptr;
        int i;
 
        fprintf(f, "Descriptors:\n");
        for (i = 0; i < MAX_SETS; i++) {
                struct radv_descriptor_set *set =
-                       (struct radv_descriptor_set *)ptr[i + 3];
+                       *(struct radv_descriptor_set **)(ptr + i + 3);
 
-               radv_dump_descriptor_set(chip_class, set, i, f);
+               radv_dump_descriptor_set(device, set, i, f);
        }
 }
 
@@ -434,7 +432,9 @@ radv_dump_shader(struct radv_pipeline *pipeline,
                fprintf(f, "NIR:\n%s\n", shader->nir_string);
        }
 
-       fprintf(f, "LLVM IR:\n%s\n", shader->ir_string);
+       fprintf(f, "%s IR:\n%s\n",
+               pipeline->device->physical_device->use_aco ? "ACO" : "LLVM",
+               shader->ir_string);
        fprintf(f, "DISASM:\n%s\n", shader->disasm_string);
 
        radv_shader_dump_stats(pipeline->device, shader, stage, f);
@@ -458,11 +458,11 @@ radv_dump_pipeline_state(struct radv_pipeline *pipeline,
 {
        radv_dump_shaders(pipeline, active_stages, f);
        radv_dump_annotated_shaders(pipeline, active_stages, f);
-       radv_dump_descriptors(pipeline, f);
 }
 
 static void
-radv_dump_graphics_state(struct radv_pipeline *graphics_pipeline,
+radv_dump_graphics_state(struct radv_device *device,
+                        struct radv_pipeline *graphics_pipeline,
                         struct radv_pipeline *compute_pipeline, FILE *f)
 {
        VkShaderStageFlagBits active_stages;
@@ -476,10 +476,13 @@ radv_dump_graphics_state(struct radv_pipeline *graphics_pipeline,
                active_stages = VK_SHADER_STAGE_COMPUTE_BIT;
                radv_dump_pipeline_state(compute_pipeline, active_stages, f);
        }
+
+       radv_dump_descriptors(device, f);
 }
 
 static void
-radv_dump_compute_state(struct radv_pipeline *compute_pipeline, FILE *f)
+radv_dump_compute_state(struct radv_device *device,
+                       struct radv_pipeline *compute_pipeline, FILE *f)
 {
        VkShaderStageFlagBits active_stages = VK_SHADER_STAGE_COMPUTE_BIT;
 
@@ -487,6 +490,7 @@ radv_dump_compute_state(struct radv_pipeline *compute_pipeline, FILE *f)
                return;
 
        radv_dump_pipeline_state(compute_pipeline, active_stages, f);
+       radv_dump_descriptors(device, f);
 }
 
 static struct radv_pipeline *
@@ -494,7 +498,7 @@ radv_get_saved_graphics_pipeline(struct radv_device *device)
 {
        uint64_t *ptr = (uint64_t *)device->trace_id_ptr;
 
-       return (struct radv_pipeline *)ptr[1];
+       return *(struct radv_pipeline **)(ptr + 1);
 }
 
 static struct radv_pipeline *
@@ -502,7 +506,7 @@ radv_get_saved_compute_pipeline(struct radv_device *device)
 {
        uint64_t *ptr = (uint64_t *)device->trace_id_ptr;
 
-       return (struct radv_pipeline *)ptr[2];
+       return *(struct radv_pipeline **)(ptr + 2);
 }
 
 static void
@@ -565,8 +569,7 @@ radv_dump_device_name(struct radv_device *device, FILE *f)
                snprintf(kernel_version, sizeof(kernel_version),
                         " / %s", uname_data.release);
 
-       fprintf(f, "Device name: %s (%s DRM %i.%i.%i%s, LLVM "
-               MESA_LLVM_VERSION_STRING ")\n\n",
+       fprintf(f, "Device name: %s (%s / DRM %i.%i.%i%s)\n\n",
                chip_name, device->physical_device->name,
                info->drm_major, info->drm_minor, info->drm_patchlevel,
                kernel_version);
@@ -622,12 +625,14 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_cmdbuf *cs)
        switch (ring) {
        case RING_GFX:
                fprintf(stderr, "RING_GFX:\n");
-               radv_dump_graphics_state(graphics_pipeline, compute_pipeline,
+               radv_dump_graphics_state(queue->device,
+                                        graphics_pipeline, compute_pipeline,
                                         stderr);
                break;
        case RING_COMPUTE:
                fprintf(stderr, "RING_COMPUTE:\n");
-               radv_dump_compute_state(compute_pipeline, stderr);
+               radv_dump_compute_state(queue->device,
+                                       compute_pipeline, stderr);
                break;
        default:
                assert(0);
@@ -638,7 +643,7 @@ radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_cmdbuf *cs)
 }
 
 void
-radv_print_spirv(uint32_t *data, uint32_t size, FILE *fp)
+radv_print_spirv(const char *data, uint32_t size, FILE *fp)
 {
        char path[] = "/tmp/fileXXXXXX";
        char line[2048], command[128];