From c84fcc2aaed01f3ba2609e141d4abc82f5516ca9 Mon Sep 17 00:00:00 2001 From: Benson Joeris Date: Mon, 11 Nov 2019 11:33:00 -0500 Subject: [PATCH] Add last present queue and semaphores to swapchain info This is used for queue family tracking of presented images. Change-Id: I64ac88a8e4b379bd947f56f5cf2c1db929e8c620 --- renderdoc/driver/vulkan/vk_core.cpp | 10 +++++++--- renderdoc/driver/vulkan/vk_resources.h | 9 ++++++++- renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp | 15 ++++++++++++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 8b458878a..625bba39b 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1711,6 +1711,7 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) RDCLOG("Finished capture, Frame %u", m_CapturedFrames.back().frameNumber); VkImage backbuffer = VK_NULL_HANDLE; + const PresentInfo *presentInfo = NULL; VkResourceRecord *swaprecord = NULL; if(swap != VK_NULL_HANDLE) @@ -1722,7 +1723,8 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) const SwapchainInfo &swapInfo = *swaprecord->swapInfo; - backbuffer = swapInfo.images[swapInfo.lastPresent].im; + presentInfo = &swapInfo.lastPresent; + backbuffer = swapInfo.images[presentInfo->imageIndex].im; // mark all images referenced as well for(size_t i = 0; i < swapInfo.images.size(); i++) @@ -1741,7 +1743,8 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) const SwapchainInfo &swapInfo = *swaprecord->swapInfo; - backbuffer = swapInfo.images[swapInfo.lastPresent].im; + presentInfo = &swapInfo.lastPresent; + backbuffer = swapInfo.images[presentInfo->imageIndex].im; // mark all images referenced as well for(size_t i = 0; i < swapInfo.images.size(); i++) @@ -1833,7 +1836,8 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) {swapInfo.imageInfo.extent.width, swapInfo.imageInfo.extent.height, 1}, }; - uint32_t swapQueueIndex = m_ImageLayouts[GetResID(backbuffer)].queueFamilyIndex; + VkResourceRecord *queueRecord = GetRecord(swapInfo.lastPresent.presentQueue); + uint32_t swapQueueIndex = queueRecord->queueFamilyIndex; VkImageMemoryBarrier bbBarrier = { VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index 42ce00bc8..665026142 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -929,6 +929,13 @@ struct ImageInfo DECLARE_REFLECTION_STRUCT(ImageInfo); +struct PresentInfo +{ + VkQueue presentQueue; + rdcarray waitSemaphores; + uint32_t imageIndex; +}; + struct SwapchainInfo { ImageInfo imageInfo; @@ -947,7 +954,7 @@ struct SwapchainInfo VkFramebuffer fb; }; rdcarray images; - uint32_t lastPresent; + PresentInfo lastPresent; }; // these structs are allocated for images and buffers, then pointed to (non-owning) by views diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index 1d6673fa3..1eac8fc5b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -553,7 +553,10 @@ void WrappedVulkan::WrapAndProcessCreatedSwapchain(VkDevice device, vkr = vt->GetSwapchainImagesKHR(Unwrap(device), Unwrap(*pSwapChain), &numSwapImages, NULL); RDCASSERTEQUAL(vkr, VK_SUCCESS); - swapInfo.lastPresent = 0; + swapInfo.lastPresent.imageIndex = 0; + swapInfo.lastPresent.presentQueue = VK_NULL_HANDLE; + swapInfo.lastPresent.waitSemaphores.clear(); + swapInfo.images.resize(numSwapImages); for(uint32_t i = 0; i < numSwapImages; i++) { @@ -758,7 +761,12 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR // need to record which image was last flipped so we can get the correct backbuffer // for a thumbnail in EndFrameCapture - swapInfo.lastPresent = pPresentInfo->pImageIndices[0]; + swapInfo.lastPresent.imageIndex = pPresentInfo->pImageIndices[0]; + swapInfo.lastPresent.presentQueue = queue; + swapInfo.lastPresent.waitSemaphores.resize(pPresentInfo->waitSemaphoreCount); + for(size_t i = 0; i < swapInfo.lastPresent.waitSemaphores.size(); ++i) + swapInfo.lastPresent.waitSemaphores[i] = pPresentInfo->pWaitSemaphores[i]; + m_LastSwap = swaprecord->GetResourceID(); if(IsBackgroundCapturing(m_State)) @@ -774,7 +782,8 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR VkImage im = swapInfo.images[pPresentInfo->pImageIndices[0]].im; VkFramebuffer fb = swapInfo.images[pPresentInfo->pImageIndices[0]].fb; - uint32_t swapQueueIndex = m_ImageLayouts[GetResID(im)].queueFamilyIndex; + VkResourceRecord *queueRecord = GetRecord(queue); + uint32_t swapQueueIndex = queueRecord->queueFamilyIndex; VkDevDispatchTable *vt = ObjDisp(GetDev());