summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/amd/vulkan/radv_debug.c26
-rw-r--r--src/amd/vulkan/radv_debug.h2
-rw-r--r--src/amd/vulkan/radv_device.c11
3 files changed, 27 insertions, 12 deletions
diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index 9913c06ec23..4024f75da88 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -47,7 +47,7 @@ radv_init_trace(struct radv_device *device)
return true;
}
-void
+static void
radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs)
{
const char *filename = getenv("RADV_TRACE_FILE");
@@ -63,6 +63,30 @@ radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs)
fclose(f);
}
+static bool
+radv_gpu_hang_occured(struct radv_queue *queue)
+{
+ struct radeon_winsys *ws = queue->device->ws;
+ enum ring_type ring;
+
+ ring = radv_queue_family_to_ring(queue->queue_family_index);
+
+ if (!ws->ctx_wait_idle(queue->hw_ctx, ring, queue->queue_idx))
+ return true;
+
+ return false;
+}
+
+void
+radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs)
+{
+ if (!radv_gpu_hang_occured(queue))
+ return;
+
+ radv_dump_trace(queue->device, cs);
+ abort();
+}
+
void
radv_print_spirv(struct radv_shader_module *module, FILE *fp)
{
diff --git a/src/amd/vulkan/radv_debug.h b/src/amd/vulkan/radv_debug.h
index c5e83347279..0ac1f13c68a 100644
--- a/src/amd/vulkan/radv_debug.h
+++ b/src/amd/vulkan/radv_debug.h
@@ -49,7 +49,7 @@ bool
radv_init_trace(struct radv_device *device);
void
-radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs);
+radv_check_gpu_hangs(struct radv_queue *queue, struct radeon_winsys_cs *cs);
void
radv_print_spirv(struct radv_shader_module *module, FILE *fp);
diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index cbba04a5d6f..a5898691df6 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -2129,16 +2129,7 @@ VkResult radv_QueueSubmit(
}
fence_emitted = true;
if (queue->device->trace_bo) {
- bool success = queue->device->ws->ctx_wait_idle(
- queue->hw_ctx,
- radv_queue_family_to_ring(
- queue->queue_family_index),
- queue->queue_idx);
-
- if (!success) { /* Hang */
- radv_dump_trace(queue->device, cs_array[j]);
- abort();
- }
+ radv_check_gpu_hangs(queue, cs_array[j]);
}
}