diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 68eba751d..43ed41aff 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1857,14 +1857,24 @@ VkBool32 WrappedVulkan::DebugCallback( bool WrappedVulkan::ShouldRerecordCmd(ResourceId cmdid) { - return m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE || - cmdid == m_PartialReplayData.partialParent; + if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) + return true; + + if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds()) + return true; + + return cmdid == m_PartialReplayData.partialParent; } bool WrappedVulkan::InRerecordRange() { - return m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE || - m_BakedCmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; + if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) + return true; + + if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds()) + return true; + + return m_BakedCmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; } VkCommandBuffer WrappedVulkan::RerecordCmdBuf() diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index b25232326..6f575e54a 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -116,6 +116,11 @@ struct DrawcallCallback virtual void PreDraw(uint32_t eid, VkCommandBuffer cmd) = 0; virtual bool PostDraw(uint32_t eid, VkCommandBuffer cmd) = 0; virtual void PostRedraw(uint32_t eid, VkCommandBuffer cmd) = 0; + + // should we re-record all command buffers? this needs to be true if the range + // being replayed is larger than one command buffer (which usually means the + // whole frame). + virtual bool RecordAllCmds() = 0; }; class WrappedVulkan : public IFrameCapturer diff --git a/renderdoc/driver/vulkan/vk_counters.cpp b/renderdoc/driver/vulkan/vk_counters.cpp index 7c8b68123..078c61495 100644 --- a/renderdoc/driver/vulkan/vk_counters.cpp +++ b/renderdoc/driver/vulkan/vk_counters.cpp @@ -98,6 +98,11 @@ struct GPUTimerCallback : public DrawcallCallback { } + bool RecordAllCmds() + { + return true; + } + WrappedVulkan *m_pDriver; VulkanReplay *m_pReplay; VkQueryPool m_QueryPool; diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 8646d20fa..042eb3ffc 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -2314,6 +2314,11 @@ struct QuadOverdrawCallback : public DrawcallCallback // nothing to do } + bool RecordAllCmds() + { + return false; + } + uint32_t m_FrameID; WrappedVulkan *m_pDriver; VulkanDebugManager *m_pDebug; diff --git a/renderdoc/driver/vulkan/vk_replay.cpp b/renderdoc/driver/vulkan/vk_replay.cpp index 0d1e21a8a..e96fd04bf 100644 --- a/renderdoc/driver/vulkan/vk_replay.cpp +++ b/renderdoc/driver/vulkan/vk_replay.cpp @@ -3806,6 +3806,11 @@ struct InitPostVSCallback : public DrawcallCallback { } + bool RecordAllCmds() + { + return false; + } + uint32_t m_FrameID; WrappedVulkan *m_pDriver; VulkanReplay *m_pReplay;