From 477df0407288a6f3aeb5d6bb042bbbbabb57a63c Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 1 Feb 2017 11:17:56 +0000 Subject: [PATCH] Make sure we're on a consistent event before calling OnLogFileLoaded * Certain panels like BufferViewer assume there is a current drawcall at startup and not an invalid event ID like 0. Normally the event browser is loaded first and sets the event ID, but if it's later in the list this will break. --- qrenderdoc/Code/CaptureContext.cpp | 13 ++++++++++--- qrenderdoc/Code/CaptureContext.h | 6 +++--- qrenderdoc/Windows/EventBrowser.cpp | 4 ++-- qrenderdoc/Windows/TextureViewer.cpp | 2 +- renderdocui/Code/Core.cs | 15 +++++++++++---- 5 files changed, 27 insertions(+), 13 deletions(-) diff --git a/qrenderdoc/Code/CaptureContext.cpp b/qrenderdoc/Code/CaptureContext.cpp index f62343873..3cc040a35 100644 --- a/qrenderdoc/Code/CaptureContext.cpp +++ b/qrenderdoc/Code/CaptureContext.cpp @@ -312,6 +312,13 @@ void CaptureContext::LoadLogfileThreaded(const QString &logFile, const QString & QVector logviewers(m_LogViewers); + // make sure we're on a consistent event before invoking log viewer forms + const FetchDrawcall *draw = &m_Drawcalls.back(); + while(!draw->children.empty()) + draw = &draw->children.back(); + + SetEventID(logviewers, draw->eventID, true); + GUIInvoke::blockcall([&logviewers]() { // notify all the registers log viewers that a log has been loaded for(ILogViewerForm *logviewer : logviewers) @@ -366,8 +373,8 @@ void CaptureContext::CloseLogfile() } } -void CaptureContext::SetEventID(ILogViewerForm *exclude, uint32_t selectedEventID, uint32_t eventID, - bool force) +void CaptureContext::SetEventID(const QVector &exclude, uint32_t selectedEventID, + uint32_t eventID, bool force) { uint32_t prevSelectedEventID = m_SelectedEventID; m_SelectedEventID = selectedEventID; @@ -386,7 +393,7 @@ void CaptureContext::SetEventID(ILogViewerForm *exclude, uint32_t selectedEventI for(ILogViewerForm *logviewer : m_LogViewers) { - if(logviewer == exclude) + if(exclude.contains(logviewer)) continue; if(force || prevSelectedEventID != selectedEventID) diff --git a/qrenderdoc/Code/CaptureContext.h b/qrenderdoc/Code/CaptureContext.h index c9e24efcd..f1678b575 100644 --- a/qrenderdoc/Code/CaptureContext.h +++ b/qrenderdoc/Code/CaptureContext.h @@ -83,9 +83,9 @@ public: void LoadLogfile(const QString &logFile, const QString &origFilename, bool temporary, bool local); void CloseLogfile(); - void SetEventID(ILogViewerForm *exclude, uint32_t selectedEventID, uint32_t eventID, - bool force = false); - void RefreshStatus() { SetEventID(NULL, m_SelectedEventID, m_EventID, true); } + void SetEventID(const QVector &exclude, uint32_t selectedEventID, + uint32_t eventID, bool force = false); + void RefreshStatus() { SetEventID({}, m_SelectedEventID, m_EventID, true); } void AddLogViewer(ILogViewerForm *f) { m_LogViewers.push_back(f); diff --git a/qrenderdoc/Windows/EventBrowser.cpp b/qrenderdoc/Windows/EventBrowser.cpp index bfdebd06e..504823468 100644 --- a/qrenderdoc/Windows/EventBrowser.cpp +++ b/qrenderdoc/Windows/EventBrowser.cpp @@ -113,7 +113,7 @@ void EventBrowser::OnLogfileLoaded() ui->events->expandItem(frame); - m_Ctx->SetEventID(this, lastEID, lastEID); + m_Ctx->SetEventID({this}, lastEID, lastEID); } void EventBrowser::OnLogfileClosed() @@ -251,7 +251,7 @@ void EventBrowser::on_events_currentItemChanged(QTreeWidgetItem *current, QTreeW uint EID = current->data(COL_EID, Qt::UserRole).toUInt(); uint lastEID = current->data(COL_LAST_EID, Qt::UserRole).toUInt(); - m_Ctx->SetEventID(this, EID, lastEID); + m_Ctx->SetEventID({this}, EID, lastEID); } void EventBrowser::on_HideFindJump() diff --git a/qrenderdoc/Windows/TextureViewer.cpp b/qrenderdoc/Windows/TextureViewer.cpp index 46a509339..bc72599da 100644 --- a/qrenderdoc/Windows/TextureViewer.cpp +++ b/qrenderdoc/Windows/TextureViewer.cpp @@ -1726,7 +1726,7 @@ void TextureViewer::texContextItem_triggered() QVariant eid = act->property("eid"); if(eid.isValid()) { - m_Ctx->SetEventID(NULL, eid.toUInt(), eid.toUInt()); + m_Ctx->SetEventID({}, eid.toUInt(), eid.toUInt()); return; } diff --git a/renderdocui/Code/Core.cs b/renderdocui/Code/Core.cs index 1eaa4a83f..a23de027e 100644 --- a/renderdocui/Code/Core.cs +++ b/renderdocui/Code/Core.cs @@ -613,6 +613,13 @@ namespace renderdocui.Code List logviewers = new List(); logviewers.AddRange(m_LogViewers); + // make sure we're on a consistent event before invoking log viewer forms + FetchDrawcall draw = m_DrawCalls.Last(); + while (draw.children != null && draw.children.Length > 0) + draw = draw.children.Last(); + + SetEventID(logviewers.ToArray(), draw.eventID, true); + // notify all the registers log viewers that a log has been loaded foreach (var logviewer in logviewers) { @@ -893,15 +900,15 @@ namespace renderdocui.Code public void RefreshStatus() { - SetEventID(null, m_EventID, true); + SetEventID(new ILogViewerForm[] { }, m_EventID, true); } public void SetEventID(ILogViewerForm exclude, UInt32 eventID) { - SetEventID(exclude, eventID, false); + SetEventID(new ILogViewerForm[] { exclude }, eventID, false); } - private void SetEventID(ILogViewerForm exclude, UInt32 eventID, bool force) + private void SetEventID(ILogViewerForm[] exclude, UInt32 eventID, bool force) { m_EventID = eventID; @@ -917,7 +924,7 @@ namespace renderdocui.Code foreach (var logviewer in m_LogViewers) { - if(logviewer == exclude) + if(exclude.Contains(logviewer)) continue; Control c = (Control)logviewer;