diff --git a/src/xrt/auxiliary/vk/vk_helpers.c b/src/xrt/auxiliary/vk/vk_helpers.c index 5a975a3b9..aa71d852a 100644 --- a/src/xrt/auxiliary/vk/vk_helpers.c +++ b/src/xrt/auxiliary/vk/vk_helpers.c @@ -575,7 +575,11 @@ vk_init_cmd_buffer(struct vk_bundle *vk, VkCommandBuffer *out_cmd_buffer) VkCommandBufferBeginInfo begin_info = { .sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, }; + + os_mutex_lock(&vk->cmd_pool_mutex); ret = vk->vkBeginCommandBuffer(cmd_buffer, &begin_info); + os_mutex_unlock(&vk->cmd_pool_mutex); + if (ret != VK_SUCCESS) { VK_ERROR(vk, "vkBeginCommandBuffer: %s", vk_result_string(ret)); goto err_buffer; @@ -636,7 +640,9 @@ vk_submit_cmd_buffer(struct vk_bundle *vk, VkCommandBuffer cmd_buffer) }; // Finish the command buffer first. + os_mutex_lock(&vk->cmd_pool_mutex); ret = vk->vkEndCommandBuffer(cmd_buffer); + os_mutex_unlock(&vk->cmd_pool_mutex); if (ret != VK_SUCCESS) { VK_ERROR(vk, "vkEndCommandBuffer: %s", vk_result_string(ret)); goto out; @@ -650,9 +656,7 @@ vk_submit_cmd_buffer(struct vk_bundle *vk, VkCommandBuffer cmd_buffer) } // Do the actual submitting. - os_mutex_lock(&vk->queue_mutex); - ret = vk->vkQueueSubmit(vk->queue, 1, &submitInfo, fence); - os_mutex_unlock(&vk->queue_mutex); + ret = vk_locked_submit(vk, vk->queue, 1, &submitInfo, fence); if (ret != VK_SUCCESS) { VK_ERROR(vk, "Error: Could not submit to queue.\n"); goto out_fence; @@ -1499,3 +1503,19 @@ vk_update_buffer(struct vk_bundle *vk, return true; } + +VkResult +vk_locked_submit(struct vk_bundle *vk, + VkQueue queue, + uint32_t count, + const VkSubmitInfo *infos, + VkFence fence) +{ + VkResult ret; + os_mutex_lock(&vk->queue_mutex); + os_mutex_lock(&vk->cmd_pool_mutex); + ret = vk->vkQueueSubmit(queue, count, infos, fence); + os_mutex_unlock(&vk->cmd_pool_mutex); + os_mutex_unlock(&vk->queue_mutex); + return ret; +} diff --git a/src/xrt/auxiliary/vk/vk_helpers.h b/src/xrt/auxiliary/vk/vk_helpers.h index dfa30f76c..94c00856a 100644 --- a/src/xrt/auxiliary/vk/vk_helpers.h +++ b/src/xrt/auxiliary/vk/vk_helpers.h @@ -499,6 +499,13 @@ vk_update_buffer(struct vk_bundle *vk, size_t buffer_size, VkDeviceMemory memory); +VkResult +vk_locked_submit(struct vk_bundle *vk, + VkQueue queue, + uint32_t count, + const VkSubmitInfo *infos, + VkFence fence); + #ifdef __cplusplus } #endif diff --git a/src/xrt/compositor/client/comp_vk_client.c b/src/xrt/compositor/client/comp_vk_client.c index 182d7a3a1..638362456 100644 --- a/src/xrt/compositor/client/comp_vk_client.c +++ b/src/xrt/compositor/client/comp_vk_client.c @@ -90,10 +90,8 @@ client_vk_swapchain_acquire_image(struct xrt_swapchain *xsc, .pCommandBuffers = &sc->acquire[*out_index], }; - os_mutex_lock(&vk->queue_mutex); VkResult ret = - vk->vkQueueSubmit(vk->queue, 1, &submitInfo, VK_NULL_HANDLE); - os_mutex_unlock(&vk->queue_mutex); + vk_locked_submit(vk, vk->queue, 1, &submitInfo, VK_NULL_HANDLE); if (ret != VK_SUCCESS) { VK_ERROR(vk, "Could not submit to queue: %d", ret); return XRT_ERROR_FAILED_TO_SUBMIT_VULKAN_COMMANDS; @@ -125,10 +123,8 @@ client_vk_swapchain_release_image(struct xrt_swapchain *xsc, uint32_t index) .pCommandBuffers = &sc->release[index], }; - os_mutex_lock(&vk->queue_mutex); VkResult ret = - vk->vkQueueSubmit(vk->queue, 1, &submitInfo, VK_NULL_HANDLE); - os_mutex_unlock(&vk->queue_mutex); + vk_locked_submit(vk, vk->queue, 1, &submitInfo, VK_NULL_HANDLE); if (ret != VK_SUCCESS) { VK_ERROR(vk, "Could not submit to queue: %d", ret); return XRT_ERROR_FAILED_TO_SUBMIT_VULKAN_COMMANDS; diff --git a/src/xrt/compositor/main/comp_layer_renderer.c b/src/xrt/compositor/main/comp_layer_renderer.c index 519b5c185..37df99257 100644 --- a/src/xrt/compositor/main/comp_layer_renderer.c +++ b/src/xrt/compositor/main/comp_layer_renderer.c @@ -662,7 +662,9 @@ comp_layer_renderer_draw(struct comp_layer_renderer *self) if (vk_init_cmd_buffer(vk, &cmd_buffer) != VK_SUCCESS) return; + os_mutex_lock(&vk->cmd_pool_mutex); _render_stereo(self, vk, cmd_buffer); + os_mutex_unlock(&vk->cmd_pool_mutex); VkResult res = vk_submit_cmd_buffer(vk, cmd_buffer); vk_check_error("vk_submit_cmd_buffer", res, ); diff --git a/src/xrt/compositor/main/comp_renderer.c b/src/xrt/compositor/main/comp_renderer.c index 5289aed94..cee19ef19 100644 --- a/src/xrt/compositor/main/comp_renderer.c +++ b/src/xrt/compositor/main/comp_renderer.c @@ -173,10 +173,8 @@ renderer_submit_queue(struct comp_renderer *r) .pSignalSemaphores = &r->semaphores.render_complete, }; - os_mutex_lock(&vk->queue_mutex); - ret = vk->vkQueueSubmit(r->queue, 1, &comp_submit_info, - r->fences[r->current_buffer]); - os_mutex_unlock(&vk->queue_mutex); + ret = vk_locked_submit(vk, r->queue, 1, &comp_submit_info, + r->fences[r->current_buffer]); if (ret != VK_SUCCESS) { COMP_ERROR(r->c, "vkQueueSubmit: %s", vk_result_string(ret)); }