diff --git a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp index 186b27b76..010b493bc 100644 --- a/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp +++ b/renderdoc/driver/d3d12/d3d12_command_list_wrap.cpp @@ -1684,19 +1684,160 @@ void WrappedID3D12GraphicsCommandList::SetPredication(ID3D12Resource *pBuffer, m_pReal->SetPredication(Unwrap(pBuffer), AlignedBufferOffset, Operation); } +bool WrappedID3D12GraphicsCommandList::Serialise_SetMarker(UINT Metadata, const void *pData, UINT Size) +{ + string markerText = ""; + + if(m_State >= WRITING && pData && Size) + { + static const UINT PIX_EVENT_UNICODE_VERSION = 0; + static const UINT PIX_EVENT_ANSI_VERSION = 1; + + if(Metadata == PIX_EVENT_UNICODE_VERSION) + { + const wchar_t *w = (const wchar_t *)pData; + markerText = StringFormat::Wide2UTF8(std::wstring(w, w + Size)); + } + else if(Metadata == PIX_EVENT_ANSI_VERSION) + { + const char *c = (const char *)pData; + markerText = string(c, c + Size); + } + else + { + RDCERR("Unexpected/unsupported Metadata value %u in SetMarker", Metadata); + } + } + + SERIALISE_ELEMENT(ResourceId, CommandList, GetResourceID()); + m_pSerialiser->Serialise("MarkerText", markerText); + + if(m_State < WRITING) + m_Cmd->m_LastCmdListID = CommandList; + + if(m_State == READING) + { + FetchDrawcall draw; + draw.name = markerText; + draw.flags |= eDraw_SetMarker; + + m_Cmd->AddDrawcall(draw, false); + } + + return true; +} + void WrappedID3D12GraphicsCommandList::SetMarker(UINT Metadata, const void *pData, UINT Size) { m_pReal->SetMarker(Metadata, pData, Size); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(SET_MARKER); + Serialise_SetMarker(Metadata, pData, Size); + + m_ListRecord->AddChunk(scope.Get()); + } +} + +bool WrappedID3D12GraphicsCommandList::Serialise_BeginEvent(UINT Metadata, const void *pData, + UINT Size) +{ + string markerText = ""; + + if(m_State >= WRITING && pData && Size) + { + static const UINT PIX_EVENT_UNICODE_VERSION = 0; + static const UINT PIX_EVENT_ANSI_VERSION = 1; + + if(Metadata == PIX_EVENT_UNICODE_VERSION) + { + const wchar_t *w = (const wchar_t *)pData; + markerText = StringFormat::Wide2UTF8(std::wstring(w, w + Size)); + } + else if(Metadata == PIX_EVENT_ANSI_VERSION) + { + const char *c = (const char *)pData; + markerText = string(c, c + Size); + } + else + { + RDCERR("Unexpected/unsupported Metadata value %u in BeginEvent", Metadata); + } + } + + SERIALISE_ELEMENT(ResourceId, CommandList, GetResourceID()); + m_pSerialiser->Serialise("MarkerText", markerText); + + if(m_State < WRITING) + m_Cmd->m_LastCmdListID = CommandList; + + if(m_State == READING) + { + FetchDrawcall draw; + draw.name = markerText; + draw.flags |= eDraw_PushMarker; + + m_Cmd->AddDrawcall(draw, false); + } + + return true; } void WrappedID3D12GraphicsCommandList::BeginEvent(UINT Metadata, const void *pData, UINT Size) { m_pReal->BeginEvent(Metadata, pData, Size); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(BEGIN_EVENT); + Serialise_BeginEvent(Metadata, pData, Size); + + m_ListRecord->AddChunk(scope.Get()); + } +} + +bool WrappedID3D12GraphicsCommandList::Serialise_EndEvent() +{ + SERIALISE_ELEMENT(ResourceId, CommandList, GetResourceID()); + + if(m_State < WRITING) + m_Cmd->m_LastCmdListID = CommandList; + + if(m_State == READING && !m_Cmd->m_BakedCmdListInfo[CommandList].curEvents.empty()) + { + FetchDrawcall draw; + draw.name = "API Calls"; + draw.flags = eDraw_SetMarker; + + m_Cmd->AddDrawcall(draw, true); + } + + if(m_State == READING) + { + // dummy draw that is consumed when this command buffer + // is being in-lined into the call stream + FetchDrawcall draw; + draw.name = "Pop()"; + draw.flags = eDraw_PopMarker; + + m_Cmd->AddDrawcall(draw, false); + } + + return true; } void WrappedID3D12GraphicsCommandList::EndEvent() { m_pReal->EndEvent(); + + if(m_State >= WRITING) + { + SCOPED_SERIALISE_CONTEXT(END_EVENT); + Serialise_EndEvent(); + + m_ListRecord->AddChunk(scope.Get()); + } } void WrappedID3D12GraphicsCommandList::ExecuteIndirect(ID3D12CommandSignature *pCommandSignature, diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 4ddf2ee39..204dba25d 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -264,6 +264,10 @@ void WrappedID3D12CommandQueue::ProcessChunk(uint64_t offset, D3D12ChunkType chu case RESOURCE_BARRIER: m_ReplayList->Serialise_ResourceBarrier(0, NULL); break; + case BEGIN_EVENT: m_ReplayList->Serialise_BeginEvent(0, NULL, 0); break; + case SET_MARKER: m_ReplayList->Serialise_SetMarker(0, NULL, 0); break; + case END_EVENT: m_ReplayList->Serialise_EndEvent(); break; + case DRAW_INST: m_ReplayList->Serialise_DrawInstanced(0, 0, 0, 0); break; case DRAW_INDEXED_INST: m_ReplayList->Serialise_DrawIndexedInstanced(0, 0, 0, 0, 0); break; case COPY_BUFFER: m_ReplayList->Serialise_CopyBufferRegion(NULL, 0, NULL, 0, 0); break; @@ -345,7 +349,7 @@ void WrappedID3D12CommandQueue::ProcessChunk(uint64_t offset, D3D12ChunkType chu { // no push/pop necessary } - else if(m_State == READING && (chunk == PUSH_EVENT || chunk == POP_EVENT)) + else if(m_State == READING && (chunk == BEGIN_EVENT || chunk == END_EVENT)) { // don't add these events - they will be handled when inserted in-line into queue submit } diff --git a/renderdoc/driver/d3d12/d3d12_common.h b/renderdoc/driver/d3d12/d3d12_common.h index ea5f61738..caaf3240b 100644 --- a/renderdoc/driver/d3d12/d3d12_common.h +++ b/renderdoc/driver/d3d12/d3d12_common.h @@ -207,9 +207,9 @@ void Serialiser::Serialise(const char *name, D3D12Descriptor &el); \ D3D12_CHUNK_MACRO(CAPTURE_SCOPE, "Capture") \ \ - D3D12_CHUNK_MACRO(PUSH_EVENT, "BeginEvent") \ + D3D12_CHUNK_MACRO(BEGIN_EVENT, "BeginEvent") \ D3D12_CHUNK_MACRO(SET_MARKER, "SetMarker") \ - D3D12_CHUNK_MACRO(POP_EVENT, "EndEvent") \ + D3D12_CHUNK_MACRO(END_EVENT, "EndEvent") \ \ D3D12_CHUNK_MACRO(DEBUG_MESSAGES, "DebugMessageList") \ \