mirror of
https://github.com/baldurk/renderdoc.git
synced 2026-10-10 14:21:31 +00:00
Add events for push/pop markers, and queue submits & cmd buf begin/end
* This means the command buffer begin/end won't just be a fake chunk with the queue submission API details, it will point to the actual begin or end chunk.
This commit is contained in:
10 files changed
+64
-34
No files matched your search
@@ -68,6 +68,7 @@ bool WrappedID3D11DeviceContext::Serialise_SetMarker(SerialiserType &ser, uint32
|
||||
draw.markerColor[2] = float(blue) / 255.0f;
|
||||
draw.markerColor[3] = float(alpha) / 255.0f;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -105,6 +106,7 @@ bool WrappedID3D11DeviceContext::Serialise_PushMarker(SerialiserType &ser, uint3
|
||||
draw.markerColor[2] = float(blue) / 255.0f;
|
||||
draw.markerColor[3] = float(alpha) / 255.0f;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -126,6 +128,7 @@ bool WrappedID3D11DeviceContext::Serialise_PopMarker(SerialiserType &ser)
|
||||
draw.name = "API Calls";
|
||||
draw.flags |= DrawFlags::SetMarker | DrawFlags::APICalls;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -114,6 +114,8 @@ bool WrappedID3D12GraphicsCommandList::Serialise_Close(SerialiserType &ser)
|
||||
baked.curEventID = 0;
|
||||
baked.parentList = CommandList;
|
||||
|
||||
baked.endChunk = uint32_t(m_Cmd->m_StructuredFile->chunks.size() - 1);
|
||||
|
||||
parent.curEventID = 0;
|
||||
parent.eventCount = 0;
|
||||
parent.drawCount = 0;
|
||||
@@ -151,9 +153,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_Reset(SerialiserType &ser,
|
||||
ID3D12PipelineState *pInitialState)
|
||||
{
|
||||
// parameters to create the list with if needed
|
||||
SERIALISE_ELEMENT_LOCAL(riid, m_Init.riid);
|
||||
SERIALISE_ELEMENT_LOCAL(nodeMask, m_Init.nodeMask);
|
||||
SERIALISE_ELEMENT_LOCAL(type, m_Init.type);
|
||||
SERIALISE_ELEMENT_LOCAL(riid, m_Init.riid).Hidden();
|
||||
SERIALISE_ELEMENT_LOCAL(nodeMask, m_Init.nodeMask).Hidden();
|
||||
SERIALISE_ELEMENT_LOCAL(type, m_Init.type).Hidden();
|
||||
|
||||
ResourceId BakedCommandList;
|
||||
|
||||
@@ -329,6 +331,9 @@ bool WrappedID3D12GraphicsCommandList::Serialise_Reset(SerialiserType &ser,
|
||||
|
||||
m_Cmd->m_BakedCmdListInfo[BakedCommandList].drawStack.push_back(draw);
|
||||
|
||||
m_Cmd->m_BakedCmdListInfo[BakedCommandList].beginChunk =
|
||||
uint32_t(m_Cmd->m_StructuredFile->chunks.size() - 1);
|
||||
|
||||
// reset state
|
||||
D3D12RenderState &state = m_Cmd->m_BakedCmdListInfo[BakedCommandList].state;
|
||||
state.m_ResourceManager = GetResourceManager();
|
||||
@@ -2853,6 +2858,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_SetMarker(SerialiserType &ser,
|
||||
draw.name = MarkerText;
|
||||
draw.flags |= DrawFlags::SetMarker;
|
||||
|
||||
m_Cmd->AddEvent();
|
||||
m_Cmd->AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -2936,6 +2942,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_BeginEvent(SerialiserType &ser,
|
||||
draw.name = MarkerText;
|
||||
draw.flags |= DrawFlags::PushMarker;
|
||||
|
||||
m_Cmd->AddEvent();
|
||||
m_Cmd->AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -3005,6 +3012,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_EndEvent(SerialiserType &ser)
|
||||
draw.name = "Pop()";
|
||||
draw.flags = DrawFlags::PopMarker;
|
||||
|
||||
m_Cmd->AddEvent();
|
||||
m_Cmd->AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -4098,13 +4106,7 @@ bool WrappedID3D12GraphicsCommandList::Serialise_ExecuteIndirect(
|
||||
else
|
||||
draw.flags |= DrawFlags::SetMarker;
|
||||
|
||||
// this drawcall needs an event to anchor its file offset. This is a bit of a hack,
|
||||
// but a proper solution for handling 'fake' events that don't correspond to actual
|
||||
// events in the file, or duplicates, is overkill.
|
||||
draw.events = {m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].curEvents.back()};
|
||||
m_Cmd->m_BakedCmdListInfo[m_Cmd->m_LastCmdListID].curEvents.pop_back();
|
||||
|
||||
m_Cmd->AddDrawcall(draw, false);
|
||||
m_Cmd->AddDrawcall(draw, true);
|
||||
|
||||
D3D12DrawcallTreeNode &drawNode = m_Cmd->GetDrawcallStack().back()->children.back();
|
||||
|
||||
|
||||
@@ -171,33 +171,37 @@ bool WrappedID3D12CommandQueue::Serialise_ExecuteCommandLists(SerialiserType &se
|
||||
{
|
||||
ResourceId cmd = GetResourceManager()->GetOriginalID(GetResID(ppCommandLists[c]));
|
||||
|
||||
BakedCmdListInfo &cmdListInfo = m_Cmd.m_BakedCmdListInfo[cmd];
|
||||
|
||||
// add a fake marker
|
||||
DrawcallDescription draw;
|
||||
draw.name = StringFormat::Fmt("=> %s[%u]: ID3D12CommandList(%s)", basename.c_str(), c,
|
||||
ToStr(cmd).c_str());
|
||||
draw.flags = DrawFlags::PassBoundary | DrawFlags::BeginPass;
|
||||
m_Cmd.AddEvent();
|
||||
|
||||
m_Cmd.m_RootEvents.back().chunkIndex = cmdListInfo.beginChunk;
|
||||
m_Cmd.m_Events.back().chunkIndex = cmdListInfo.beginChunk;
|
||||
|
||||
m_Cmd.AddDrawcall(draw, true);
|
||||
m_Cmd.m_RootEventID++;
|
||||
|
||||
BakedCmdListInfo &cmdBufInfo = m_Cmd.m_BakedCmdListInfo[cmd];
|
||||
|
||||
// insert the baked command list in-line into this list of notes, assigning new event and
|
||||
// drawIDs
|
||||
m_Cmd.InsertDrawsAndRefreshIDs(cmd, cmdBufInfo.draw->children);
|
||||
m_Cmd.InsertDrawsAndRefreshIDs(cmd, cmdListInfo.draw->children);
|
||||
|
||||
for(size_t e = 0; e < cmdBufInfo.draw->executedCmds.size(); e++)
|
||||
for(size_t e = 0; e < cmdListInfo.draw->executedCmds.size(); e++)
|
||||
{
|
||||
vector<uint32_t> &submits = m_Cmd.m_Partial[D3D12CommandData::Secondary]
|
||||
.cmdListExecs[cmdBufInfo.draw->executedCmds[e]];
|
||||
.cmdListExecs[cmdListInfo.draw->executedCmds[e]];
|
||||
|
||||
for(size_t s = 0; s < submits.size(); s++)
|
||||
submits[s] += m_Cmd.m_RootEventID;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < cmdBufInfo.debugMessages.size(); i++)
|
||||
for(size_t i = 0; i < cmdListInfo.debugMessages.size(); i++)
|
||||
{
|
||||
DebugMessage msg = cmdBufInfo.debugMessages[i];
|
||||
DebugMessage msg = cmdListInfo.debugMessages[i];
|
||||
msg.eventId += m_Cmd.m_RootEventID;
|
||||
m_pDevice->AddDebugMessage(msg);
|
||||
}
|
||||
@@ -205,13 +209,17 @@ bool WrappedID3D12CommandQueue::Serialise_ExecuteCommandLists(SerialiserType &se
|
||||
// only primary command lists can be submitted
|
||||
m_Cmd.m_Partial[D3D12CommandData::Primary].cmdListExecs[cmd].push_back(m_Cmd.m_RootEventID);
|
||||
|
||||
m_Cmd.m_RootEventID += cmdBufInfo.eventCount;
|
||||
m_Cmd.m_RootDrawcallID += cmdBufInfo.drawCount;
|
||||
m_Cmd.m_RootEventID += cmdListInfo.eventCount;
|
||||
m_Cmd.m_RootDrawcallID += cmdListInfo.drawCount;
|
||||
|
||||
draw.name =
|
||||
StringFormat::Fmt("=> %s[%u]: Close(%s)", basename.c_str(), c, ToStr(cmd).c_str());
|
||||
draw.flags = DrawFlags::PassBoundary | DrawFlags::EndPass;
|
||||
m_Cmd.AddEvent();
|
||||
|
||||
m_Cmd.m_RootEvents.back().chunkIndex = cmdListInfo.endChunk;
|
||||
m_Cmd.m_Events.back().chunkIndex = cmdListInfo.endChunk;
|
||||
|
||||
m_Cmd.AddDrawcall(draw, true);
|
||||
m_Cmd.m_RootEventID++;
|
||||
}
|
||||
|
||||
@@ -493,11 +493,7 @@ bool WrappedID3D12CommandQueue::ProcessChunk(ReadSerialiser &ser, D3D12Chunk chu
|
||||
|
||||
if(IsLoading(m_State))
|
||||
{
|
||||
if(chunk == D3D12Chunk::PushMarker)
|
||||
{
|
||||
// no push/pop necessary
|
||||
}
|
||||
else if(chunk == D3D12Chunk::SetMarker || chunk == D3D12Chunk::PopMarker)
|
||||
if(chunk == D3D12Chunk::List_Reset || chunk == D3D12Chunk::List_Close)
|
||||
{
|
||||
// don't add these events - they will be handled when inserted in-line into queue submit
|
||||
}
|
||||
|
||||
@@ -158,6 +158,9 @@ struct BakedCmdListInfo
|
||||
// a partial replay
|
||||
int markerCount;
|
||||
|
||||
uint32_t beginChunk = 0;
|
||||
uint32_t endChunk = 0;
|
||||
|
||||
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
|
||||
|
||||
@@ -170,6 +170,7 @@ bool WrappedOpenGL::Serialise_glDebugMessageInsert(SerialiserType &ser, GLenum s
|
||||
draw.name = name;
|
||||
draw.flags |= DrawFlags::SetMarker;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -238,6 +239,7 @@ bool WrappedOpenGL::Serialise_glInsertEventMarkerEXT(SerialiserType &ser, GLsize
|
||||
draw.name = marker;
|
||||
draw.flags |= DrawFlags::SetMarker;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -300,6 +302,7 @@ bool WrappedOpenGL::Serialise_glPushDebugGroup(SerialiserType &ser, GLenum sourc
|
||||
draw.name = name;
|
||||
draw.flags |= DrawFlags::PushMarker;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1804,13 +1804,7 @@ bool WrappedVulkan::ContextProcessChunk(ReadSerialiser &ser, VulkanChunk chunk)
|
||||
|
||||
if(IsLoading(m_State))
|
||||
{
|
||||
if(chunk == VulkanChunk::vkCmdDebugMarkerInsertEXT)
|
||||
{
|
||||
// no push/pop necessary
|
||||
}
|
||||
else if(chunk == VulkanChunk::vkBeginCommandBuffer || chunk == VulkanChunk::vkEndCommandBuffer ||
|
||||
chunk == VulkanChunk::vkCmdDebugMarkerBeginEXT ||
|
||||
chunk == VulkanChunk::vkCmdDebugMarkerEndEXT)
|
||||
if(chunk == VulkanChunk::vkBeginCommandBuffer || chunk == VulkanChunk::vkEndCommandBuffer)
|
||||
{
|
||||
// don't add these events - they will be handled when inserted in-line into queue submit
|
||||
}
|
||||
|
||||
@@ -423,6 +423,9 @@ private:
|
||||
vector<DebugMessage> debugMessages;
|
||||
std::list<VulkanDrawcallTreeNode *> drawStack;
|
||||
|
||||
uint32_t beginChunk = 0;
|
||||
uint32_t endChunk = 0;
|
||||
|
||||
VkCommandBufferLevel level;
|
||||
VkCommandBufferUsageFlags beginFlags;
|
||||
|
||||
|
||||
@@ -556,7 +556,7 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman
|
||||
SERIALISE_ELEMENT_LOCAL(BeginInfo, *pBeginInfo);
|
||||
SERIALISE_ELEMENT(BakedCommandBuffer);
|
||||
SERIALISE_ELEMENT(device);
|
||||
SERIALISE_ELEMENT(AllocateInfo);
|
||||
SERIALISE_ELEMENT(AllocateInfo).Hidden();
|
||||
|
||||
SERIALISE_CHECK_READ_ERRORS();
|
||||
|
||||
@@ -745,6 +745,9 @@ bool WrappedVulkan::Serialise_vkBeginCommandBuffer(SerialiserType &ser, VkComman
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].drawCount = 0;
|
||||
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].drawStack.push_back(draw);
|
||||
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].beginChunk =
|
||||
uint32_t(m_StructuredFile->chunks.size() - 1);
|
||||
}
|
||||
|
||||
ObjDisp(device)->BeginCommandBuffer(Unwrap(cmd), &unwrappedBeginInfo);
|
||||
@@ -898,6 +901,9 @@ bool WrappedVulkan::Serialise_vkEndCommandBuffer(SerialiserType &ser, VkCommandB
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].curEventID;
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].curEventID = 0;
|
||||
|
||||
m_BakedCmdBufferInfo[BakedCommandBuffer].endChunk =
|
||||
uint32_t(m_StructuredFile->chunks.size() - 1);
|
||||
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].curEventID = 0;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].eventCount = 0;
|
||||
m_BakedCmdBufferInfo[m_LastCmdBufferID].drawCount = 0;
|
||||
@@ -2702,6 +2708,7 @@ bool WrappedVulkan::Serialise_vkCmdDebugMarkerBeginEXT(SerialiserType &ser,
|
||||
draw.markerColor[2] = RDCCLAMP(Marker.color[2], 0.0f, 1.0f);
|
||||
draw.markerColor[3] = RDCCLAMP(Marker.color[3], 0.0f, 1.0f);
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -2776,6 +2783,7 @@ bool WrappedVulkan::Serialise_vkCmdDebugMarkerEndEXT(SerialiserType &ser,
|
||||
draw.name = "Pop()";
|
||||
draw.flags = DrawFlags::PopMarker;
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
@@ -2841,6 +2849,7 @@ bool WrappedVulkan::Serialise_vkCmdDebugMarkerInsertEXT(SerialiserType &ser,
|
||||
draw.markerColor[2] = RDCCLAMP(Marker.color[2], 0.0f, 1.0f);
|
||||
draw.markerColor[3] = RDCCLAMP(Marker.color[3], 0.0f, 1.0f);
|
||||
|
||||
AddEvent();
|
||||
AddDrawcall(draw, false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,6 +178,9 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
|
||||
{
|
||||
ResourceId cmd =
|
||||
GetResourceManager()->GetOriginalID(GetResID(submitInfo.pCommandBuffers[c]));
|
||||
|
||||
BakedCmdBufferInfo &cmdBufInfo = m_BakedCmdBufferInfo[cmd];
|
||||
|
||||
GetResourceManager()->ApplyBarriers(m_BakedCmdBufferInfo[cmd].imgbarriers, m_ImageLayouts);
|
||||
|
||||
std::string name = StringFormat::Fmt("=> %s[%u]: vkBeginCommandBuffer(%s)",
|
||||
@@ -188,11 +191,13 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
|
||||
draw.name = name;
|
||||
draw.flags |= DrawFlags::SetMarker;
|
||||
AddEvent();
|
||||
|
||||
m_RootEvents.back().chunkIndex = cmdBufInfo.beginChunk;
|
||||
m_Events.back().chunkIndex = cmdBufInfo.beginChunk;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
m_RootEventID++;
|
||||
|
||||
BakedCmdBufferInfo &cmdBufInfo = m_BakedCmdBufferInfo[cmd];
|
||||
|
||||
// insert the baked command buffer in-line into this list of notes, assigning new event
|
||||
// and drawIDs
|
||||
InsertDrawsAndRefreshIDs(cmdBufInfo.draw->children);
|
||||
@@ -228,6 +233,10 @@ bool WrappedVulkan::Serialise_vkQueueSubmit(SerialiserType &ser, VkQueue queue,
|
||||
ToStr(cmd).c_str());
|
||||
draw.name = name;
|
||||
AddEvent();
|
||||
|
||||
m_RootEvents.back().chunkIndex = cmdBufInfo.endChunk;
|
||||
m_Events.back().chunkIndex = cmdBufInfo.endChunk;
|
||||
|
||||
AddDrawcall(draw, true);
|
||||
m_RootEventID++;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user