From a2c1ef8fd0a6ecd8ee924b8b99263df5313c2670 Mon Sep 17 00:00:00 2001 From: tuxerr Date: Mon, 19 Nov 2018 16:08:23 -0800 Subject: [PATCH] add support for VR end of frame markers in vulkan --- renderdoc/driver/vulkan/vk_core.cpp | 29 +++++++++++++++++++ renderdoc/driver/vulkan/vk_core.h | 5 ++++ renderdoc/driver/vulkan/vk_resources.h | 3 ++ .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 12 ++++++++ .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 9 ++++++ .../driver/vulkan/wrappers/vk_wsi_funcs.cpp | 25 ++-------------- 6 files changed, 60 insertions(+), 23 deletions(-) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index f59b545cf..aedc5c1d7 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1785,6 +1785,35 @@ bool WrappedVulkan::EndFrameCapture(void *dev, void *wnd) return true; } +void WrappedVulkan::AdvanceFrame() +{ + if(IsBackgroundCapturing(m_State)) + { + RenderDoc::Inst().Tick(); + GetResourceManager()->FlushPendingDirty(); + } + m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame +} + +void WrappedVulkan::Present(void *dev, void *wnd) +{ + bool activeWindow = wnd == NULL || RenderDoc::Inst().IsActiveWindow(dev, wnd); + + RenderDoc::Inst().AddActiveDriver(RDCDriver::Vulkan, true); + if(!activeWindow) + return; + + if(IsActiveCapturing(m_State) && !m_AppControlledCapture) + RenderDoc::Inst().EndFrameCapture(dev, wnd); + + if(RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter) && IsBackgroundCapturing(m_State)) + { + RenderDoc::Inst().StartFrameCapture(dev, wnd); + + m_AppControlledCapture = false; + } +} + void WrappedVulkan::AddResource(ResourceId id, ResourceType type, const char *defaultNamePrefix) { ResourceDescription &descr = GetReplay()->GetResourceDesc(id); diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index d1b29612e..ec98a05c4 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -770,6 +770,11 @@ private: void StartFrameCapture(void *dev, void *wnd); bool EndFrameCapture(void *dev, void *wnd); + void AdvanceFrame(); + void Present(void *dev, void *wnd); + + void HandleVRFrameMarkers(const char *marker, VkCommandBuffer commandBuffer); + template bool Serialise_SetShaderDebugPath(SerialiserType &ser, VkShaderModule ShaderObject, std::string DebugPath); diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index a4c7b2f2a..052f6a2c7 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -929,6 +929,9 @@ struct CmdBufferRecordingInfo set boundDescSets; vector subcmds; + + // AdvanceFrame/Present should be called after this buffer is submitted + bool present; }; struct DescSetLayout; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 3511dbbf9..4f2beec53 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -555,6 +555,7 @@ VkResult WrappedVulkan::vkAllocateCommandBuffers(VkDevice device, record->cmdInfo->allocInfo = *pAllocateInfo; record->cmdInfo->allocInfo.commandBufferCount = 1; record->cmdInfo->allocRecord = allocRecord; + record->cmdInfo->present = false; } else { @@ -852,6 +853,7 @@ VkResult WrappedVulkan::vkBeginCommandBuffer(VkCommandBuffer commandBuffer, record->bakedCommands->cmdInfo->device = record->cmdInfo->device; record->bakedCommands->cmdInfo->allocInfo = record->cmdInfo->allocInfo; + record->bakedCommands->cmdInfo->present = false; { CACHE_THREAD_SERIALISER(); @@ -3326,6 +3328,15 @@ void WrappedVulkan::vkCmdDebugMarkerEndEXT(VkCommandBuffer commandBuffer) } } +void WrappedVulkan::HandleVRFrameMarkers(const char *marker, VkCommandBuffer commandBuffer) +{ + if(strstr(marker, "vr-marker,frame_end,type,application") != NULL) + { + VkResourceRecord *record = GetRecord(commandBuffer); + record->bakedCommands->cmdInfo->present = true; + } +} + template bool WrappedVulkan::Serialise_vkCmdDebugMarkerInsertEXT(SerialiserType &ser, VkCommandBuffer commandBuffer, @@ -3381,6 +3392,7 @@ void WrappedVulkan::vkCmdDebugMarkerInsertEXT(VkCommandBuffer commandBuffer, ObjDisp(commandBuffer)->CmdDebugMarkerInsertEXT(Unwrap(commandBuffer), pMarker)); } + HandleVRFrameMarkers(pMarker->pMarkerName, commandBuffer); if(IsCaptureMode(m_State)) { VkResourceRecord *record = GetRecord(commandBuffer); diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 2b2d22c65..4165fe660 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -779,6 +779,8 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, unwrappedSubmits, Unwrap(fence))); bool capframe = false; + bool present = false; + set refdIDs; VkResourceRecord *queueRecord = GetRecord(queue); @@ -790,6 +792,7 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, ResourceId cmd = GetResID(pSubmits[s].pCommandBuffers[i]); VkResourceRecord *record = GetRecord(pSubmits[s].pCommandBuffers[i]); + present |= record->bakedCommands->cmdInfo->present; { SCOPED_LOCK(m_ImageLayoutsLock); @@ -1005,6 +1008,12 @@ VkResult WrappedVulkan::vkQueueSubmit(VkQueue queue, uint32_t submitCount, } } + if(present) + { + AdvanceFrame(); + Present(LayerDisp(m_Instance), NULL); + } + return ret; } diff --git a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp index f0faccfdd..20c37d956 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_wsi_funcs.cpp @@ -621,14 +621,7 @@ VkResult WrappedVulkan::vkCreateSwapchainKHR(VkDevice device, VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR *pPresentInfo) { - if(IsBackgroundCapturing(m_State)) - { - RenderDoc::Inst().Tick(); - - GetResourceManager()->FlushPendingDirty(); - } - - m_FrameCounter++; // first present becomes frame #1, this function is at the end of the frame + AdvanceFrame(); if(pPresentInfo->swapchainCount > 1 && (m_FrameCounter % 100) == 0) { @@ -787,21 +780,7 @@ VkResult WrappedVulkan::vkQueuePresentKHR(VkQueue queue, const VkPresentInfoKHR VkResult vkr = ObjDisp(queue)->QueuePresentKHR(Unwrap(queue), &unwrappedInfo); - RenderDoc::Inst().AddActiveDriver(RDCDriver::Vulkan, true); - - if(!activeWindow) - return vkr; - - // kill any current capture that isn't application defined - if(IsActiveCapturing(m_State) && !m_AppControlledCapture) - RenderDoc::Inst().EndFrameCapture(LayerDisp(m_Instance), swapInfo.wndHandle); - - if(RenderDoc::Inst().ShouldTriggerCapture(m_FrameCounter) && IsBackgroundCapturing(m_State)) - { - RenderDoc::Inst().StartFrameCapture(LayerDisp(m_Instance), swapInfo.wndHandle); - - m_AppControlledCapture = false; - } + Present(LayerDisp(m_Instance), swapInfo.wndHandle); return vkr; }