From 8d5be0a2b3f1dfa212adb50d09f0ff622dcb0457 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen Date: Sun, 30 Jan 2022 01:52:55 +0100 Subject: [PATCH] radv: Add submit locking with trace bo. Otherwise cmdbuffers from different queues can override the trace id from each other, making for a very confusing hang report. Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/vulkan/radv_device.c | 10 ++++++++++ src/amd/vulkan/radv_private.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c index e3c21b9..4c16253 100644 --- a/src/amd/vulkan/radv_device.c +++ b/src/amd/vulkan/radv_device.c @@ -3038,6 +3038,7 @@ radv_CreateDevice(VkPhysicalDevice physicalDevice, const VkDeviceCreateInfo *pCr device->instance = physical_device->instance; device->physical_device = physical_device; + simple_mtx_init(&device->trace_mtx, mtx_plain); device->ws = physical_device->ws; device->vk.create_sync_for_memory = radv_create_sync_for_memory; @@ -3307,6 +3308,7 @@ fail: device->ws->ctx_destroy(device->hw_ctx[i]); } + simple_mtx_destroy(&device->trace_mtx); mtx_destroy(&device->overallocation_mutex); vk_device_finish(&device->vk); @@ -3346,6 +3348,7 @@ radv_DestroyDevice(VkDevice _device, const VkAllocationCallbacks *pAllocator) } mtx_destroy(&device->overallocation_mutex); + simple_mtx_destroy(&device->trace_mtx); radv_device_finish_meta(device); @@ -4370,6 +4373,9 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission) if (result != VK_SUCCESS) goto fail; } else { + if (queue->device->trace_bo) + simple_mtx_lock(&queue->device->trace_mtx); + struct radeon_cmdbuf **cs_array = malloc(sizeof(struct radeon_cmdbuf *) * (submission->command_buffer_count)); @@ -4401,6 +4407,8 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission) can_patch); if (result != VK_SUCCESS) { free(cs_array); + if (queue->device->trace_bo) + simple_mtx_unlock(&queue->device->trace_mtx); goto fail; } @@ -4414,6 +4422,8 @@ radv_queue_submit(struct vk_queue *vqueue, struct vk_queue_submit *submission) } free(cs_array); + if (queue->device->trace_bo) + simple_mtx_unlock(&queue->device->trace_mtx); } fail: diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h index ad8e2df..42b39e3 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -865,6 +865,8 @@ struct radv_device { struct radv_shader_prolog *simple_vs_prologs[MAX_VERTEX_ATTRIBS]; struct radv_shader_prolog *instance_rate_vs_prologs[816]; + + simple_mtx_t trace_mtx; }; struct radv_device_memory { -- 2.7.4