From 9f319e035ee912b519e88c74715c5d4ff9dc71f5 Mon Sep 17 00:00:00 2001 From: baldurk Date: Fri, 21 Oct 2016 14:14:53 +0200 Subject: [PATCH] Store list ID and relative EID for each drawcall use, for lookup later --- .../driver/d3d12/d3d12_command_list_wrap.cpp | 2 +- .../driver/d3d12/d3d12_command_queue_wrap.cpp | 2 +- renderdoc/driver/d3d12/d3d12_commands.cpp | 17 +++++++++++++++-- renderdoc/driver/d3d12/d3d12_commands.h | 15 ++++++++++++--- 4 files changed, 29 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 1318659c8..f9a0564e1 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -104,7 +104,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_Close() m_Cmd->GetDrawcallStack().pop_back(); } - m_Cmd->m_BakedCmdListInfo[bakeId].BakeFrom(m_Cmd->m_BakedCmdListInfo[CommandList]); + m_Cmd->m_BakedCmdListInfo[bakeId].BakeFrom(CommandList, m_Cmd->m_BakedCmdListInfo[CommandList]); } return true; diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index f26b5d146..bebaa8d30 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -157,7 +157,7 @@ bool WrappedID3D12CommandQueue::Serialise_ExecuteCommandLists(UINT NumCommandLis // insert the baked command list in-line into this list of notes, assigning new event and // drawIDs - m_Cmd.InsertDrawsAndRefreshIDs(cmdBufInfo.draw->children); + m_Cmd.InsertDrawsAndRefreshIDs(cmdIds[c], cmdBufInfo.draw->children); for(size_t e = 0; e < cmdBufInfo.draw->executedCmds.size(); e++) { diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index fa0e84142..525b783f3 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -472,8 +472,20 @@ void WrappedID3D12CommandQueue::ReplayLog(LogState readType, uint32_t startEvent // past the command list records, so can't // skip to the file offset of the first event if(partial) + { m_pSerialiser->SetOffset(ev.fileOffset); + D3D12CommandData::DrawcallUse use(ev.fileOffset, 0); + auto it = std::lower_bound(m_Cmd.m_DrawcallUses.begin(), m_Cmd.m_DrawcallUses.end(), use); + + if(it != m_Cmd.m_DrawcallUses.end()) + { + BakedCmdListInfo &cmdInfo = + m_Cmd.m_BakedCmdListInfo[m_Cmd.m_BakedCmdListInfo[it->cmdList].parentList]; + cmdInfo.curEventID = it->relativeEID; + } + } + m_Cmd.m_FirstEventID = startEventID; m_Cmd.m_LastEventID = endEventID; } @@ -1075,7 +1087,8 @@ void D3D12CommandData::AddDrawcall(const FetchDrawcall &d, bool hasEvents) RDCERR("Somehow lost drawcall stack!"); } -void D3D12CommandData::InsertDrawsAndRefreshIDs(vector &cmdBufNodes) +void D3D12CommandData::InsertDrawsAndRefreshIDs(ResourceId cmd, + vector &cmdBufNodes) { // assign new drawcall IDs for(size_t i = 0; i < cmdBufNodes.size(); i++) @@ -1100,7 +1113,7 @@ void D3D12CommandData::InsertDrawsAndRefreshIDs(vector &c m_Events.push_back(n.draw.events[e]); } - DrawcallUse use(m_Events.back().fileOffset, n.draw.eventID); + DrawcallUse use(m_Events.back().fileOffset, n.draw.eventID, cmd, cmdBufNodes[i].draw.eventID); // insert in sorted location auto drawit = std::lower_bound(m_DrawcallUses.begin(), m_DrawcallUses.end(), use); diff --git a/renderdoc/driver/d3d12/d3d12_commands.h b/renderdoc/driver/d3d12/d3d12_commands.h index e4d1c300f..12f2b75d3 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.h +++ b/renderdoc/driver/d3d12/d3d12_commands.h @@ -123,7 +123,7 @@ struct D3D12DrawcallCallback struct BakedCmdListInfo { - void BakeFrom(BakedCmdListInfo &parent) + void BakeFrom(ResourceId parentID, BakedCmdListInfo &parent) { draw = parent.draw; curEvents = parent.curEvents; @@ -132,6 +132,8 @@ struct BakedCmdListInfo drawCount = parent.drawCount; crackedLists.swap(parent.crackedLists); + parentList = parentID; + curEventID = 0; parent.draw = NULL; @@ -156,6 +158,8 @@ struct BakedCmdListInfo vector barriers; + ResourceId parentList; + D3D12DrawcallTreeNode *draw; // the root draw to copy from when submitting uint32_t eventCount; // how many events are in this cmd list, for quick skipping uint32_t curEventID; // current event ID while reading or executing @@ -243,7 +247,7 @@ struct D3D12CommandData uint32_t baseEvent; } m_Partial[ePartialNum]; - void InsertDrawsAndRefreshIDs(vector &cmdBufNodes); + void InsertDrawsAndRefreshIDs(ResourceId cmd, vector &cmdBufNodes); // this is a list of uint64_t file offset -> uint32_t EIDs of where each // drawcall is used. E.g. the drawcall at offset 873954 is EID 50. If a @@ -252,9 +256,14 @@ struct D3D12CommandData // the first one being the 'primary' struct DrawcallUse { - DrawcallUse(uint64_t offs, uint32_t eid) : fileOffset(offs), eventID(eid) {} + DrawcallUse(uint64_t offs, uint32_t eid, ResourceId cmd = ResourceId(), uint32_t rel = 0) + : fileOffset(offs), cmdList(cmd), eventID(eid), relativeEID(rel) + { + } uint64_t fileOffset; + ResourceId cmdList; uint32_t eventID; + uint32_t relativeEID; bool operator<(const DrawcallUse &o) const { if(fileOffset != o.fileOffset)