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:
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -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);
|
||||||
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user