From 30ece375e1b2dff9707cf9583719501a146e9608 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 2 Oct 2018 19:00:53 +0100 Subject: [PATCH] Submit wait semaphores when rendering vulkan overlay. Closes #1110 --- renderdoc/driver/vulkan/vk_core.cpp | 9 +++++---- renderdoc/driver/vulkan/vk_core.h | 3 ++- renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp | 8 +++++++- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index fd92e2012..e976b6227 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -234,7 +234,8 @@ VkCommandBuffer WrappedVulkan::GetNextCmd() return ret; } -void WrappedVulkan::SubmitCmds() +void WrappedVulkan::SubmitCmds(VkSemaphore *unwrappedWaitSemaphores, + VkPipelineStageFlags *waitStageMask, uint32_t waitSemaphoreCount) { // nothing to do if(m_InternalCmds.pendingcmds.empty()) @@ -247,9 +248,9 @@ void WrappedVulkan::SubmitCmds() VkSubmitInfo submitInfo = { VK_STRUCTURE_TYPE_SUBMIT_INFO, NULL, - 0, - NULL, - NULL, // wait semaphores + waitSemaphoreCount, + unwrappedWaitSemaphores, + waitStageMask, (uint32_t)cmds.size(), &cmds[0], // command buffers 0, diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 9859707bc..18ef15616 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -878,7 +878,8 @@ public: return m_PhysicalDevice; } VkCommandBuffer GetNextCmd(); - void SubmitCmds(); + void SubmitCmds(VkSemaphore *unwrappedWaitSemaphores = NULL, + VkPipelineStageFlags *waitStageMask = NULL, uint32_t waitSemaphoreCount = 0); VkSemaphore GetNextSemaphore(); void SubmitSemaphores(); void FlushQ(); diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index fabee5584..d74edfc10 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -660,6 +660,7 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR } RDCASSERT(pPresentInfo->pNext == NULL); + // TODO support multiple swapchains here VkResourceRecord *swaprecord = GetRecord(pPresentInfo->pSwapchains[0]); RDCASSERT(swaprecord->swapInfo); @@ -678,6 +679,9 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR if(overlay & eRENDERDOC_Overlay_Enabled) { + // we'll do the wait ourselves before rendering the overlay + unwrappedInfo.waitSemaphoreCount = 0; + VkRenderPass rp = swapInfo.rp; VkImage im = swapInfo.images[pPresentInfo->pImageIndices[0]].im; VkFramebuffer fb = swapInfo.images[pPresentInfo->pImageIndices[0]].fb; @@ -752,7 +756,9 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR ObjDisp(textstate.cmd)->EndCommandBuffer(Unwrap(textstate.cmd)); - SubmitCmds(); + std::vector waitStage(unwrappedSems.size(), + VK_PIPELINE_STAGE_ALL_COMMANDS_BIT); + SubmitCmds(unwrappedSems.data(), waitStage.data(), (uint32_t)unwrappedSems.size()); if(swapQueueIndex != m_QueueFamilyIdx) {