diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index c8098097b..82dfbb898 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1919,14 +1919,7 @@ void WrappedVulkan::ReplayLog(uint32_t frameID, uint32_t startEventID, uint32_t // check if the render pass is active - it could have become active // even if it wasn't before (if the above event was a CmdBeginRenderPass) if(m_PartialReplayData.renderPassActive) - { - uint32_t numSubpasses = (uint32_t)m_CreationInfo.m_RenderPass[m_RenderState.renderPass].subpasses.size(); - - for(uint32_t sub=m_RenderState.subpass; sub < numSubpasses-1; sub++) - ObjDisp(cmd)->CmdNextSubpass(Unwrap(cmd), VK_SUBPASS_CONTENTS_INLINE); - - ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd)); - } + 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 diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 7674dd1d1..69e482100 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -3496,6 +3496,8 @@ ResourceId VulkanDebugManager::RenderOverlay(ResourceId texid, TextureDisplayOve vt->CmdClearAttachments(Unwrap(cmd), (uint32_t)atts.size(), &atts[0], 1, &rect); + m_pDriver->m_RenderState.EndRenderPass(cmd); + vkr = vt->EndCommandBuffer(Unwrap(cmd)); RDCASSERTEQUAL(vkr, VK_SUCCESS); @@ -5115,7 +5117,7 @@ void VulkanDebugManager::InitPostVSBuffers(uint32_t frameID, uint32_t eventID) // do single draw modifiedstate.BeginRenderPassAndApplyState(cmd); ObjDisp(cmd)->CmdDraw(Unwrap(cmd), drawcall->numIndices, drawcall->numInstances, drawcall->vertexOffset, drawcall->instanceOffset); - ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd)); + modifiedstate.EndRenderPass(cmd); VkBufferMemoryBarrier meshbufbarrier = { VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER, NULL, @@ -5249,7 +5251,7 @@ void VulkanDebugManager::InitPostVSBuffers(uint32_t frameID, uint32_t eventID) // do single draw modifiedstate.BeginRenderPassAndApplyState(cmd); ObjDisp(cmd)->CmdDrawIndexed(Unwrap(cmd), (uint32_t)indices.size(), drawcall->numInstances, 0, drawcall->vertexOffset, drawcall->instanceOffset); - ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd)); + modifiedstate.EndRenderPass(cmd); // rebase existing index buffer to point to the right elements in our stream-out'd // vertex buffer diff --git a/renderdoc/driver/vulkan/vk_state.cpp b/renderdoc/driver/vulkan/vk_state.cpp index 603874b6f..8538d6f79 100644 --- a/renderdoc/driver/vulkan/vk_state.cpp +++ b/renderdoc/driver/vulkan/vk_state.cpp @@ -200,3 +200,13 @@ void VulkanRenderState::BindPipeline(VkCommandBuffer cmd) } } } + +void VulkanRenderState::EndRenderPass(VkCommandBuffer cmd) +{ + uint32_t numSubpasses = (uint32_t)m_CreationInfo->m_RenderPass[renderPass].subpasses.size(); + + for(uint32_t sub=subpass; sub < numSubpasses-1; sub++) + ObjDisp(cmd)->CmdNextSubpass(Unwrap(cmd), VK_SUBPASS_CONTENTS_INLINE); + + ObjDisp(cmd)->CmdEndRenderPass(Unwrap(cmd)); +} diff --git a/renderdoc/driver/vulkan/vk_state.h b/renderdoc/driver/vulkan/vk_state.h index 9183c894c..b0679d856 100644 --- a/renderdoc/driver/vulkan/vk_state.h +++ b/renderdoc/driver/vulkan/vk_state.h @@ -36,6 +36,7 @@ struct VulkanRenderState VulkanRenderState(VulkanCreationInfo *createInfo); VulkanRenderState &operator =(const VulkanRenderState &o); void BeginRenderPassAndApplyState(VkCommandBuffer cmd); + void EndRenderPass(VkCommandBuffer cmd); void BindPipeline(VkCommandBuffer cmd); // dynamic state @@ -78,7 +79,6 @@ struct VulkanRenderState vector vbuffers; VulkanResourceManager *GetResourceManager() { return m_ResourceManager; } - VulkanResourceManager *m_ResourceManager; VulkanCreationInfo *m_CreationInfo; };