From d6e88ae4fad66138983a4c67ee5d56613c28a64c Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 10 Feb 2021 15:03:19 +0000 Subject: [PATCH] Remove redundant callstack member in APIEvent * We already link to the chunk index and the chunk metadata contains the callstack, there's no need for a duplicate copy when there may be many APIEvents in a capture --- qrenderdoc/Windows/APIInspector.cpp | 30 +++++++++++++++-------- renderdoc/api/replay/data_types.h | 6 ----- renderdoc/driver/d3d11/d3d11_context.cpp | 2 -- renderdoc/driver/d3d12/d3d12_commands.cpp | 2 -- renderdoc/driver/gl/gl_driver.cpp | 2 -- renderdoc/driver/vulkan/vk_core.cpp | 2 -- renderdoc/replay/renderdoc_serialise.inl | 3 +-- util/test/tests/GL/GL_Callstacks.py | 10 +++++++- 8 files changed, 30 insertions(+), 27 deletions(-) diff --git a/qrenderdoc/Windows/APIInspector.cpp b/qrenderdoc/Windows/APIInspector.cpp index 46d149083..e1a716465 100644 --- a/qrenderdoc/Windows/APIInspector.cpp +++ b/qrenderdoc/Windows/APIInspector.cpp @@ -25,8 +25,6 @@ #include "APIInspector.h" #include "ui_APIInspector.h" -Q_DECLARE_METATYPE(APIEvent); - APIInspector::APIInspector(ICaptureContext &ctx, QWidget *parent) : QFrame(parent), ui(new Ui::APIInspector), m_Ctx(ctx) { @@ -159,17 +157,27 @@ void APIInspector::on_apiEvents_itemSelectionChanged() { RDTreeWidgetItem *node = ui->apiEvents->selectedItem(); - if(!node) - return; + SDChunk *chunk = NULL; + // search up the tree to find the next parent with a chunk tag + while(node) + { + chunk = (SDChunk *)node->tag().value(); - APIEvent ev = node->tag().value(); + // if we found one, break + if(chunk) + break; - if(!ev.callstack.isEmpty()) + // move to the parent + node = node->parent(); + } + + if(chunk && !chunk->metadata.callstack.isEmpty()) { if(m_Ctx.Replay().GetCaptureAccess()) { - m_Ctx.Replay().AsyncInvoke([this, ev](IReplayController *) { - rdcarray stack = m_Ctx.Replay().GetCaptureAccess()->GetResolve(ev.callstack); + m_Ctx.Replay().AsyncInvoke([this, chunk](IReplayController *) { + rdcarray stack = + m_Ctx.Replay().GetCaptureAccess()->GetResolve(chunk->metadata.callstack); GUIInvoke::call(this, [this, stack]() { addCallstack(stack); }); }); @@ -207,9 +215,11 @@ void APIInspector::fillAPIView() { RDTreeWidgetItem *root = new RDTreeWidgetItem({QString::number(ev.eventId), QString()}); + SDChunk *chunk = NULL; + if(ev.chunkIndex < file.chunks.size()) { - SDChunk *chunk = file.chunks[ev.chunkIndex]; + chunk = file.chunks[ev.chunkIndex]; m_Chunks.push_back(chunk); @@ -225,7 +235,7 @@ void APIInspector::fillAPIView() if(ev.eventId == draw->eventId) root->setBold(true); - root->setTag(QVariant::fromValue(ev)); + root->setTag(QVariant::fromValue((quintptr)(void *)chunk)); ui->apiEvents->addTopLevelItem(root); diff --git a/renderdoc/api/replay/data_types.h b/renderdoc/api/replay/data_types.h index b7dab2eeb..297b1c206 100644 --- a/renderdoc/api/replay/data_types.h +++ b/renderdoc/api/replay/data_types.h @@ -723,12 +723,6 @@ of results part way through the multi draw. )"); uint32_t eventId = 0; - DOCUMENT(R"(The addresses in the CPU callstack where this function was called. - -:type: List[int] -)"); - rdcarray callstack; - DOCUMENT("The chunk index for this function call in the structured file."); uint32_t chunkIndex = 0; diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 12db15bb9..c388f2164 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1173,8 +1173,6 @@ void WrappedID3D11DeviceContext::AddEvent() apievent.chunkIndex = uint32_t(m_StructuredFile->chunks.size() - 1); - apievent.callstack = m_ChunkMetadata.callstack; - m_CurEvents.push_back(apievent); if(IsLoading(m_State)) diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 74f1ed76b..9f50af853 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -1612,8 +1612,6 @@ void D3D12CommandData::AddEvent() apievent.chunkIndex = uint32_t(m_StructuredFile->chunks.size() - 1); - apievent.callstack = m_ChunkMetadata.callstack; - // if we're using replay-time debug messages, fetch them now since we can do better to correlate // to events on replay if(m_pDevice->GetReplayOptions().apiValidation) diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 10212b330..bc94615bf 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -5620,8 +5620,6 @@ void WrappedOpenGL::AddEvent() apievent.chunkIndex = uint32_t(m_StructuredFile->chunks.size() - 1); - apievent.callstack = m_ChunkMetadata.callstack; - m_CurEvents.push_back(apievent); if(IsLoading(m_State)) diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 1102bfb2d..a34179dfb 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -4393,8 +4393,6 @@ void WrappedVulkan::AddEvent() apievent.chunkIndex = uint32_t(m_StructuredFile->chunks.size() - 1); - apievent.callstack = m_ChunkMetadata.callstack; - for(size_t i = 0; i < m_EventMessages.size(); i++) m_EventMessages[i].eventId = apievent.eventId; diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 732fdff3d..ddaaad8d7 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -537,11 +537,10 @@ template void DoSerialise(SerialiserType &ser, APIEvent &el) { SERIALISE_MEMBER(eventId); - SERIALISE_MEMBER(callstack); SERIALISE_MEMBER(chunkIndex); SERIALISE_MEMBER(fileOffset); - SIZE_CHECK(48); + SIZE_CHECK(16); } template diff --git a/util/test/tests/GL/GL_Callstacks.py b/util/test/tests/GL/GL_Callstacks.py index 6d6c89ad2..a256a2a02 100644 --- a/util/test/tests/GL/GL_Callstacks.py +++ b/util/test/tests/GL/GL_Callstacks.py @@ -51,7 +51,15 @@ class GL_Callstacks(rdtest.TestCase): 8002 ] - callstack = cap.GetResolve(list(event.callstack)) + sdfile = self.controller.GetStructuredFile() + + if event.chunkIndex < 0 or event.chunkIndex > len(sdfile.chunks): + raise rdtest.TestFailureException("Event {} has invalid chunk index {}" + .format(event.eventId, event.chunkIndex)) + + chunk = sdfile.chunks[event.chunkIndex] + + callstack = cap.GetResolve(list(chunk.metadata.callstack)) if len(callstack) < len(expected_funcs): raise rdtest.TestFailureException("Resolved callstack isn't long enough ({} stack frames), expected at least {}".format(len(event.callstack), len(expected_funcs)))