radv: add radv_check_gpu_hangs() helper function

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:
Samuel Pitoiset
2017-09-01 09:44:45 +02:00
parent f14020c15f
commit 72d9ffc72c
3 changed files with 27 additions and 12 deletions

View File

@@ -47,7 +47,7 @@ radv_init_trace(struct radv_device *device)
return true; return true;
} }
void static void
radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs) radv_dump_trace(struct radv_device *device, struct radeon_winsys_cs *cs)
{ {
const char *filename = getenv("RADV_TRACE_FILE"); 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); 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 void
radv_print_spirv(struct radv_shader_module *module, FILE *fp) radv_print_spirv(struct radv_shader_module *module, FILE *fp)
{ {

View File

@@ -49,7 +49,7 @@ bool
radv_init_trace(struct radv_device *device); radv_init_trace(struct radv_device *device);
void 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 void
radv_print_spirv(struct radv_shader_module *module, FILE *fp); radv_print_spirv(struct radv_shader_module *module, FILE *fp);

View File

@@ -2129,16 +2129,7 @@ VkResult radv_QueueSubmit(
} }
fence_emitted = true; fence_emitted = true;
if (queue->device->trace_bo) { if (queue->device->trace_bo) {
bool success = queue->device->ws->ctx_wait_idle( radv_check_gpu_hangs(queue, cs_array[j]);
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();
}
} }
} }