From db07f05f77bfdefdcf1f6e43b146e0efb4e443a2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 27 Dec 2017 13:37:04 +0000 Subject: [PATCH] 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. --- renderdoc/driver/d3d11/d3d11_context_wrap.cpp | 3 +++ .../driver/d3d12/d3d12_command_list_wrap.cpp | 22 +++++++++------- .../driver/d3d12/d3d12_command_queue_wrap.cpp | 26 ++++++++++++------- renderdoc/driver/d3d12/d3d12_commands.cpp | 6 +---- renderdoc/driver/d3d12/d3d12_commands.h | 3 +++ .../driver/gl/wrappers/gl_debug_funcs.cpp | 3 +++ renderdoc/driver/vulkan/vk_core.cpp | 8 +----- renderdoc/driver/vulkan/vk_core.h | 3 +++ .../driver/vulkan/wrappers/vk_cmd_funcs.cpp | 11 +++++++- .../driver/vulkan/wrappers/vk_queue_funcs.cpp | 13 ++++++++-- 10 files changed, 64 insertions(+), 34 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp index f17a6e841..bfd32b92b 100644 --- a/renderdoc/driver/d3d11/d3d11_context_wrap.cpp +++ b/renderdoc/driver/d3d11/d3d11_context_wrap.cpp @@ -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); } } diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 96dcfd670..4c2669096 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -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(); diff --git a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp index e1ed02573..786865907 100644 --- a/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_queue_wrap.cpp @@ -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 &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++; } diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 096d87583..b4c3955f2 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -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 } diff --git a/renderdoc/driver/d3d12/d3d12_commands.h b/renderdoc/driver/d3d12/d3d12_commands.h index 249f0b5e2..251fc4b7d 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.h +++ b/renderdoc/driver/d3d12/d3d12_commands.h @@ -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 diff --git a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp index 1ba2fd0e1..b7e4831f6 100644 --- a/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_debug_funcs.cpp @@ -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); } } diff --git a/renderdoc/driver/vulkan/vk_core.cpp b/renderdoc/driver/vulkan/vk_core.cpp index 7ff3129df..161480604 100644 --- a/renderdoc/driver/vulkan/vk_core.cpp +++ b/renderdoc/driver/vulkan/vk_core.cpp @@ -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 } diff --git a/renderdoc/driver/vulkan/vk_core.h b/renderdoc/driver/vulkan/vk_core.h index 90e2d4311..fc225a3a9 100644 --- a/renderdoc/driver/vulkan/vk_core.h +++ b/renderdoc/driver/vulkan/vk_core.h @@ -423,6 +423,9 @@ private: vector debugMessages; std::list drawStack; + uint32_t beginChunk = 0; + uint32_t endChunk = 0; + VkCommandBufferLevel level; VkCommandBufferUsageFlags beginFlags; diff --git a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp index 1e0593dcb..168a9ffe4 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_cmd_funcs.cpp @@ -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); } } diff --git a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp index 0a238ffd4..c4140a601 100644 --- a/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp +++ b/renderdoc/driver/vulkan/wrappers/vk_queue_funcs.cpp @@ -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++; }