diff options
Diffstat (limited to 'src/amd/vulkan/radv_debug.c')
-rw-r--r-- | src/amd/vulkan/radv_debug.c | 26 |
1 files changed, 25 insertions, 1 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) { |