diff --git a/renderdoc/driver/d3d12/d3d12_command_queue.h b/renderdoc/driver/d3d12/d3d12_command_queue.h index 9fe891fd6..11d691b0c 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue.h +++ b/renderdoc/driver/d3d12/d3d12_command_queue.h @@ -246,7 +246,7 @@ class WrappedID3D12CommandQueue : public ID3D12CommandQueue, } bool ShouldRerecordCmd(ResourceId cmdid); - bool InRerecordRange(); + bool InRerecordRange(ResourceId cmdid); ID3D12GraphicsCommandList *RerecordCmdList(ResourceId cmdid); void ProcessChunk(uint64_t offset, D3D12ChunkType context); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index c3c8faacf..f7fffdf34 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -283,12 +283,6 @@ WrappedVulkan::WrappedVulkan(const char *logFilename) : m_RenderState(&m_Creatio m_LastCmdBufferID = ResourceId(); - m_PartialReplayData.renderPassActive = false; - m_PartialReplayData.resultPartialCmdBuffer = VK_NULL_HANDLE; - m_PartialReplayData.outsideCmdBuffer = VK_NULL_HANDLE; - m_PartialReplayData.partialParent = ResourceId(); - m_PartialReplayData.baseEvent = 0; - m_DrawcallStack.push_back(&m_ParentDrawcall); m_SetDeviceLoaderData = NULL; @@ -1629,12 +1623,15 @@ void WrappedVulkan::ContextReplayLog(LogState readType, uint32_t startEventID, u m_CleanupEvents.clear(); - if(m_PartialReplayData.resultPartialCmdBuffer != VK_NULL_HANDLE) + for(int p = 0; p < ePartialNum; p++) { - // deliberately call our own function, so this is destroyed as a wrapped object - vkFreeCommandBuffers(m_PartialReplayData.partialDevice, m_PartialReplayData.resultPartialCmdPool, - 1, &m_PartialReplayData.resultPartialCmdBuffer); - m_PartialReplayData.resultPartialCmdBuffer = VK_NULL_HANDLE; + if(m_Partial[p].resultPartialCmdBuffer != VK_NULL_HANDLE) + { + // deliberately call our own function, so this is destroyed as a wrapped object + vkFreeCommandBuffers(m_Partial[p].partialDevice, m_Partial[p].resultPartialCmdPool, 1, + &m_Partial[p].resultPartialCmdBuffer); + m_Partial[p].resultPartialCmdBuffer = VK_NULL_HANDLE; + } } for(auto it = m_RerecordCmds.begin(); it != m_RerecordCmds.end(); ++it) @@ -2123,10 +2120,10 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay { if(!partial) { - m_PartialReplayData.renderPassActive = false; - RDCASSERT(m_PartialReplayData.resultPartialCmdBuffer == VK_NULL_HANDLE); - m_PartialReplayData.partialParent = ResourceId(); - m_PartialReplayData.baseEvent = 0; + RDCASSERT(m_Partial[Primary].resultPartialCmdBuffer == VK_NULL_HANDLE); + RDCASSERT(m_Partial[Secondary].resultPartialCmdBuffer == VK_NULL_HANDLE); + m_Partial[Primary].Reset(); + m_Partial[Secondary].Reset(); m_RenderState = VulkanRenderState(&m_CreationInfo); m_RenderState.m_ResourceManager = GetResourceManager(); } @@ -2141,7 +2138,7 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay // has chosen a subsection that lies within a command buffer if(partial) { - VkCommandBuffer cmd = m_PartialReplayData.outsideCmdBuffer = GetNextCmd(); + VkCommandBuffer cmd = m_Partial[Primary].outsideCmdBuffer = GetNextCmd(); VkCommandBufferBeginInfo beginInfo = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, NULL, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT}; @@ -2149,10 +2146,10 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay vkr = ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo); RDCASSERTEQUAL(vkr, VK_SUCCESS); - rpWasActive = m_PartialReplayData.renderPassActive; + rpWasActive = m_Partial[Primary].renderPassActive; // if a render pass was active, begin it and set up the partial replay state - if(m_PartialReplayData.renderPassActive) + if(m_Partial[Primary].renderPassActive) m_RenderState.BeginRenderPassAndApplyState(cmd); // if we had a compute pipeline, need to bind that else if(m_RenderState.compute.pipeline != ResourceId()) @@ -2174,25 +2171,25 @@ void WrappedVulkan::ReplayLog(uint32_t startEventID, uint32_t endEventID, Replay else RDCFATAL("Unexpected replay type"); - if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) + if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE) { - VkCommandBuffer cmd = m_PartialReplayData.outsideCmdBuffer; + VkCommandBuffer cmd = m_Partial[Primary].outsideCmdBuffer; // 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) + if(m_Partial[Primary].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_PartialReplayData.renderPassActive = rpWasActive; + m_Partial[Primary].renderPassActive = rpWasActive; ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd)); SubmitCmds(); - m_PartialReplayData.outsideCmdBuffer = VK_NULL_HANDLE; + m_Partial[Primary].outsideCmdBuffer = VK_NULL_HANDLE; } #if defined(SINGLE_FLUSH_VALIDATE) @@ -2379,31 +2376,39 @@ VkBool32 WrappedVulkan::DebugCallback(VkDebugReportFlagsEXT flags, bool WrappedVulkan::ShouldRerecordCmd(ResourceId cmdid) { - if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) + if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE) return true; if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds()) return true; - return cmdid == m_PartialReplayData.partialParent; + return cmdid == m_Partial[Primary].partialParent || cmdid == m_Partial[Secondary].partialParent; } -bool WrappedVulkan::InRerecordRange() +bool WrappedVulkan::InRerecordRange(ResourceId cmdid) { - if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) + if(m_Partial[Primary].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; + for(int p = 0; p < ePartialNum; p++) + { + if(cmdid == m_Partial[p].partialParent) + { + return m_BakedCmdBufferInfo[m_Partial[p].partialParent].curEventID <= + m_LastEventID - m_Partial[p].baseEvent; + } + } + + return false; } -VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid) +VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid, PartialReplayIndex partialType) { - if(m_PartialReplayData.outsideCmdBuffer != VK_NULL_HANDLE) - return m_PartialReplayData.outsideCmdBuffer; + if(m_Partial[Primary].outsideCmdBuffer != VK_NULL_HANDLE) + return m_Partial[Primary].outsideCmdBuffer; if(m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds()) { @@ -2414,7 +2419,16 @@ VkCommandBuffer WrappedVulkan::RerecordCmdBuf(ResourceId cmdid) return it->second; } - return m_PartialReplayData.resultPartialCmdBuffer; + if(partialType != ePartialNum) + return m_Partial[partialType].resultPartialCmdBuffer; + + for(int p = 0; p < ePartialNum; p++) + if(cmdid == m_Partial[p].partialParent) + return m_Partial[p].resultPartialCmdBuffer; + + RDCERR("Calling re-record for invalid command buffer id"); + + return VK_NULL_HANDLE; } void WrappedVulkan::AddDrawcall(const FetchDrawcall &d, bool hasEvents) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 8a6991bc6..f064fa9d1 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -396,8 +396,27 @@ private: }; vector m_DrawcallUses; + enum PartialReplayIndex + { + Primary, + Secondary, + ePartialNum + }; + struct PartialReplayData { + PartialReplayData() { Reset(); } + void Reset() + { + resultPartialCmdPool = VK_NULL_HANDLE; + resultPartialCmdBuffer = VK_NULL_HANDLE; + partialDevice = VK_NULL_HANDLE; + outsideCmdBuffer = VK_NULL_HANDLE; + partialParent = ResourceId(); + baseEvent = 0; + renderPassActive = false; + } + // if we're doing a partial replay, by definition only one command // buffer will be partial at any one time. While replaying through // the command buffer chunks, the partial command buffer will be @@ -447,7 +466,7 @@ private: // reach the vkEndCommandBuffer that we also need to end a render // pass. bool renderPassActive; - } m_PartialReplayData; + } m_Partial[ePartialNum]; map m_RerecordCmds; @@ -457,8 +476,8 @@ private: VulkanRenderState m_RenderState; bool ShouldRerecordCmd(ResourceId cmdid); - bool InRerecordRange(); - VkCommandBuffer RerecordCmdBuf(ResourceId cmdid); + bool InRerecordRange(ResourceId cmdid); + VkCommandBuffer RerecordCmdBuf(ResourceId cmdid, PartialReplayIndex partialType = ePartialNum); // this info is stored in the record on capture, but we // need it on replay too diff --git a/renderdoc/driver/vulkan/vk_debug.cpp b/renderdoc/driver/vulkan/vk_debug.cpp index 722d91a8c..23ccef8f6 100644 --- a/renderdoc/driver/vulkan/vk_debug.cpp +++ b/renderdoc/driver/vulkan/vk_debug.cpp @@ -3913,7 +3913,8 @@ ResourceId VulkanDebugManager::RenderOverlay(ResourceId texid, TextureDisplayOve VkImageSubresourceRange subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}; - if(!m_pDriver->m_PartialReplayData.renderPassActive) + // Secondary commands can't have render passes + if(!m_pDriver->m_Partial[WrappedVulkan::Primary].renderPassActive) { // don't do anything, no drawcall 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 5ce25cedd..6ac315c6b 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -321,26 +321,33 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(Serialiser *localSerialiser, if(m_State == EXECUTING) { - const vector &baseEvents = m_PartialReplayData.cmdBufferSubmits[bakeId]; - uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount; + const uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount; bool partial = false; + int partialType = ePartialNum; - for(auto it = baseEvents.begin(); it != baseEvents.end(); ++it) + // check for partial execution of this command buffer + for(int p = 0; p < ePartialNum; p++) { - if(*it <= m_LastEventID && m_LastEventID < (*it + length)) + const vector &baseEvents = m_Partial[p].cmdBufferSubmits[bakeId]; + + for(auto it = baseEvents.begin(); it != baseEvents.end(); ++it) { - RDCDEBUG("vkBegin - partial detected %u < %u < %u, %llu -> %llu", *it, m_LastEventID, - *it + length, cmdId, bakeId); + if(*it <= m_LastEventID && m_LastEventID < (*it + length)) + { + RDCDEBUG("vkBegin - partial detected %u < %u < %u, %llu -> %llu", *it, m_LastEventID, + *it + length, cmdId, bakeId); - m_PartialReplayData.partialParent = cmdId; - m_PartialReplayData.baseEvent = *it; - m_PartialReplayData.renderPassActive = false; - m_PartialReplayData.partialDevice = device; - m_PartialReplayData.resultPartialCmdPool = - (VkCommandPool)(uint64_t)GetResourceManager()->GetNonDispWrapper(allocInfo.commandPool); + m_Partial[p].partialParent = cmdId; + m_Partial[p].baseEvent = *it; + m_Partial[p].renderPassActive = false; + m_Partial[p].partialDevice = device; + m_Partial[p].resultPartialCmdPool = + (VkCommandPool)(uint64_t)GetResourceManager()->GetNonDispWrapper(allocInfo.commandPool); - partial = true; + partial = true; + partialType = p; + } } } @@ -367,7 +374,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(Serialiser *localSerialiser, if(partial) { - m_PartialReplayData.resultPartialCmdBuffer = cmd; + m_Partial[partialType].resultPartialCmdBuffer = cmd; } else { @@ -519,7 +526,8 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser *localSerialiser, bool recordAll = m_DrawcallCallback && m_DrawcallCallback->RecordAllCmds(); - if(!recordAll && m_PartialReplayData.renderPassActive) + if(!recordAll && m_Partial[Primary].partialParent == cmdid && + m_Partial[Primary].renderPassActive) { uint32_t numSubpasses = (uint32_t)m_CreationInfo.m_RenderPass[m_RenderState.renderPass].subpasses.size(); @@ -536,7 +544,8 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser *localSerialiser, // duplicates when it comes time to clean up. See above in vkBeginCommandBuffer m_RerecordCmds.erase(cmdid); - m_PartialReplayData.partialParent = ResourceId(); + if(m_Partial[Primary].partialParent == cmdid) + m_Partial[Primary].partialParent = ResourceId(); } m_BakedCmdBufferInfo[cmdid].curEventID = 0; @@ -655,11 +664,11 @@ bool WrappedVulkan::Serialise_vkCmdBeginRenderPass(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); - m_PartialReplayData.renderPassActive = true; + m_Partial[Primary].renderPassActive = true; ObjDisp(commandBuffer)->CmdBeginRenderPass(Unwrap(commandBuffer), &beginInfo, cont); m_RenderState.subpass = 0; @@ -752,7 +761,7 @@ bool WrappedVulkan::Serialise_vkCmdNextSubpass(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -841,7 +850,7 @@ bool WrappedVulkan::Serialise_vkCmdExecuteCommands(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -919,11 +928,11 @@ bool WrappedVulkan::Serialise_vkCmdEndRenderPass(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); - m_PartialReplayData.renderPassActive = false; + m_Partial[Primary].renderPassActive = false; ObjDisp(commandBuffer)->CmdEndRenderPass(Unwrap(commandBuffer)); } } @@ -988,7 +997,7 @@ bool WrappedVulkan::Serialise_vkCmdBindPipeline(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { pipeline = GetResourceManager()->GetLiveHandle(pipeid); commandBuffer = RerecordCmdBuf(cmdid); @@ -1133,7 +1142,7 @@ bool WrappedVulkan::Serialise_vkCmdBindDescriptorSets( { layout = GetResourceManager()->GetLiveHandle(layoutid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -1313,7 +1322,7 @@ bool WrappedVulkan::Serialise_vkCmdBindVertexBuffers(Serialiser *localSerialiser if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1399,7 +1408,7 @@ bool WrappedVulkan::Serialise_vkCmdBindIndexBuffer(Serialiser *localSerialiser, { buffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdBindIndexBuffer(Unwrap(commandBuffer), Unwrap(buffer), offs, idxType); @@ -1471,7 +1480,7 @@ bool WrappedVulkan::Serialise_vkCmdUpdateBuffer(Serialiser *localSerialiser, { destBuffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1546,7 +1555,7 @@ bool WrappedVulkan::Serialise_vkCmdFillBuffer(Serialiser *localSerialiser, { destBuffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdFillBuffer(Unwrap(commandBuffer), Unwrap(destBuffer), offs, sz, d); @@ -1614,7 +1623,7 @@ bool WrappedVulkan::Serialise_vkCmdPushConstants(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); layout = GetResourceManager()->GetLiveHandle(layid); @@ -1717,7 +1726,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1835,7 +1844,7 @@ bool WrappedVulkan::Serialise_vkCmdWriteTimestamp(Serialiser *localSerialiser, { queryPool = GetResourceManager()->GetLiveHandle(poolid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdWriteTimestamp(Unwrap(commandBuffer), stage, Unwrap(queryPool), q); @@ -1900,7 +1909,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyQueryPoolResults( queryPool = GetResourceManager()->GetLiveHandle(qid); destBuffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1978,7 +1987,7 @@ bool WrappedVulkan::Serialise_vkCmdBeginQuery(Serialiser *localSerialiser, { queryPool = GetResourceManager()->GetLiveHandle(qid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdBeginQuery(Unwrap(commandBuffer), Unwrap(queryPool), q, f); @@ -2033,7 +2042,7 @@ bool WrappedVulkan::Serialise_vkCmdEndQuery(Serialiser *localSerialiser, { queryPool = GetResourceManager()->GetLiveHandle(qid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdEndQuery(Unwrap(commandBuffer), Unwrap(queryPool), q); @@ -2089,7 +2098,7 @@ bool WrappedVulkan::Serialise_vkCmdResetQueryPool(Serialiser *localSerialiser, { queryPool = GetResourceManager()->GetLiveHandle(qid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdResetQueryPool(Unwrap(commandBuffer), Unwrap(queryPool), first, count); diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index 18ca77378..092872df7 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -42,7 +42,7 @@ bool WrappedVulkan::Serialise_vkCmdDraw(Serialiser *localSerialiser, VkCommandBu if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -127,7 +127,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexed(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -219,7 +219,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndirect(Serialiser *localSerialiser, { buffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -328,7 +328,7 @@ bool WrappedVulkan::Serialise_vkCmdDrawIndexedIndirect(Serialiser *localSerialis { buffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -435,7 +435,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatch(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -514,7 +514,7 @@ bool WrappedVulkan::Serialise_vkCmdDispatchIndirect(Serialiser *localSerialiser, { buffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); @@ -622,7 +622,7 @@ bool WrappedVulkan::Serialise_vkCmdBlitImage(Serialiser *localSerialiser, srcImage = GetResourceManager()->GetLiveHandle(srcid); destImage = GetResourceManager()->GetLiveHandle(dstid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -737,7 +737,7 @@ bool WrappedVulkan::Serialise_vkCmdResolveImage(Serialiser *localSerialiser, srcImage = GetResourceManager()->GetLiveHandle(srcid); destImage = GetResourceManager()->GetLiveHandle(dstid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -852,7 +852,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyImage(Serialiser *localSerialiser, srcImage = GetResourceManager()->GetLiveHandle(srcid); destImage = GetResourceManager()->GetLiveHandle(dstid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -967,7 +967,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyBufferToImage(Serialiser *localSerialiser srcBuffer = GetResourceManager()->GetLiveHandle(bufid); destImage = GetResourceManager()->GetLiveHandle(imgid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1073,7 +1073,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyImageToBuffer(Serialiser *localSerialiser srcImage = GetResourceManager()->GetLiveHandle(imgid); destBuffer = GetResourceManager()->GetLiveHandle(bufid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1180,7 +1180,7 @@ bool WrappedVulkan::Serialise_vkCmdCopyBuffer(Serialiser *localSerialiser, srcBuffer = GetResourceManager()->GetLiveHandle(srcid); destBuffer = GetResourceManager()->GetLiveHandle(dstid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1296,7 +1296,7 @@ bool WrappedVulkan::Serialise_vkCmdClearColorImage(Serialiser *localSerialiser, { image = GetResourceManager()->GetLiveHandle(imgid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1384,7 +1384,7 @@ bool WrappedVulkan::Serialise_vkCmdClearDepthStencilImage( { image = GetResourceManager()->GetLiveHandle(imgid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer) @@ -1475,7 +1475,7 @@ bool WrappedVulkan::Serialise_vkCmdClearAttachments(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { commandBuffer = RerecordCmdBuf(cmdid); ObjDisp(commandBuffer)->CmdClearAttachments(Unwrap(commandBuffer), acount, atts, rcount, rects); diff --git a/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp index 20e02320d..b9d47c7b1 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_dynamic_funcs.cpp @@ -40,7 +40,7 @@ bool WrappedVulkan::Serialise_vkCmdSetViewport(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetViewport(Unwrap(cmdBuffer), first, count, views); @@ -100,7 +100,7 @@ bool WrappedVulkan::Serialise_vkCmdSetScissor(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetScissor(Unwrap(cmdBuffer), first, count, scissors); @@ -157,7 +157,7 @@ bool WrappedVulkan::Serialise_vkCmdSetLineWidth(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetLineWidth(Unwrap(cmdBuffer), width); @@ -209,7 +209,7 @@ bool WrappedVulkan::Serialise_vkCmdSetDepthBias(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetDepthBias(Unwrap(cmdBuffer), bias, biasclamp, slope); @@ -273,7 +273,7 @@ bool WrappedVulkan::Serialise_vkCmdSetBlendConstants(Serialiser *localSerialiser if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetBlendConstants(Unwrap(cmdBuffer), blendFactor); @@ -324,7 +324,7 @@ bool WrappedVulkan::Serialise_vkCmdSetDepthBounds(Serialiser *localSerialiser, if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetDepthBounds(Unwrap(cmdBuffer), mind, maxd); @@ -378,7 +378,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilCompareMask(Serialiser *localSerial if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetStencilCompareMask(Unwrap(cmdBuffer), face, mask); @@ -435,7 +435,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilWriteMask(Serialiser *localSerialis if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetStencilWriteMask(Unwrap(cmdBuffer), face, mask); @@ -492,7 +492,7 @@ bool WrappedVulkan::Serialise_vkCmdSetStencilReference(Serialiser *localSerialis if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetStencilReference(Unwrap(cmdBuffer), face, mask); diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 01eef4f1a..80baf44b6 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -232,7 +232,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue m_DebugMessages.back().eventID += m_RootEventID; } - m_PartialReplayData.cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID); + // only primary command buffers can be submitted + m_Partial[Primary].cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID); m_RootEventID += cmdBufInfo.eventCount; m_RootDrawcallID += cmdBufInfo.drawCount; @@ -315,12 +316,12 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(Serialiser *localSerialiser, VkQueue uint32_t end = eid + m_BakedCmdBufferInfo[cmdIds[c]].eventCount; - if(eid == m_PartialReplayData.baseEvent) + if(eid == m_Partial[Primary].baseEvent) { - ResourceId partial = GetResID(RerecordCmdBuf(cmdIds[c])); + ResourceId partial = GetResID(RerecordCmdBuf(cmdIds[c], Primary)); RDCDEBUG("Queue Submit partial replay of %llu at %u, using %llu", cmdIds[c], eid, partial); trimmedCmdIds.push_back(partial); - trimmedCmds.push_back(Unwrap(RerecordCmdBuf(cmdIds[c]))); + trimmedCmds.push_back(Unwrap(RerecordCmdBuf(cmdIds[c], Primary))); } else if(m_LastEventID >= end) { diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index 7ddffdda2..eaf717cd2 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -563,7 +563,7 @@ bool WrappedVulkan::Serialise_vkCmdSetEvent(Serialiser *localSerialiser, VkComma { event = GetResourceManager()->GetLiveHandle(eid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); ObjDisp(cmdBuffer)->CmdSetEvent(Unwrap(cmdBuffer), Unwrap(event), mask); @@ -619,7 +619,7 @@ bool WrappedVulkan::Serialise_vkCmdResetEvent(Serialiser *localSerialiser, VkCom { event = GetResourceManager()->GetLiveHandle(eid); - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid); // ObjDisp(cmdBuffer)->CmdResetEvent(Unwrap(cmdBuffer), Unwrap(event), mask); @@ -711,7 +711,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents( if(m_State == EXECUTING) { - if(ShouldRerecordCmd(cmdid) && InRerecordRange()) + if(ShouldRerecordCmd(cmdid) && InRerecordRange(cmdid)) { cmdBuffer = RerecordCmdBuf(cmdid);