diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 11753e979..98c7242c8 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -3821,7 +3821,7 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay VkResult vkr = VK_SUCCESS; - bool rpWasActive = false; + bool rpWasActive[2] = {}; // we'll need our own command buffer if we're replaying just a subsection // of events within a single command buffer record - always if it's only @@ -3850,9 +3850,10 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay m_RenderState.subpassContents = VK_SUBPASS_CONTENTS_INLINE; m_RenderState.dynamicRendering.flags &= ~VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT; - rpWasActive = m_Partial[Primary].renderPassActive; + rpWasActive[Primary] = m_Partial[Primary].renderPassActive; + rpWasActive[Secondary] = m_Partial[Secondary].renderPassActive; - if(m_Partial[Primary].renderPassActive) + if(rpWasActive[Primary] || rpWasActive[Secondary]) { const ActionDescription *action = GetAction(endEventID); @@ -3928,13 +3929,14 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay // even if it wasn't before (if the above event was a CmdBeginRenderPass). // If we began our own custom single-action loadrp, and it was ended by a CmdEndRenderPass, // we need to reverse the virtual transitions we did above, as it won't happen otherwise - if(m_Partial[Primary].renderPassActive) + if(m_Partial[Primary].renderPassActive || m_Partial[Secondary].renderPassActive) m_RenderState.EndRenderPass(cmd); // we might have replayed a CmdBeginRenderPass or CmdEndRenderPass, // but we want to keep the partial replay data state intact, so restore // whether or not a render pass was active. - m_Partial[Primary].renderPassActive = rpWasActive; + m_Partial[Primary].renderPassActive = rpWasActive[Primary]; + m_Partial[Secondary].renderPassActive = rpWasActive[Secondary]; ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd)); diff --git a/renderdoc/driver/vulkan/vk_overlay.cpp b/renderdoc/driver/vulkan/vk_overlay.cpp index 7dbb4d1fb..03530a792 100644 --- a/renderdoc/driver/vulkan/vk_overlay.cpp +++ b/renderdoc/driver/vulkan/vk_overlay.cpp @@ -726,9 +726,9 @@ ResourceId VulkanReplay::RenderOverlay(ResourceId texid, FloatVector clearCol, D const VulkanCreationInfo::Pipeline &pipeInfo = m_pDriver->m_CreationInfo.m_Pipeline[state.graphics.pipeline]; - // Secondary commands can't have render passes if((mainDraw && !(mainDraw->flags & ActionFlags::Drawcall)) || - !m_pDriver->m_Partial[WrappedVulkan::Primary].renderPassActive) + (!m_pDriver->m_Partial[WrappedVulkan::Primary].renderPassActive && + !m_pDriver->m_Partial[WrappedVulkan::Secondary].renderPassActive)) { // don't do anything, no action capable of making overlays selected float black[] = {0.0f, 0.0f, 0.0f, 0.0f}; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index c91a9fb79..360912435 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -1393,8 +1393,10 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(SerialiserType &ser, VkCommandB } // finish any render pass that was still active in the primary partial parent - if(m_Partial[Primary].partialParent == BakedCommandBuffer && - m_Partial[Primary].renderPassActive) + if((m_Partial[Primary].partialParent == BakedCommandBuffer && + m_Partial[Primary].renderPassActive) || + (m_Partial[Secondary].partialParent == BakedCommandBuffer && + m_Partial[Secondary].renderPassActive)) { if(m_BakedCmdBufferInfo[m_LastCmdBufferID].renderPassOpen) { @@ -6772,9 +6774,13 @@ bool WrappedVulkan::Serialise_vkCmdBeginRendering(SerialiserType &ser, VkCommand commandBuffer = RerecordCmdBuf(m_LastCmdBufferID); // only if we're partially recording do we update this state - if(ShouldUpdateRenderState(m_LastCmdBufferID, true)) + if(ShouldUpdateRenderState(m_LastCmdBufferID)) { - m_Partial[Primary].renderPassActive = true; + if(m_Partial[Primary].partialParent == m_LastCmdBufferID) + m_Partial[Primary].renderPassActive = true; + else if(m_Partial[Secondary].partialParent == m_LastCmdBufferID) + m_Partial[Secondary].renderPassActive = true; + m_BakedCmdBufferInfo[m_LastCmdBufferID].renderPassOpen = true; } m_BakedCmdBufferInfo[m_LastCmdBufferID].activeSubpass = 0; @@ -7136,13 +7142,18 @@ bool WrappedVulkan::Serialise_vkCmdEndRendering(SerialiserType &ser, VkCommandBu bool suspending = (renderstate.dynamicRendering.flags & VK_RENDERING_SUSPENDING_BIT) != 0; - if(ShouldUpdateRenderState(m_LastCmdBufferID, true)) + if(ShouldUpdateRenderState(m_LastCmdBufferID)) { m_BakedCmdBufferInfo[m_LastCmdBufferID].renderPassOpen = false; // if this rendering is just being suspended, the pass is still active if(!suspending) - m_Partial[Primary].renderPassActive = false; + { + if(m_Partial[Primary].partialParent == m_LastCmdBufferID) + m_Partial[Primary].renderPassActive = false; + else if(m_Partial[Secondary].partialParent == m_LastCmdBufferID) + m_Partial[Secondary].renderPassActive = false; + } } ActionFlags drawFlags = ActionFlags::PassBoundary | ActionFlags::EndPass;