Store list ID and relative EID for each drawcall use, for lookup later

This commit is contained in:
baldurk
2016-10-21 21:44:24 +02:00
parent 9a6a05bf6d
commit 9f319e035e
4 changed files with 29 additions and 7 deletions
@@ -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;
@@ -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++)
{
+15 -2
View File
@@ -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<D3D12DrawcallTreeNode> &cmdBufNodes)
void D3D12CommandData::InsertDrawsAndRefreshIDs(ResourceId cmd,
vector<D3D12DrawcallTreeNode> &cmdBufNodes)
{
// assign new drawcall IDs
for(size_t i = 0; i < cmdBufNodes.size(); i++)
@@ -1100,7 +1113,7 @@ void D3D12CommandData::InsertDrawsAndRefreshIDs(vector<D3D12DrawcallTreeNode> &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);
+12 -3
View File
@@ -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<D3D12_RESOURCE_BARRIER> 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<D3D12DrawcallTreeNode> &cmdBufNodes);
void InsertDrawsAndRefreshIDs(ResourceId cmd, vector<D3D12DrawcallTreeNode> &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)