From b87c22b0810fe821d62201e5a14c299aae31ebbe Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 10 Jan 2022 14:51:24 +0000 Subject: [PATCH] Track command buffer and root debug msgs separately. Closes #2435 * This also prevents messages from being populated after initial load to avoid a never-ending increase of messages. --- renderdoc/driver/d3d11/d3d11_device.cpp | 2 + renderdoc/driver/vulkan/vk_core.cpp | 29 +++++++++----- renderdoc/driver/vulkan/vk_core.h | 2 +- .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 38 +++++++++---------- 4 files changed, 42 insertions(+), 29 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index ebc026f01..4b54f55ee 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -2278,6 +2278,8 @@ bool WrappedID3D11Device::EndFrameCapture(void *dev, void *wnd) RDCERR("NULL deferred context in resource record!"); } + m_DebugMessages.clear(); + GetResourceManager()->ClearReferencedResources(); GetResourceManager()->FreeInitialContents(); diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 31b77a02e..43bba5120 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -1777,6 +1777,8 @@ void WrappedVulkan::StartFrameCapture(void *dev, void *wnd) frame.captureTime = Timing::GetUnixTimestamp(); m_CapturedFrames.push_back(frame); + m_DebugMessages.clear(); + GetResourceManager()->ClearReferencedResources(); GetResourceManager()->ClearReferencedMemory(); @@ -3977,9 +3979,22 @@ void WrappedVulkan::AddDebugMessage(MessageCategory c, MessageSeverity sv, Messa void WrappedVulkan::AddDebugMessage(DebugMessage msg) { if(IsLoading(m_State)) - m_EventMessages.push_back(msg); + { + if(m_LastCmdBufferID != ResourceId()) + { + msg.eventId = m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID; + m_BakedCmdBufferInfo[m_LastCmdBufferID].debugMessages.push_back(msg); + } + else + { + msg.eventId = m_RootEventID; + m_RootEventMessages.push_back(msg); + } + } else + { m_DebugMessages.push_back(msg); + } } void WrappedVulkan::CheckErrorVkResult(VkResult vkr) @@ -4034,7 +4049,7 @@ VkBool32 WrappedVulkan::DebugCallback(MessageSeverity severity, MessageCategory // function calls are replayed after the call to Serialise_DebugMessages() so we don't have a // sync point to gather together all the messages from the sink. But instead we can just push // them directly into the list since we're linearised - if(IsReplayMode(m_State)) + if(IsLoading(m_State)) { ProcessDebugMessage(msg); AddDebugMessage(msg); @@ -4678,13 +4693,9 @@ void WrappedVulkan::AddEvent() apievent.chunkIndex = uint32_t(m_StructuredFile->chunks.size() - 1); - for(size_t i = 0; i < m_EventMessages.size(); i++) - m_EventMessages[i].eventId = apievent.eventId; - if(m_LastCmdBufferID != ResourceId()) { m_BakedCmdBufferInfo[m_LastCmdBufferID].curEvents.push_back(apievent); - m_BakedCmdBufferInfo[m_LastCmdBufferID].debugMessages.append(m_EventMessages); } else { @@ -4692,10 +4703,10 @@ void WrappedVulkan::AddEvent() m_Events.resize(apievent.eventId + 1); m_Events[apievent.eventId] = apievent; - m_DebugMessages.append(m_EventMessages); - } + m_DebugMessages.append(m_RootEventMessages); - m_EventMessages.clear(); + m_RootEventMessages.clear(); + } } const APIEvent &WrappedVulkan::GetEvent(uint32_t eventId) diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 0fb4bf93b..e0780e204 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -278,7 +278,7 @@ private: // the messages retrieved for the current event (filled in Serialise_vk...() and read in // AddEvent()) - rdcarray m_EventMessages; + rdcarray m_RootEventMessages; // list of all debug messages by EID in the frame rdcarray m_DebugMessages; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 35898b601..d4affffb5 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -967,7 +967,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman InsertCommandQueueFamily(BakedCommandBuffer, cmdQueueFamilyIt->second); } - m_LastCmdBufferID = CommandBuffer; + m_LastCmdBufferID = BakedCommandBuffer; // when loading, allocate a new resource ID for each push descriptor slot in this command buffer if(IsLoading(m_State)) @@ -990,12 +990,12 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman } } - m_BakedCmdBufferInfo[m_LastCmdBufferID].level = m_BakedCmdBufferInfo[BakedCommandBuffer].level = + m_BakedCmdBufferInfo[CommandBuffer].level = m_BakedCmdBufferInfo[BakedCommandBuffer].level = AllocateInfo.level; - m_BakedCmdBufferInfo[m_LastCmdBufferID].beginFlags = + m_BakedCmdBufferInfo[CommandBuffer].beginFlags = m_BakedCmdBufferInfo[BakedCommandBuffer].beginFlags = BeginInfo.flags; - m_BakedCmdBufferInfo[m_LastCmdBufferID].markerCount = 0; - m_BakedCmdBufferInfo[m_LastCmdBufferID].imageStates.clear(); + m_BakedCmdBufferInfo[CommandBuffer].markerCount = 0; + m_BakedCmdBufferInfo[CommandBuffer].imageStates.clear(); m_BakedCmdBufferInfo[BakedCommandBuffer].imageStates.clear(); VkCommandBufferBeginInfo unwrappedBeginInfo = BeginInfo; @@ -1042,7 +1042,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman { #if ENABLED(VERBOSE_PARTIAL_REPLAY) RDCDEBUG("vkBegin - partial detected %u < %u < %u, %s -> %s", it->baseEvent, - m_LastEventID, it->baseEvent + length, ToStr(m_LastCmdBufferID).c_str(), + m_LastEventID, it->baseEvent + length, ToStr(CommandBuffer).c_str(), ToStr(BakedCommandBuffer).c_str()); #endif @@ -1061,7 +1061,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman { #if ENABLED(VERBOSE_PARTIAL_REPLAY) RDCDEBUG("vkBegin - full re-record detected %u < %u <= %u, %s -> %s", it->baseEvent, - it->baseEvent + length, m_LastEventID, ToStr(m_LastCmdBufferID).c_str(), + it->baseEvent + length, m_LastEventID, ToStr(CommandBuffer).c_str(), ToStr(BakedCommandBuffer).c_str()); #endif @@ -1089,7 +1089,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman } #if ENABLED(VERBOSE_PARTIAL_REPLAY) - RDCDEBUG("vkBegin - re-recording %s -> %s into %s", ToStr(m_LastCmdBufferID).c_str(), + RDCDEBUG("vkBegin - re-recording %s -> %s into %s", ToStr(CommandBuffer).c_str(), ToStr(BakedCommandBuffer).c_str(), ToStr(GetResID(cmd)).c_str()); #endif @@ -1103,8 +1103,8 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman // (even if it's baked to several command buffers in the frame) // there's no issue with clashes here. m_RerecordCmds[BakedCommandBuffer] = cmd; - m_RerecordCmds[m_LastCmdBufferID] = cmd; - InsertCommandQueueFamily(BakedCommandBuffer, FindCommandQueueFamily(m_LastCmdBufferID)); + m_RerecordCmds[CommandBuffer] = cmd; + InsertCommandQueueFamily(BakedCommandBuffer, FindCommandQueueFamily(CommandBuffer)); m_RerecordCmdList.push_back({AllocateInfo.commandPool, cmd}); @@ -1127,12 +1127,12 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman // whenever a vkCmd command-building chunk asks for the command buffer, it // will get our baked version. - if(GetResourceManager()->HasReplacement(m_LastCmdBufferID)) - GetResourceManager()->RemoveReplacement(m_LastCmdBufferID); + if(GetResourceManager()->HasReplacement(CommandBuffer)) + GetResourceManager()->RemoveReplacement(CommandBuffer); - GetResourceManager()->ReplaceResource(m_LastCmdBufferID, BakedCommandBuffer); + GetResourceManager()->ReplaceResource(CommandBuffer, BakedCommandBuffer); - m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID = 0; + m_BakedCmdBufferInfo[CommandBuffer].curEventID = 0; m_BakedCmdBufferInfo[BakedCommandBuffer].curEventID = 0; } else @@ -1173,10 +1173,10 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman // whenever a vkCmd command-building chunk asks for the command buffer, it // will get our baked version. - if(GetResourceManager()->HasReplacement(m_LastCmdBufferID)) - GetResourceManager()->RemoveReplacement(m_LastCmdBufferID); + if(GetResourceManager()->HasReplacement(CommandBuffer)) + GetResourceManager()->RemoveReplacement(CommandBuffer); - GetResourceManager()->ReplaceResource(m_LastCmdBufferID, BakedCommandBuffer); + GetResourceManager()->ReplaceResource(CommandBuffer, BakedCommandBuffer); } else { @@ -1184,9 +1184,9 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman } // propagate any name there might be - if(m_CreationInfo.m_Names.find(m_LastCmdBufferID) != m_CreationInfo.m_Names.end()) + if(m_CreationInfo.m_Names.find(CommandBuffer) != m_CreationInfo.m_Names.end()) m_CreationInfo.m_Names[GetResourceManager()->GetLiveID(BakedCommandBuffer)] = - m_CreationInfo.m_Names[m_LastCmdBufferID]; + m_CreationInfo.m_Names[CommandBuffer]; { VulkanActionTreeNode *action = new VulkanActionTreeNode;