dolphin/Source/Core/DolphinQt/FIFO/FIFOAnalyzer.h
2025-12-05 00:21:50 +00:00

100 lines
2.1 KiB
C++

// Copyright 2018 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <vector>
#include <QWidget>
#include "Common/CommonTypes.h"
#include "Core/FifoPlayer/FifoDataFile.h"
class FifoPlayer;
class QFont;
class QGroupBox;
class QLabel;
class QLineEdit;
class QListWidget;
class QPushButton;
class QSplitter;
class QTextBrowser;
class QTreeWidget;
class QTreeWidgetItem;
struct GPState
{
std::array<u32, FifoDataFile::CP_MEM_SIZE> m_cpmem;
std::array<u32, FifoDataFile::XF_MEM_SIZE + FifoDataFile::XF_REGS_SIZE> m_xfmem;
std::array<u32, FifoDataFile::BP_MEM_SIZE> m_bpmem;
};
class FIFOAnalyzer final : public QWidget
{
Q_OBJECT
public:
explicit FIFOAnalyzer(FifoPlayer& fifo_player);
~FIFOAnalyzer() override;
void Update();
private:
void CreateWidgets();
void ConnectWidgets();
void BeginSearch();
void FindNext();
void FindPrevious();
void ShowSearchResult(size_t index);
void UpdateObjectTree();
void UpdateCommandList();
void UpdateDescription();
void UpdateStateTree();
void OnDebugFontChanged(const QFont& font);
FifoPlayer& m_fifo_player;
QTreeWidget* m_tree_widget;
QListWidget* m_detail_list;
QTreeWidget* m_state_widget;
QTextBrowser* m_entry_detail_browser;
QSplitter* m_object_splitter;
QTreeWidgetItem* m_cp;
QTreeWidgetItem* m_xf;
QTreeWidgetItem* m_bp;
// Search
QGroupBox* m_search_box;
QLineEdit* m_search_edit;
QPushButton* m_search_new;
QPushButton* m_search_next;
QPushButton* m_search_previous;
QLabel* m_search_label;
QSplitter* m_search_splitter;
struct SearchResult
{
constexpr SearchResult(u32 frame, u32 object_idx, u32 cmd)
: m_frame(frame), m_object_idx(object_idx), m_cmd(cmd)
{
}
const u32 m_frame;
// Index in tree view. Does not correspond with object numbers or part numbers.
const u32 m_object_idx;
const u32 m_cmd;
};
// Offsets from the start of the first part in an object for each command within the currently
// selected object.
std::vector<u32> m_object_data_offsets;
std::vector<SearchResult> m_search_results;
GPState m_prev_state{};
GPState m_prev_fifo_pos{};
};