From 5ed280ae339d5a057b8e23e04e6eb638870d2339 Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 24 Aug 2014 00:59:26 +0100 Subject: [PATCH] Markers don't increment drawcall ID, use eventID for prev/next/parent --- renderdoc/driver/d3d11/d3d11_context.cpp | 12 +++++-- renderdoc/driver/gl/gl_driver.cpp | 5 ++- renderdoc/replay/replay_output.cpp | 6 ++-- renderdoc/replay/replay_renderer.cpp | 40 ++++++------------------ renderdoc/replay/replay_renderer.h | 1 - renderdocui/Interop/ReplayRenderer.cs | 2 +- 6 files changed, 27 insertions(+), 39 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index b02c58368..138309ea7 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -913,7 +913,12 @@ void WrappedID3D11DeviceContext::RefreshDrawcallIDs(DrawcallTreeNode &node) // assign new drawcall IDs for(size_t i=0; i < node.children.size(); i++) { - node.children[i].draw.drawcallID = m_CurDrawcallID++; + node.children[i].draw.drawcallID = m_CurDrawcallID; + + // markers don't increment drawcall ID + if((node.children[i].draw.flags & (eDraw_SetMarker|eDraw_PushMarker)) == 0) + m_CurDrawcallID++; + RefreshDrawcallIDs(node.children[i]); } } @@ -951,7 +956,10 @@ void WrappedID3D11DeviceContext::AddDrawcall(FetchDrawcall d, bool hasEvents) draw.depthOut = ((WrappedID3D11DepthStencilView *)m_CurrentPipelineState->OM.DepthView)->GetResourceResID(); } - m_CurDrawcallID++; + // markers don't increment drawcall ID + if((draw.flags & (eDraw_SetMarker|eDraw_PushMarker)) == 0) + m_CurDrawcallID++; + if(hasEvents) { vector evs; diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index e6ee9359a..baa620f49 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -1583,8 +1583,11 @@ void WrappedOpenGL::AddDrawcall(FetchDrawcall d, bool hasEvents) m_Real.glGetFramebufferAttachmentParameteriv(eGL_DRAW_FRAMEBUFFER, eGL_DEPTH_ATTACHMENT, eGL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, (GLint*)&curDepth); draw.depthOut = GetResourceManager()->GetID(TextureRes(GetCtx(), curDepth)); } + + // markers don't increment drawcall ID + if((draw.flags & (eDraw_SetMarker|eDraw_PushMarker)) == 0) + m_CurDrawcallID++; - m_CurDrawcallID++; if(hasEvents) { vector evs; diff --git a/renderdoc/replay/replay_output.cpp b/renderdoc/replay/replay_output.cpp index c49f3f119..4a9659d83 100644 --- a/renderdoc/replay/replay_output.cpp +++ b/renderdoc/replay/replay_output.cpp @@ -128,9 +128,9 @@ void ReplayOutput::RefreshOverlay() passEvents.clear(); FetchDrawcall *start = draw; - while(start && start->previous != 0 && (m_pRenderer->GetDrawcallByDrawID((uint32_t)start->previous)->flags & eDraw_Clear) == 0) + while(start && start->previous != 0 && (m_pRenderer->GetDrawcallByEID((uint32_t)start->previous, 0)->flags & eDraw_Clear) == 0) { - FetchDrawcall *prev = m_pRenderer->GetDrawcallByDrawID((uint32_t)start->previous);; + FetchDrawcall *prev = m_pRenderer->GetDrawcallByEID((uint32_t)start->previous, 0); if(memcmp(start->outputs, prev->outputs, sizeof(start->outputs)) || start->depthOut != prev->depthOut) break; @@ -148,7 +148,7 @@ void ReplayOutput::RefreshOverlay() if(start == draw) break; - start = m_pRenderer->GetDrawcallByDrawID((uint32_t)start->next); + start = m_pRenderer->GetDrawcallByEID((uint32_t)start->next, 0); } } diff --git a/renderdoc/replay/replay_renderer.cpp b/renderdoc/replay/replay_renderer.cpp index 494d6a6c4..4e51f68d2 100644 --- a/renderdoc/replay/replay_renderer.cpp +++ b/renderdoc/replay/replay_renderer.cpp @@ -144,36 +144,14 @@ bool ReplayRenderer::GetFrameInfo(rdctype::array *arr) return true; } -struct drawcall_eventID : public std::unary_function -{ - drawcall_eventID(const uint32_t e) : evID(e) {} - bool operator() (const FetchDrawcall *arg) { return arg ? arg->eventID == evID : false; } - uint32_t evID; -}; - -FetchDrawcall *ReplayRenderer::GetDrawcallByDrawID(uint32_t drawID) -{ - if(drawID < m_Drawcalls.size()) - return m_Drawcalls[drawID]; - - return NULL; -} - FetchDrawcall *ReplayRenderer::GetDrawcallByEID(uint32_t eventID, uint32_t defEventID) { - FetchDrawcall *ret = NULL; + uint32_t ev = defEventID > 0 ? defEventID : eventID; - FetchDrawcall ev; - ev.eventID = defEventID > 0 ? defEventID : eventID; + if(ev >= m_Drawcalls.size()) + return NULL; - // can't guarantee ordering for std::upper_bound, since deferred contexts can - // break ordering - auto it = std::find_if(m_Drawcalls.begin(), m_Drawcalls.end(), drawcall_eventID(ev.eventID)); - - if(it != m_Drawcalls.end()) - ret = *it; - - return ret; + return m_Drawcalls[ev]; } bool ReplayRenderer::GetDrawcalls(uint32_t frameID, bool includeTimes, rdctype::array *draws) @@ -643,7 +621,7 @@ FetchDrawcall *ReplayRenderer::SetupDrawcallPointers(FetchFrameInfo frame, rdcty { FetchDrawcall *draw = &draws[i]; - draw->parent = parent ? parent->drawcallID : 0; + draw->parent = parent ? parent->eventID : 0; if(draw->children.count > 0) { @@ -656,12 +634,12 @@ FetchDrawcall *ReplayRenderer::SetupDrawcallPointers(FetchFrameInfo frame, rdcty else { if(previous != NULL) - previous->next = draw->drawcallID; - draw->previous = previous ? previous->drawcallID : 0; + previous->next = draw->eventID; + draw->previous = previous ? previous->eventID : 0; RDCASSERT(m_Drawcalls.empty() || draw->eventID > m_Drawcalls.back()->eventID || draw->context != frame.immContextId); - m_Drawcalls.resize(RDCMAX(m_Drawcalls.size(), size_t(draw->drawcallID+1))); - m_Drawcalls[draw->drawcallID] = draw; + m_Drawcalls.resize(RDCMAX(m_Drawcalls.size(), size_t(draw->eventID+1))); + m_Drawcalls[draw->eventID] = draw; ret = previous = draw; } diff --git a/renderdoc/replay/replay_renderer.h b/renderdoc/replay/replay_renderer.h index 8ea1fccce..62629fc80 100644 --- a/renderdoc/replay/replay_renderer.h +++ b/renderdoc/replay/replay_renderer.h @@ -183,7 +183,6 @@ struct ReplayRenderer ReplayCreateStatus PostCreateInit(IReplayDriver *device); FetchDrawcall *GetDrawcallByEID(uint32_t eventID, uint32_t defEventID); - FetchDrawcall *GetDrawcallByDrawID(uint32_t drawID); FetchDrawcall *SetupDrawcallPointers(FetchFrameInfo frame, rdctype::array &draws, FetchDrawcall *parent, FetchDrawcall *previous); IReplayDriver *GetDevice() { return m_pDevice; } diff --git a/renderdocui/Interop/ReplayRenderer.cs b/renderdocui/Interop/ReplayRenderer.cs index dd97fe7eb..3b4cf8666 100644 --- a/renderdocui/Interop/ReplayRenderer.cs +++ b/renderdocui/Interop/ReplayRenderer.cs @@ -386,7 +386,7 @@ namespace renderdoc foreach (var d in draws) { - map.Add((Int64)d.drawcallID, d); + map.Add((Int64)d.eventID, d); PopulateDraws(ref map, d.children); } }