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.
This commit is contained in:
baldurk
2022-01-10 14:51:24 +00:00
parent cc2d49ad1c
commit b87c22b081
4 changed files with 42 additions and 29 deletions
+2
View File
@@ -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();
+20 -9
View File
@@ -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)
+1 -1
View File
@@ -278,7 +278,7 @@ private:
// the messages retrieved for the current event (filled in Serialise_vk...() and read in
// AddEvent())
rdcarray<DebugMessage> m_EventMessages;
rdcarray<DebugMessage> m_RootEventMessages;
// list of all debug messages by EID in the frame
rdcarray<DebugMessage> m_DebugMessages;
@@ -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;