From 28b71c65afb49b41639c26eb21c3f8e01138015b Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Wed, 31 Mar 2021 22:43:21 -0700 Subject: [PATCH] Fix same object count being used for all frames in the FIFO analyzer If the number of objects varied, this would result in either missing objects on some frames, or too many objects on some frames; the latter case could cause crashes. Since it used the current frame to get the count, if the FIFO is started before the FIFO analyzer is opened, then the current frame is effectively random, making it hard to reproduce consistently. This issue has existed since the FIFO analyzer was implemented for Qt. --- Source/Core/Core/FifoPlayer/FifoPlayer.cpp | 11 ++++++++--- Source/Core/Core/FifoPlayer/FifoPlayer.h | 3 ++- Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp | 17 ++++++++--------- Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp | 2 +- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp index 8ed4481032..da35c44646 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.cpp +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.cpp @@ -198,16 +198,21 @@ u32 FifoPlayer::GetMaxObjectCount() const return result; } -u32 FifoPlayer::GetFrameObjectCount() const +u32 FifoPlayer::GetFrameObjectCount(u32 frame) const { - if (m_CurrentFrame < m_FrameInfo.size()) + if (frame < m_FrameInfo.size()) { - return (u32)(m_FrameInfo[m_CurrentFrame].objectStarts.size()); + return static_cast(m_FrameInfo[frame].objectStarts.size()); } return 0; } +u32 FifoPlayer::GetCurrentFrameObjectCount() const +{ + return GetFrameObjectCount(m_CurrentFrame); +} + void FifoPlayer::SetFrameRangeStart(u32 start) { if (m_File) diff --git a/Source/Core/Core/FifoPlayer/FifoPlayer.h b/Source/Core/Core/FifoPlayer/FifoPlayer.h index 0f326c3cdb..2b9b8947d9 100644 --- a/Source/Core/Core/FifoPlayer/FifoPlayer.h +++ b/Source/Core/Core/FifoPlayer/FifoPlayer.h @@ -75,7 +75,8 @@ public: FifoDataFile* GetFile() const { return m_File.get(); } u32 GetMaxObjectCount() const; - u32 GetFrameObjectCount() const; + u32 GetFrameObjectCount(u32 frame) const; + u32 GetCurrentFrameObjectCount() const; u32 GetCurrentFrameNum() const { return m_CurrentFrame; } const AnalyzedFrameInfo& GetAnalyzedFrameInfo(u32 frame) const { return m_FrameInfo[frame]; } // Frame range diff --git a/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp b/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp index db0ff42488..7cf804f899 100644 --- a/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp +++ b/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.cpp @@ -139,23 +139,22 @@ void FIFOAnalyzer::UpdateTree() auto* file = FifoPlayer::GetInstance().GetFile(); - int object_count = FifoPlayer::GetInstance().GetFrameObjectCount(); - int frame_count = file->GetFrameCount(); - - for (int i = 0; i < frame_count; i++) + const u32 frame_count = file->GetFrameCount(); + for (u32 frame = 0; frame < frame_count; frame++) { - auto* frame_item = new QTreeWidgetItem({tr("Frame %1").arg(i)}); + auto* frame_item = new QTreeWidgetItem({tr("Frame %1").arg(frame)}); recording_item->addChild(frame_item); - for (int j = 0; j < object_count; j++) + const u32 object_count = FifoPlayer::GetInstance().GetFrameObjectCount(frame); + for (u32 object = 0; object < object_count; object++) { - auto* object_item = new QTreeWidgetItem({tr("Object %1").arg(j)}); + auto* object_item = new QTreeWidgetItem({tr("Object %1").arg(object)}); frame_item->addChild(object_item); - object_item->setData(0, FRAME_ROLE, i); - object_item->setData(0, OBJECT_ROLE, j); + object_item->setData(0, FRAME_ROLE, frame); + object_item->setData(0, OBJECT_ROLE, object); } } } diff --git a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp index c4d29b1165..e4154b6b6c 100644 --- a/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp +++ b/Source/Core/DolphinQt/FIFO/FIFOPlayerWindow.cpp @@ -262,7 +262,7 @@ void FIFOPlayerWindow::UpdateInfo() m_info_label->setText( tr("%1 frame(s)\n%2 object(s)\nCurrent Frame: %3") .arg(QString::number(file->GetFrameCount()), - QString::number(FifoPlayer::GetInstance().GetFrameObjectCount()), + QString::number(FifoPlayer::GetInstance().GetCurrentFrameObjectCount()), QString::number(FifoPlayer::GetInstance().GetCurrentFrameNum()))); return; }