Module: Mesa Branch: main Commit: 379fab74d2135abb9ada7edec83da983ba0c4257 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=379fab74d2135abb9ada7edec83da983ba0c4257
Author: Samuel Pitoiset <[email protected]> Date: Fri Nov 5 20:18:42 2021 +0100 radv/sqtt: fix GPU hangs when capturing from the compute queue S_008D20_FINISH_DONE is a mask of queues and 1 means "wait on the gfx queue until the value is not 0" which can never happen when the driver captures from compute. Instead, use the full mask of possible queues. Cc: 21.3 mesa-stable Signed-off-by: Samuel Pitoiset <[email protected]> Reviewed-by: Bas Nieuwenhuizen <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13694> --- src/amd/vulkan/layers/radv_sqtt_layer.c | 9 --------- src/amd/vulkan/radv_sqtt.c | 6 +++--- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/amd/vulkan/layers/radv_sqtt_layer.c b/src/amd/vulkan/layers/radv_sqtt_layer.c index 05ea8b831f8..2b9623a811f 100644 --- a/src/amd/vulkan/layers/radv_sqtt_layer.c +++ b/src/amd/vulkan/layers/radv_sqtt_layer.c @@ -389,15 +389,6 @@ radv_handle_thread_trace(VkQueue _queue) #endif if (frame_trigger || file_trigger || resize_trigger) { - /* FIXME: SQTT on compute hangs. */ - if (queue->vk.queue_family_index == RADV_QUEUE_COMPUTE) { - fprintf(stderr, "RADV: Capturing a SQTT trace on the compute " - "queue is currently broken and might hang! " - "Please, disable presenting on compute if " - "you can.\n"); - return; - } - radv_begin_thread_trace(queue); assert(!thread_trace_enabled); thread_trace_enabled = true; diff --git a/src/amd/vulkan/radv_sqtt.c b/src/amd/vulkan/radv_sqtt.c index 7acd904baaa..f7a996f500c 100644 --- a/src/amd/vulkan/radv_sqtt.c +++ b/src/amd/vulkan/radv_sqtt.c @@ -269,7 +269,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */ radeon_emit(cs, 0); radeon_emit(cs, 0); /* reference value */ - radeon_emit(cs, S_008D20_FINISH_DONE(1)); /* mask */ + radeon_emit(cs, ~C_008D20_FINISH_DONE); radeon_emit(cs, 4); /* poll interval */ /* Disable the thread trace mode. */ @@ -283,7 +283,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs radeon_emit(cs, R_008D20_SQ_THREAD_TRACE_STATUS >> 2); /* register */ radeon_emit(cs, 0); radeon_emit(cs, 0); /* reference value */ - radeon_emit(cs, S_008D20_BUSY(1)); /* mask */ + radeon_emit(cs, ~C_008D20_BUSY); /* mask */ radeon_emit(cs, 4); /* poll interval */ } else { /* Disable the thread trace mode. */ @@ -296,7 +296,7 @@ radv_emit_thread_trace_stop(struct radv_device *device, struct radeon_cmdbuf *cs radeon_emit(cs, R_030CE8_SQ_THREAD_TRACE_STATUS >> 2); /* register */ radeon_emit(cs, 0); radeon_emit(cs, 0); /* reference value */ - radeon_emit(cs, S_030CE8_BUSY(1)); /* mask */ + radeon_emit(cs, ~C_030CE8_BUSY); /* mask */ radeon_emit(cs, 4); /* poll interval */ }
