From 47c98a913544fa387d9f45f8a099fdf8c8dc5c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 5 Dec 2024 10:23:43 +0100 Subject: [PATCH] Add barebones GE state display window --- UI/ImDebugger/ImDebugger.cpp | 8 +++--- UI/ImDebugger/ImDebugger.h | 2 +- UI/ImDebugger/ImGe.cpp | 50 ++++++++++++++++++++++++++++-------- UI/ImDebugger/ImGe.h | 3 ++- 4 files changed, 47 insertions(+), 16 deletions(-) diff --git a/UI/ImDebugger/ImDebugger.cpp b/UI/ImDebugger/ImDebugger.cpp index f516c9162a..efb3c18ec6 100644 --- a/UI/ImDebugger/ImDebugger.cpp +++ b/UI/ImDebugger/ImDebugger.cpp @@ -825,7 +825,7 @@ void ImDebugger::Frame(MIPSDebugInterface *mipsDebug, GPUDebugInterface *gpuDebu } if (ImGui::BeginMenu("Graphics")) { ImGui::MenuItem("GE Debugger", nullptr, &cfg_.geDebuggerOpen); - ImGui::MenuItem("GE Registers", nullptr, &cfg_.geRegistersOpen); + ImGui::MenuItem("GE State", nullptr, &cfg_.geStateOpen); ImGui::MenuItem("Display Output", nullptr, &cfg_.displayOpen); ImGui::MenuItem("Textures", nullptr, &cfg_.texturesOpen); ImGui::MenuItem("Framebuffers", nullptr, &cfg_.framebuffersOpen); @@ -929,8 +929,8 @@ void ImDebugger::Frame(MIPSDebugInterface *mipsDebug, GPUDebugInterface *gpuDebu DrawGeDebuggerWindow(cfg_); } - if (cfg_.geRegistersOpen) { - DrawGeRegistersWindow(cfg_); + if (cfg_.geStateOpen) { + DrawGeStateWindow(cfg_, gpuDebug); } } @@ -1153,6 +1153,8 @@ void ImConfig::SyncConfig(IniFile *ini, bool save) { sync.Sync("audioChannelsOpen", &audioChannelsOpen, false); sync.Sync("texturesOpen", &texturesOpen, false); sync.Sync("debugStatsOpen", &debugStatsOpen, false); + sync.Sync("geDebuggerOpen", &geDebuggerOpen, false); + sync.Sync("geStateOpen", &geStateOpen, false); sync.SetSection(ini->GetOrCreateSection("Settings")); sync.Sync("displayLatched", &displayLatched, false); diff --git a/UI/ImDebugger/ImDebugger.h b/UI/ImDebugger/ImDebugger.h index f8388a8bc5..8661c8e9b5 100644 --- a/UI/ImDebugger/ImDebugger.h +++ b/UI/ImDebugger/ImDebugger.h @@ -80,7 +80,7 @@ struct ImConfig { bool audioChannelsOpen; bool debugStatsOpen; bool geDebuggerOpen; - bool geRegistersOpen; + bool geStateOpen; // HLE explorer settings // bool filterByUsed = true; diff --git a/UI/ImDebugger/ImGe.cpp b/UI/ImDebugger/ImGe.cpp index 534a52e931..cc0e339890 100644 --- a/UI/ImDebugger/ImGe.cpp +++ b/UI/ImDebugger/ImGe.cpp @@ -2,13 +2,14 @@ #include "ext/imgui/imgui_impl_thin3d.h" #include "UI/ImDebugger/ImGe.h" #include "UI/ImDebugger/ImDebugger.h" +#include "GPU/Common/GPUDebugInterface.h" #include "GPU/Common/FramebufferManagerCommon.h" #include "GPU/Common/TextureCacheCommon.h" #include "Core/HLE/sceDisplay.h" #include "Core/HW/Display.h" #include "GPU/Debugger/State.h" - +#include "GPU/GPUState.h" void DrawFramebuffersWindow(ImConfig &cfg, FramebufferManagerCommon *framebufferManager) { ImGui::SetNextWindowSize(ImVec2(520, 600), ImGuiCond_FirstUseEver); @@ -89,24 +90,51 @@ void DrawGeDebuggerWindow(ImConfig &cfg) { } // TODO: Separate window or merge into Ge debugger? -void DrawGeRegistersWindow(ImConfig &cfg) { +void DrawGeStateWindow(ImConfig &cfg, GPUDebugInterface *gpuDebug) { ImGui::SetNextWindowSize(ImVec2(300, 500), ImGuiCond_FirstUseEver); - if (!ImGui::Begin("Debug Stats", &cfg.geRegistersOpen)) { + if (!ImGui::Begin("GE State", &cfg.geStateOpen)) { ImGui::End(); return; } if (ImGui::BeginTabBar("GeRegs", ImGuiTabBarFlags_None)) { - if (ImGui::BeginTabItem("Control")) { - if (ImGui::BeginTable("fpr", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersH)) { - ImGui::TableSetupColumn("bkpt", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("name", ImGuiTableColumnFlags_WidthFixed); - ImGui::TableSetupColumn("value", ImGuiTableColumnFlags_WidthStretch); + auto buildStateTab = [&](const char *tabName, const TabStateRow *rows, size_t numRows) { + if (ImGui::BeginTabItem(tabName)) { + if (ImGui::BeginTable("fpr", 3, ImGuiTableFlags_RowBg | ImGuiTableFlags_BordersH)) { + ImGui::TableSetupColumn("bkpt", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("State", ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_WidthStretch); - ImGui::EndTable(); + for (size_t i = 0; i < numRows; i++) { + ImGui::TableNextRow(); + ImGui::TableNextColumn(); + ImGui::Text("-"); // breakpoint + ImGui::TableNextColumn(); + ImGui::TextUnformatted(rows[i].title.data(), rows[i].title.data() + rows[i].title.size()); + ImGui::TableNextColumn(); + char temp[256]; + auto &info = rows[i]; + + const bool enabled = info.enableCmd == 0 || (gstate.cmdmem[info.enableCmd] & 1) == 1; + const u32 value = gstate.cmdmem[info.cmd] & 0xFFFFFF; + const u32 otherValue = gstate.cmdmem[info.otherCmd] & 0xFFFFFF; + const u32 otherValue2 = gstate.cmdmem[info.otherCmd2] & 0xFFFFFF; + + FormatStateRow(gpuDebug, temp, sizeof(temp), info.fmt, value, enabled, otherValue, otherValue2); + ImGui::TextUnformatted(temp); + } + + ImGui::EndTable(); + } + ImGui::EndTabItem(); } - ImGui::EndTabItem(); - } + }; + + buildStateTab("Flags", g_stateFlagsRows, g_stateFlagsRowsSize); + buildStateTab("Lighting", g_stateLightingRows, g_stateLightingRowsSize); + buildStateTab("Texture", g_stateTextureRows, g_stateTextureRowsSize); + buildStateTab("Settings", g_stateSettingsRows, g_stateSettingsRowsSize); + ImGui::EndTabBar(); } ImGui::End(); diff --git a/UI/ImDebugger/ImGe.h b/UI/ImDebugger/ImGe.h index bd9ffcbdfd..eed0a4a0dd 100644 --- a/UI/ImDebugger/ImGe.h +++ b/UI/ImDebugger/ImGe.h @@ -6,13 +6,14 @@ struct ImConfig; class FramebufferManagerCommon; class TextureCacheCommon; +class GPUDebugInterface; void DrawFramebuffersWindow(ImConfig &cfg, FramebufferManagerCommon *framebufferManager); void DrawTexturesWindow(ImConfig &cfg, TextureCacheCommon *textureCache); void DrawDisplayWindow(ImConfig &cfg, FramebufferManagerCommon *framebufferManager); void DrawDebugStatsWindow(ImConfig &cfg); void DrawGeDebuggerWindow(ImConfig &cfg); -void DrawGeRegistersWindow(ImConfig &cfg); +void DrawGeStateWindow(ImConfig &cfg, GPUDebugInterface *gpuDebug); class ImGeDebugger { public: