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;