diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 19da938ce..be6b188af 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -876,7 +876,7 @@ void WrappedVulkan::ContextReplayLog(LogState readType, uint32_t startEventID, u { // these events are completely omitted, so don't increment the curEventID if(context != BEGIN_CMD_BUFFER && context != END_CMD_BUFFER) - m_CmdBufferInfo[m_LastCmdBufferID].curEventID++; + m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID++; } else { @@ -1429,8 +1429,8 @@ void WrappedVulkan::AddDrawcall(FetchDrawcall d, bool hasEvents) m_AddedDrawcall = true; FetchDrawcall draw = d; - draw.eventID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID; - draw.drawcallID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].drawCount : m_RootDrawcallID; + draw.eventID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID; + draw.drawcallID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount : m_RootDrawcallID; for(int i=0; i < 8; i++) draw.outputs[i] = ResourceId(); @@ -1446,13 +1446,13 @@ void WrappedVulkan::AddDrawcall(FetchDrawcall d, bool hasEvents) draw.indexByteWidth = m_PartialReplayData.state.ibuffer.bytewidth; if(m_LastCmdBufferID != ResourceId()) - m_CmdBufferInfo[m_LastCmdBufferID].drawCount++; + m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount++; else m_RootDrawcallID++; if(hasEvents) { - vector &srcEvents = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEvents : m_RootEvents; + vector &srcEvents = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents : m_RootEvents; draw.events = srcEvents; srcEvents.clear(); } @@ -1477,7 +1477,7 @@ void WrappedVulkan::AddEvent(VulkanChunkType type, string description) apievent.context = ResourceId(); apievent.fileOffset = m_CurChunkOffset; - apievent.eventID = m_LastCmdBufferID != ResourceId() ? m_CmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID; + apievent.eventID = m_LastCmdBufferID != ResourceId() ? m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID : m_RootEventID; apievent.eventDesc = description; @@ -1490,7 +1490,7 @@ void WrappedVulkan::AddEvent(VulkanChunkType type, string description) if(m_LastCmdBufferID != ResourceId()) { - m_CmdBufferInfo[m_LastCmdBufferID].curEvents.push_back(apievent); + m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.push_back(apievent); } else { diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index cfc0d3385..5ead35198 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -210,18 +210,14 @@ private: uint32_t GetGPULocalMemoryIndex(uint32_t resourceRequiredBitmask); ResourceId m_FakeBBImgId; - - struct CmdBufferInfo - { - VkDevice device; - VkCmdBufferCreateInfo createInfo; - vector< pair > imgtransitions; - - // used on replay + struct BakedCmdBufferInfo + { vector curEvents; list drawStack; + vector< pair > imgtransitions; + DrawcallTreeNode *draw; // the root draw to copy from when submitting uint32_t eventCount; // how many events are in this cmd buffer, for quick skipping uint32_t curEventID; // current event ID while reading or executing @@ -340,7 +336,7 @@ private: } m_PartialReplayData; bool IsPartialCmd(ResourceId cmdid) { return cmdid == m_PartialReplayData.partialParent; } - bool InPartialRange() { return m_CmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; } + bool InPartialRange() { return m_BakedCmdBufferInfo[m_PartialReplayData.partialParent].curEventID <= m_LastEventID - m_PartialReplayData.baseEvent; } VkCmdBuffer PartialCmdBuf() { return m_PartialReplayData.resultPartialCmdBuffer; } @@ -358,7 +354,6 @@ private: // VKTODOHIGH all of these need to be locked map m_MemoryInfo; map m_ImageInfo; - map m_CmdBufferInfo; // below are replay-side data only, doesn't have to be thread protected @@ -366,6 +361,8 @@ private: map m_MemBindState; // current descriptor set contents map m_DescriptorSetState; + // data for a baked command buffer - its drawcalls and events, ready to submit + map m_BakedCmdBufferInfo; // immutable creation data VulkanCreationInfo m_CreationInfo; @@ -404,7 +401,7 @@ private: list &GetDrawcallStack() { if(m_LastCmdBufferID != ResourceId()) - return m_CmdBufferInfo[m_LastCmdBufferID].drawStack; + return m_BakedCmdBufferInfo[m_LastCmdBufferID].drawStack; return m_DrawcallStack; } diff --git a/renderdoc/driver/vulkan/vk_resources.cpp b/renderdoc/driver/vulkan/vk_resources.cpp index bec86e62a..e9e6a43b9 100644 --- a/renderdoc/driver/vulkan/vk_resources.cpp +++ b/renderdoc/driver/vulkan/vk_resources.cpp @@ -487,4 +487,5 @@ VkResourceRecord::~VkResourceRecord() SAFE_DELETE(layout); SAFE_DELETE(swapInfo); + SAFE_DELETE(cmdInfo); } diff --git a/renderdoc/driver/vulkan/vk_resources.h b/renderdoc/driver/vulkan/vk_resources.h index c132b72cb..2dee54f88 100644 --- a/renderdoc/driver/vulkan/vk_resources.h +++ b/renderdoc/driver/vulkan/vk_resources.h @@ -566,6 +566,22 @@ struct SwapchainInfo }; vector images; }; + +struct CmdBufferRecordingInfo +{ + VkDevice device; + VkCmdBufferCreateInfo createInfo; + + vector< pair > imgtransitions; + + // a list of all resources dirtied by this command buffer + set dirtied; + + // a list of descriptor sets that are bound at any point in this command buffer + // used to look up all the frame refs per-desc set and apply them on queue + // submit with latest binding refs. + set boundDescSets; +}; struct DescSetLayout; @@ -580,7 +596,8 @@ struct VkResourceRecord : public ResourceRecord pool(NULL), memory(NULL), layout(NULL), - swapInfo(NULL) + swapInfo(NULL), + cmdInfo(NULL) { } @@ -588,9 +605,10 @@ struct VkResourceRecord : public ResourceRecord void Bake() { + RDCASSERT(cmdInfo); SwapChunks(bakedCommands); - dirtied.swap(bakedCommands->dirtied); - boundDescSets.swap(bakedCommands->boundDescSets); + cmdInfo->dirtied.swap(bakedCommands->cmdInfo->dirtied); + cmdInfo->boundDescSets.swap(bakedCommands->cmdInfo->boundDescSets); } // need to only track current memory binding, @@ -646,19 +664,12 @@ struct VkResourceRecord : public ResourceRecord bindFrameRefs.erase(id); } + WrappedVkRes *Resource; + VkResourceRecord *bakedCommands; - WrappedVkRes *Resource; - SwapchainInfo *swapInfo; - - // a list of resources that are made dirty by submitting this command buffer - set dirtied; - - // a list of descriptor sets that are bound at any point in this command buffer - // used to look up all the frame refs per-desc set and apply them on queue - // submit with latest binding refs. - set boundDescSets; + CmdBufferRecordingInfo *cmdInfo; // queues associated with this instance, so they can be shut down on destruction vector queues; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index d7e74ecde..24c1a22e4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -128,14 +128,19 @@ VkResult WrappedVulkan::vkCreateCommandBuffer( // we don't serialise this as we never create this command buffer directly. // Instead we create a command buffer for each baked list that we find. + + // if pNext is non-NULL, need to do a deep copy + RDCASSERT(pCreateInfo->pNext == NULL); + + record->cmdInfo = new CmdBufferRecordingInfo(); + + record->cmdInfo->device = device; + record->cmdInfo->createInfo = *pCreateInfo; } else { GetResourceManager()->AddLiveResource(id, *pCmdBuffer); } - - m_CmdBufferInfo[id].device = device; - m_CmdBufferInfo[id].createInfo = *pCreateInfo; } return ret; @@ -149,6 +154,8 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( SERIALISE_ELEMENT(ResourceId, cmdId, GetResID(cmdBuffer)); ResourceId bakedCmdId; + VkCmdBufferCreateInfo createInfo; + VkDevice device = VK_NULL_HANDLE; if(m_State >= WRITING) { @@ -156,19 +163,14 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( RDCASSERT(record->bakedCommands); if(record->bakedCommands) bakedCmdId = record->bakedCommands->GetResourceID(); + + RDCASSERT(record->cmdInfo); + device = record->cmdInfo->device; + createInfo = record->cmdInfo->createInfo; } SERIALISE_ELEMENT(VkCmdBufferBeginInfo, info, *pBeginInfo); SERIALISE_ELEMENT(ResourceId, bakeId, bakedCmdId); - - VkCmdBufferCreateInfo createInfo; - VkDevice device = VK_NULL_HANDLE; - - if(m_State >= WRITING) - { - device = m_CmdBufferInfo[cmdId].device; - createInfo = m_CmdBufferInfo[cmdId].createInfo; - } if(m_State < WRITING) { @@ -185,7 +187,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( if(m_State == EXECUTING) { const vector &baseEvents = m_PartialReplayData.cmdBufferSubmits[bakeId]; - uint32_t length = m_CmdBufferInfo[bakeId].eventCount; + uint32_t length = m_BakedCmdBufferInfo[bakeId].eventCount; for(auto it=baseEvents.begin(); it != baseEvents.end(); ++it) { @@ -219,7 +221,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( } } - m_CmdBufferInfo[cmdId].curEventID = 1; + m_BakedCmdBufferInfo[cmdId].curEventID = 1; } else if(m_State == READING) { @@ -253,15 +255,15 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer( { DrawcallTreeNode *draw = new DrawcallTreeNode; - m_CmdBufferInfo[cmdId].draw = draw; + m_BakedCmdBufferInfo[cmdId].draw = draw; // On queue submit we increment all child events/drawcalls by // m_RootEventID insert them into the tree. - m_CmdBufferInfo[cmdId].curEventID = 1; - m_CmdBufferInfo[cmdId].eventCount = 0; - m_CmdBufferInfo[cmdId].drawCount = 0; + m_BakedCmdBufferInfo[cmdId].curEventID = 1; + m_BakedCmdBufferInfo[cmdId].eventCount = 0; + m_BakedCmdBufferInfo[cmdId].drawCount = 0; - m_CmdBufferInfo[cmdId].drawStack.push_back(draw); + m_BakedCmdBufferInfo[cmdId].drawStack.push_back(draw); } ObjDisp(device)->BeginCommandBuffer(Unwrap(cmd), &info); @@ -283,6 +285,10 @@ VkResult WrappedVulkan::vkBeginCommandBuffer( record->bakedCommands->Delete(GetResourceManager()); record->bakedCommands = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID()); + record->bakedCommands->cmdInfo = new CmdBufferRecordingInfo(); + + record->bakedCommands->cmdInfo->device = record->cmdInfo->device; + record->bakedCommands->cmdInfo->createInfo = record->cmdInfo->createInfo; { CACHE_THREAD_SERIALISER(); @@ -338,7 +344,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk m_PartialReplayData.partialParent = ResourceId(); } - m_CmdBufferInfo[cmdId].curEventID = 0; + m_BakedCmdBufferInfo[cmdId].curEventID = 0; } else if(m_State == READING) { @@ -348,7 +354,7 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk ObjDisp(cmdBuffer)->EndCommandBuffer(Unwrap(cmdBuffer)); - if(!m_CmdBufferInfo[m_LastCmdBufferID].curEvents.empty()) + if(!m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.empty()) { FetchDrawcall draw; draw.name = "API Calls"; @@ -356,11 +362,11 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk // VKTODOLOW hack, give this drawcall the same event ID as its last child, by // decrementing then incrementing again. - m_CmdBufferInfo[m_LastCmdBufferID].curEventID--; + m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID--; AddDrawcall(draw, true); - m_CmdBufferInfo[m_LastCmdBufferID].curEventID++; + m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID++; } { @@ -369,16 +375,16 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(Serialiser* localSerialiser, Vk } { - m_CmdBufferInfo[bakeId].draw = m_CmdBufferInfo[m_LastCmdBufferID].draw; - m_CmdBufferInfo[bakeId].curEventID = 0; - m_CmdBufferInfo[bakeId].eventCount = m_CmdBufferInfo[m_LastCmdBufferID].curEventID-1; - RDCASSERT(m_CmdBufferInfo[m_LastCmdBufferID].curEventID >= 1); - m_CmdBufferInfo[bakeId].drawCount = m_CmdBufferInfo[m_LastCmdBufferID].drawCount; + m_BakedCmdBufferInfo[bakeId].draw = m_BakedCmdBufferInfo[m_LastCmdBufferID].draw; + m_BakedCmdBufferInfo[bakeId].curEventID = 0; + m_BakedCmdBufferInfo[bakeId].eventCount = m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID-1; + RDCASSERT(m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID >= 1); + m_BakedCmdBufferInfo[bakeId].drawCount = m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount; - m_CmdBufferInfo[m_LastCmdBufferID].draw = NULL; - m_CmdBufferInfo[m_LastCmdBufferID].curEventID = 0; - m_CmdBufferInfo[m_LastCmdBufferID].eventCount = 0; - m_CmdBufferInfo[m_LastCmdBufferID].drawCount = 0; + m_BakedCmdBufferInfo[m_LastCmdBufferID].draw = NULL; + m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID = 0; + m_BakedCmdBufferInfo[m_LastCmdBufferID].eventCount = 0; + m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount = 0; } } @@ -415,6 +421,8 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser, SERIALISE_ELEMENT(VkCmdBufferResetFlags, fl, flags); ResourceId bakedCmdId; + VkCmdBufferCreateInfo createInfo; + VkDevice device = VK_NULL_HANDLE; if(m_State >= WRITING) { @@ -422,21 +430,22 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser, RDCASSERT(record->bakedCommands); if(record->bakedCommands) bakedCmdId = record->bakedCommands->GetResourceID(); + + RDCASSERT(record->cmdInfo); + device = record->cmdInfo->device; + createInfo = record->cmdInfo->createInfo; } SERIALISE_ELEMENT(ResourceId, bakeId, bakedCmdId); - - VkCmdBufferCreateInfo info; - VkDevice device = VK_NULL_HANDLE; - if(m_State >= WRITING) + if(m_State < WRITING) { - device = m_CmdBufferInfo[cmdId].device; - info = m_CmdBufferInfo[cmdId].createInfo; + m_LastCmdBufferID = cmdId; + m_CmdBuffersInProgress++; } SERIALISE_ELEMENT(ResourceId, devId, GetResID(device)); - localSerialiser->Serialise("createInfo", info); + localSerialiser->Serialise("createInfo", createInfo); if(m_State == EXECUTING) { @@ -449,7 +458,7 @@ bool WrappedVulkan::Serialise_vkResetCommandBuffer(Serialiser* localSerialiser, if(!GetResourceManager()->HasLiveResource(bakeId)) { - VkResult ret = ObjDisp(device)->CreateCommandBuffer(Unwrap(device), &info, &cmd); + VkResult ret = ObjDisp(device)->CreateCommandBuffer(Unwrap(device), &createInfo, &cmd); if(ret != VK_SUCCESS) { @@ -489,6 +498,10 @@ VkResult WrappedVulkan::vkResetCommandBuffer( record->bakedCommands->Delete(GetResourceManager()); record->bakedCommands = GetResourceManager()->AddResourceRecord(ResourceIDGen::GetNewUniqueID()); + record->bakedCommands->cmdInfo = new CmdBufferRecordingInfo(); + + record->bakedCommands->cmdInfo->device = record->cmdInfo->device; + record->bakedCommands->cmdInfo->createInfo = record->cmdInfo->createInfo; // VKTODOHIGH do we need to actually serialise this at all? all it does is // reset a command buffer to be able to begin again. We could just move the @@ -990,7 +1003,7 @@ void WrappedVulkan::vkCmdBindDescriptorSets( record->AddChunk(scope.Get()); record->MarkResourceFrameReferenced(GetResID(layout), eFrameRef_Read); - record->boundDescSets.insert(pDescriptorSets, pDescriptorSets + setCount); + record->cmdInfo->boundDescSets.insert(pDescriptorSets, pDescriptorSets + setCount); } } @@ -1219,7 +1232,7 @@ void WrappedVulkan::vkCmdUpdateBuffer( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } @@ -1287,7 +1300,7 @@ void WrappedVulkan::vkCmdFillBuffer( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } @@ -1421,7 +1434,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(PartialCmdBuf()); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); } } else if(m_State == READING) @@ -1431,7 +1444,7 @@ bool WrappedVulkan::Serialise_vkCmdPipelineBarrier( ObjDisp(cmdBuffer)->CmdPipelineBarrier(Unwrap(cmdBuffer), src, dest, region, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); } for(size_t i=0; i < mems.size(); i++) @@ -1514,7 +1527,7 @@ void WrappedVulkan::vkCmdPipelineBarrier( } ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); // VKTODOMED do we need to mark frame referenced the resources in the barrier? if they're not referenced // elsewhere, perhaps they can be dropped @@ -1581,7 +1594,7 @@ void WrappedVulkan::vkCmdWriteTimestamp( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } @@ -1661,7 +1674,7 @@ void WrappedVulkan::vkCmdCopyQueryPoolResults( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } @@ -1884,7 +1897,7 @@ bool WrappedVulkan::Serialise_vkCmdDbgMarkerEnd(Serialiser* localSerialiser, VkC if(m_State < WRITING) m_LastCmdBufferID = cmdid; - if(m_State == READING && !m_CmdBufferInfo[m_LastCmdBufferID].curEvents.empty()) + if(m_State == READING && !m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.empty()) { FetchDrawcall draw; draw.name = "API Calls"; diff --git a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp index a95ad5fad..04ea0b062 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_draw_funcs.cpp @@ -175,11 +175,11 @@ void WrappedVulkan::vkCmdBlitImage( record->AddChunk(scope.Get()); - record->dirtied.insert(GetResID(destImage)); + record->cmdInfo->dirtied.insert(GetResID(destImage)); { VkResourceRecord *im = GetRecord(destImage); if(im->GetMemoryRecord()) - record->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); } record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read); record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write); @@ -255,11 +255,11 @@ void WrappedVulkan::vkCmdResolveImage( record->AddChunk(scope.Get()); - record->dirtied.insert(GetResID(destImage)); + record->cmdInfo->dirtied.insert(GetResID(destImage)); { VkResourceRecord *im = GetRecord(destImage); if(im->GetMemoryRecord()) - record->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); } record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read); record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write); @@ -337,11 +337,11 @@ void WrappedVulkan::vkCmdCopyImage( record->MarkResourceFrameReferenced(GetResID(srcImage), eFrameRef_Read); record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write); - record->dirtied.insert(GetResID(destImage)); + record->cmdInfo->dirtied.insert(GetResID(destImage)); { VkResourceRecord *im = GetRecord(destImage); if(im->GetMemoryRecord()) - record->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); } } } @@ -428,11 +428,11 @@ void WrappedVulkan::vkCmdCopyBufferToImage( record->AddChunk(scope.Get()); - record->dirtied.insert(GetResID(destImage)); + record->cmdInfo->dirtied.insert(GetResID(destImage)); { VkResourceRecord *im = GetRecord(destImage); if(im->GetMemoryRecord()) - record->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(im->GetMemoryRecord()->GetResourceID()); } record->MarkResourceFrameReferenced(GetResID(srcBuffer), eFrameRef_Read); record->MarkResourceFrameReferenced(GetResID(destImage), eFrameRef_Write); @@ -512,7 +512,7 @@ void WrappedVulkan::vkCmdCopyImageToBuffer( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } @@ -601,7 +601,7 @@ void WrappedVulkan::vkCmdCopyBuffer( { VkResourceRecord *buf = GetRecord(destBuffer); if(buf->GetMemoryRecord()) - record->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); + record->cmdInfo->dirtied.insert(buf->GetMemoryRecord()->GetResourceID()); } } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 01910a1d5..045b9dee3 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -164,7 +164,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]); - GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); } AddEvent(QUEUE_SUBMIT, desc); @@ -199,7 +199,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( DrawcallTreeNode &d = GetDrawcallStack().back()->children.back(); // copy DrawcallTreeNode children - d.children = m_CmdBufferInfo[cmdIds[c]].draw->children; + d.children = m_BakedCmdBufferInfo[cmdIds[c]].draw->children; // assign new event and drawIDs RefreshIDs(d.children, m_RootEventID, m_RootDrawcallID); @@ -207,8 +207,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( m_PartialReplayData.cmdBufferSubmits[cmdIds[c]].push_back(m_RootEventID); // 1 extra for the [0] virtual event for the command buffer - m_RootEventID += 1+m_CmdBufferInfo[cmdIds[c]].eventCount; - m_RootDrawcallID += m_CmdBufferInfo[cmdIds[c]].drawCount; + m_RootEventID += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount; + m_RootDrawcallID += m_BakedCmdBufferInfo[cmdIds[c]].drawCount; } // the outer loop will increment the event ID but we've handled @@ -228,8 +228,8 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t c=0; c < numCmds; c++) { // 1 extra for the [0] virtual event for the command buffer - m_RootEventID += 1+m_CmdBufferInfo[cmdIds[c]].eventCount; - m_RootDrawcallID += m_CmdBufferInfo[cmdIds[c]].drawCount; + m_RootEventID += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount; + m_RootDrawcallID += m_BakedCmdBufferInfo[cmdIds[c]].drawCount; } m_RootEventID--; @@ -245,7 +245,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t c=0; c < numCmds; c++) { - uint32_t end = eid + m_CmdBufferInfo[cmdIds[c]].eventCount; + uint32_t end = eid + m_BakedCmdBufferInfo[cmdIds[c]].eventCount; if(eid == m_PartialReplayData.baseEvent) { @@ -265,7 +265,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( RDCDEBUG("Queue not submitting %llu", cmdIds[c]); } - eid += 1+m_CmdBufferInfo[cmdIds[c]].eventCount; + eid += 1+m_BakedCmdBufferInfo[cmdIds[c]].eventCount; } RDCASSERT(trimmedCmds.size() > 0); @@ -275,7 +275,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = trimmedCmdIds[i]; - GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); } } else @@ -285,7 +285,7 @@ bool WrappedVulkan::Serialise_vkQueueSubmit( for(uint32_t i=0; i < numCmds; i++) { ResourceId cmd = GetResourceManager()->GetLiveID(cmdIds[i]); - GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); } } } @@ -329,7 +329,7 @@ VkResult WrappedVulkan::vkQueueSubmit( for(uint32_t i=0; i < cmdBufferCount; i++) { ResourceId cmd = GetResID(pCmdBuffers[i]); - GetResourceManager()->ApplyTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo); + GetResourceManager()->ApplyTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo); VkResourceRecord *record = GetRecord(pCmdBuffers[i]); @@ -345,14 +345,14 @@ VkResult WrappedVulkan::vkQueueSubmit( SCOPED_LOCK(m_CapTransitionLock); if(m_State == WRITING_CAPFRAME) { - for(auto it = record->bakedCommands->dirtied.begin(); it != record->bakedCommands->dirtied.end(); ++it) + for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) GetResourceManager()->MarkPendingDirty(*it); capframe = true; } else { - for(auto it = record->bakedCommands->dirtied.begin(); it != record->bakedCommands->dirtied.end(); ++it) + for(auto it = record->bakedCommands->cmdInfo->dirtied.begin(); it != record->bakedCommands->cmdInfo->dirtied.end(); ++it) GetResourceManager()->MarkDirtyResource(*it); } } @@ -360,7 +360,7 @@ VkResult WrappedVulkan::vkQueueSubmit( if(capframe) { // for each bound descriptor set, mark it referenced as well as all resources currently bound to it - for(auto it = record->bakedCommands->boundDescSets.begin(); it != record->bakedCommands->boundDescSets.end(); ++it) + for(auto it = record->bakedCommands->cmdInfo->boundDescSets.begin(); it != record->bakedCommands->cmdInfo->boundDescSets.end(); ++it) { GetResourceManager()->MarkResourceFrameReferenced(GetResID(*it), eFrameRef_Read); @@ -389,7 +389,7 @@ VkResult WrappedVulkan::vkQueueSubmit( record->bakedCommands->AddRef(); } - record->dirtied.clear(); + record->cmdInfo->dirtied.clear(); } if(capframe) diff --git a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp index c3e5c1888..87ad77561 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_sync_funcs.cpp @@ -702,7 +702,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents( ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(PartialCmdBuf()); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); } } else if(m_State == READING) @@ -712,7 +712,7 @@ bool WrappedVulkan::Serialise_vkCmdWaitEvents( ObjDisp(cmdBuffer)->CmdWaitEvents(Unwrap(cmdBuffer), evcount, &events[0], src, dest, (uint32_t)mems.size(), (const void **)&mems[0]); ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); } for(size_t i=0; i < mems.size(); i++) @@ -797,7 +797,7 @@ void WrappedVulkan::vkCmdWaitEvents( } ResourceId cmd = GetResID(cmdBuffer); - GetResourceManager()->RecordTransitions(m_CmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); + GetResourceManager()->RecordTransitions(m_BakedCmdBufferInfo[cmd].imgtransitions, m_ImageInfo, (uint32_t)imTrans.size(), &imTrans[0]); record->AddChunk(scope.Get()); for(uint32_t i=0; i < eventCount; i++)