From c9877b6d0b3ebe041e5956de63ac7a74a9317f6c Mon Sep 17 00:00:00 2001 From: baldurk Date: Sun, 19 Jul 2015 10:57:37 +0200 Subject: [PATCH] Re-jig loading progress bar calculation to be smoother/more informative --- renderdoc/core/core.cpp | 5 +++-- renderdoc/core/core.h | 1 + renderdoc/driver/d3d11/d3d11_context.cpp | 4 +++- renderdoc/driver/d3d11/d3d11_device.cpp | 6 ++++-- renderdoc/driver/gl/gl_driver.cpp | 10 +++++++--- renderdoc/serialise/serialiser.h | 4 +++- renderdocui/Code/Core.cs | 2 +- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index b7b4e7a10..f7fbc82e0 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -746,8 +746,9 @@ void RenderDoc::SetProgress(LoadProgressSection section, float delta) float weights[NumSections]; // must sum to 1.0 - weights[DebugManagerInit] = 0.4f; - weights[FileInitialRead] = 0.6f; + weights[DebugManagerInit] = 0.1f; + weights[FileInitialRead] = 0.75f; + weights[FrameEventsRead] = 0.15f; float progress = 0.0f; for(int i=0; i < section; i++) diff --git a/renderdoc/core/core.h b/renderdoc/core/core.h index 23e6c22c8..17a9eb1f7 100644 --- a/renderdoc/core/core.h +++ b/renderdoc/core/core.h @@ -146,6 +146,7 @@ enum LoadProgressSection { DebugManagerInit, FileInitialRead, + FrameEventsRead, NumSections, }; diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 484f98772..45ebda31c 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1217,6 +1217,8 @@ void WrappedID3D11DeviceContext::ReplayLog(LogState readType, uint32_t startEven m_pDevice->GetResourceManager()->MarkInFrame(true); + uint64_t startOffset = m_pSerialiser->GetOffset(); + while(1) { if(m_State == EXECUTING && m_CurEventID > endEventID) @@ -1231,7 +1233,7 @@ void WrappedID3D11DeviceContext::ReplayLog(LogState readType, uint32_t startEven ProcessChunk(offset, chunktype, false); - RenderDoc::Inst().SetProgress(FileInitialRead, float(offset)/float(m_pSerialiser->GetSize())); + RenderDoc::Inst().SetProgress(FrameEventsRead, float(offset - startOffset)/float(m_pSerialiser->GetSize())); // for now just abort after capture scope. Really we'd need to support multiple frames // but for now this will do. diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index e1cae6115..be4f3a390 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -1006,9 +1006,11 @@ void WrappedID3D11Device::ReadLogInitialisation() m_pSerialiser->Rewind(); + uint32_t captureChunkIdx = 0; + while(!m_pSerialiser->AtEnd()) { - m_pSerialiser->SkipToChunk(CAPTURE_SCOPE); + m_pSerialiser->SkipToChunk(CAPTURE_SCOPE, &captureChunkIdx); // found a capture chunk if(!m_pSerialiser->AtEnd()) @@ -1054,7 +1056,7 @@ void WrappedID3D11Device::ReadLogInitialisation() m_pSerialiser->PopContext(NULL, context); - RenderDoc::Inst().SetProgress(FileInitialRead, float(m_pSerialiser->GetOffset())/float(m_pSerialiser->GetSize())); + RenderDoc::Inst().SetProgress(FileInitialRead, float(chunkIdx)/float(captureChunkIdx)); if(context == CAPTURE_SCOPE) { diff --git a/renderdoc/driver/gl/gl_driver.cpp b/renderdoc/driver/gl/gl_driver.cpp index 17c325cce..ddf8882f2 100644 --- a/renderdoc/driver/gl/gl_driver.cpp +++ b/renderdoc/driver/gl/gl_driver.cpp @@ -2830,9 +2830,11 @@ void WrappedOpenGL::ReadLogInitialisation() m_pSerialiser->Rewind(); + uint32_t captureChunkIdx = 0; + while(!m_pSerialiser->AtEnd()) { - m_pSerialiser->SkipToChunk(CAPTURE_SCOPE); + m_pSerialiser->SkipToChunk(CAPTURE_SCOPE, &captureChunkIdx); // found a capture chunk if(!m_pSerialiser->AtEnd()) @@ -2878,7 +2880,7 @@ void WrappedOpenGL::ReadLogInitialisation() m_pSerialiser->PopContext(NULL, context); - RenderDoc::Inst().SetProgress(FileInitialRead, float(m_pSerialiser->GetOffset())/float(m_pSerialiser->GetSize())); + RenderDoc::Inst().SetProgress(FileInitialRead, float(chunkIdx)/float(captureChunkIdx)); if(context == CAPTURE_SCOPE) { @@ -3820,6 +3822,8 @@ void WrappedOpenGL::ContextReplayLog(LogState readType, uint32_t startEventID, u GetResourceManager()->MarkInFrame(true); + uint64_t startOffset = m_pSerialiser->GetOffset(); + while(1) { if(m_State == EXECUTING && m_CurEventID > endEventID) @@ -3834,7 +3838,7 @@ void WrappedOpenGL::ContextReplayLog(LogState readType, uint32_t startEventID, u ContextProcessChunk(offset, chunktype, false); - RenderDoc::Inst().SetProgress(FileInitialRead, float(offset)/float(m_pSerialiser->GetSize())); + RenderDoc::Inst().SetProgress(FrameEventsRead, float(offset - startOffset)/float(m_pSerialiser->GetSize())); // for now just abort after capture scope. Really we'd need to support multiple frames // but for now this will do. diff --git a/renderdoc/serialise/serialiser.h b/renderdoc/serialise/serialiser.h index 8740b87dd..d9e2e6a84 100644 --- a/renderdoc/serialise/serialiser.h +++ b/renderdoc/serialise/serialiser.h @@ -268,7 +268,7 @@ class Serialiser } // assumes buffer head is sitting before a chunk (ie. pushcontext will be valid) - void SkipToChunk(uint32_t chunkIdx) + void SkipToChunk(uint32_t chunkIdx, uint32_t *idx = NULL) { do { @@ -289,6 +289,8 @@ class Serialiser PopContext(NULL, 1); } + if(idx) (*idx)++; + } while(!AtEnd()); } diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index ee054f0b7..81c4dc5b2 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -420,7 +420,7 @@ namespace renderdocui.Code { Thread.Sleep(2); - float progress = 0.5f * m_Renderer.LoadProgress + 0.49f * postloadProgress + 0.01f; + float progress = 0.8f * m_Renderer.LoadProgress + 0.19f * postloadProgress + 0.01f; modal.LogfileProgress(progress);