From f407c5aabd2117dc516ea5f7723495c071c1f034 Mon Sep 17 00:00:00 2001 From: Gauvain 'GovanifY' Roussel-Tarbouriech Date: Mon, 8 Mar 2021 13:25:24 +0100 Subject: [PATCH] gsdump: switch to Add instead of += overloading, unlink about and gsdump --- .../GSDumpDialog.cpp | 825 ------------------ pcsx2/gui/Dialogs/GSDumpDialog.cpp | 58 +- pcsx2/gui/Dialogs/ModalPopups.h | 2 +- 3 files changed, 30 insertions(+), 855 deletions(-) delete mode 100644 enc_temp_folder/dd38e9ac7f2fe585e5a29d72752159f3/GSDumpDialog.cpp diff --git a/enc_temp_folder/dd38e9ac7f2fe585e5a29d72752159f3/GSDumpDialog.cpp b/enc_temp_folder/dd38e9ac7f2fe585e5a29d72752159f3/GSDumpDialog.cpp deleted file mode 100644 index 94438e5f9e..0000000000 --- a/enc_temp_folder/dd38e9ac7f2fe585e5a29d72752159f3/GSDumpDialog.cpp +++ /dev/null @@ -1,825 +0,0 @@ -/* PCSX2 - PS2 Emulator for PCs - * Copyright (C) 2002-2020 PCSX2 Dev Team - * - * PCSX2 is free software: you can redistribute it and/or modify it under the terms - * of the GNU Lesser General Public License as published by the Free Software Found- - * ation, either version 3 of the License, or (at your option) any later version. - * - * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; - * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR - * PURPOSE. See the GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along with PCSX2. - * If not, see . - */ - -#include "PrecompiledHeader.h" -#include "App.h" -#include "AppCommon.h" -#include "MSWstuff.h" - -#include "Dialogs/ModalPopups.h" - - -#include "Utilities/EmbeddedImage.h" -#include "Resources/NoIcon.h" -#include "GS.h" - -#include "PathDefs.h" -#include "AppConfig.h" -#include "Plugins.h" -#include "GSFrame.h" -#include "Counters.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace GSDump -{ - bool isRunning = false; -} - -using namespace pxSizerFlags; - -// -------------------------------------------------------------------------------------- -// GSDumpDialog Implementation -// -------------------------------------------------------------------------------------- - -Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent) - : wxDialogWithHelpers(parent, _("GSDumpGov"), pxDialogFlags()) - , m_dump_list(new wxListView(this, ID_DUMP_LIST, wxDefaultPosition, wxSize(400, 300), wxLC_NO_HEADER | wxLC_REPORT | wxLC_SINGLE_SEL)) - , m_preview_image(new wxStaticBitmap(this, wxID_ANY, wxBitmap(EmbeddedImage().Get()), wxDefaultPosition, wxSize(400,250))) - , m_debug_mode(new wxCheckBox(this, ID_DEBUG_MODE, _("Debug Mode"))) - , m_renderer_overrides(new wxRadioBox()) - , m_gif_list(new wxTreeCtrl(this, ID_SEL_PACKET, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT)) - , m_gif_packet(new wxTreeCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(400, 300), wxTR_HIDE_ROOT | wxTR_HAS_BUTTONS | wxTR_LINES_AT_ROOT)) - , m_start(new wxButton(this, ID_RUN_START, _("Go to Start"), wxDefaultPosition, wxSize(150,50))) - , m_step(new wxButton(this, ID_RUN_START, _("Step"), wxDefaultPosition, wxSize(150, 50))) - , m_selection(new wxButton(this, ID_RUN_START, _("Run to Selection"), wxDefaultPosition, wxSize(150, 50))) - , m_vsync(new wxButton(this, ID_RUN_START, _("Go to next VSync"), wxDefaultPosition, wxSize(150, 50))) - , m_thread(std::make_unique(this)) - , m_run(new wxButton(this, ID_RUN_DUMP, _("Run"), wxDefaultPosition, wxSize(150, 100))) -{ - wxBoxSizer& dump_info(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dump_preview(*new wxBoxSizer(wxVERTICAL)); - wxFlexGridSizer& debugger(*new wxFlexGridSizer(3, StdPadding, StdPadding)); - wxBoxSizer& dumps(*new wxBoxSizer(wxHORIZONTAL)); - wxBoxSizer& dbg_tree(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dbg_actions(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& gif(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dumps_list(*new wxBoxSizer(wxVERTICAL)); - - wxArrayString rdoverrides; - rdoverrides.Add("None"); - rdoverrides.Add("OGL SW"); - rdoverrides.Add("D3D11 HW"); - rdoverrides.Add("OGL HW"); - m_renderer_overrides->Create(this, wxID_ANY, "Renderer overrides", wxDefaultPosition, wxDefaultSize, rdoverrides, 1); - - dbg_tree += new wxStaticText(this, wxID_ANY, _("GIF Packets")); - dbg_tree += m_gif_list | StdExpand(); - dbg_actions += m_debug_mode; - dbg_actions += m_start | StdExpand(); - dbg_actions += m_step | StdExpand(); - dbg_actions += m_selection | StdExpand(); - dbg_actions += m_vsync | StdExpand(); - gif += new wxStaticText(this, wxID_ANY, _("Packet Content")); - gif += m_gif_packet | StdExpand(); - - dumps_list += new wxStaticText(this, wxID_ANY, _("GS Dumps List")) | StdExpand(); - dumps_list += m_dump_list | StdExpand(); - dump_info += m_renderer_overrides | StdExpand(); - dump_info += m_run | StdExpand(); - dump_preview += new wxStaticText(this, wxID_ANY, _("Preview")) | StdExpand(); - dump_preview += m_preview_image | StdCenter(); - - dumps += dumps_list; - dumps += dump_info; - dumps += dump_preview; - - debugger += dbg_tree; - debugger += dbg_actions; - debugger += gif; - - *this += dumps; - *this += debugger; - - // populate UI and setup state - m_debug_mode->Disable(); - m_start->Disable(); - m_step->Disable(); - m_selection->Disable(); - m_vsync->Disable(); - GetDumpsList(); - - m_fs_watcher.SetOwner(this); - m_fs_watcher.Add(wxFileName(g_Conf->Folders.Snapshots.ToAscii())); - wxEvtHandler::Connect(wxEVT_FSWATCHER, wxFileSystemWatcherEventHandler(Dialogs::GSDumpDialog::PathChanged)); - - Bind(wxEVT_LIST_ITEM_SELECTED, &Dialogs::GSDumpDialog::SelectedDump, this, ID_DUMP_LIST); - Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::RunDump, this, ID_RUN_DUMP); - Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToStart, this, ID_RUN_START); - Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::StepPacket, this, ID_RUN_STEP); - Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToCursor, this, ID_RUN_CURSOR); - Bind(wxEVT_BUTTON, &Dialogs::GSDumpDialog::ToVSync, this, ID_RUN_VSYNC); - Bind(wxEVT_TREE_SEL_CHANGED, &Dialogs::GSDumpDialog::ParsePacket, this, ID_SEL_PACKET); - Bind(wxEVT_CHECKBOX, &Dialogs::GSDumpDialog::CheckDebug, this, ID_DEBUG_MODE); -} - -void Dialogs::GSDumpDialog::GetDumpsList() -{ - m_dump_list->ClearAll(); - wxDir snaps(g_Conf->Folders.Snapshots.ToAscii()); - wxString filename; - bool cont = snaps.GetFirst(&filename, "*.gs", wxDIR_DEFAULT); - int i = 0, h = 0, j = 0; - m_dump_list->AppendColumn("Dumps"); - // set the column size to be exactly of the size of our list - m_dump_list->GetSize(&h, &j); - m_dump_list->SetColumnWidth(0, h); - - while (cont) - { - m_dump_list->InsertItem(i, filename.substr(0, filename.find_last_of("."))); - i++; - cont = snaps.GetNext(&filename); - } -} - -void Dialogs::GSDumpDialog::SelectedDump(wxListEvent& evt) -{ - wxString filename_preview = g_Conf->Folders.Snapshots.ToAscii() + ("/" + evt.GetText()) + ".png"; - wxString filename = g_Conf->Folders.Snapshots.ToAscii() + ("/" + evt.GetText()) + ".gs"; - if (wxFileExists(filename_preview)) - { - auto img = wxImage(filename_preview); - img.Rescale(400,250, wxIMAGE_QUALITY_HIGH); - m_preview_image->SetBitmap(wxBitmap(img)); - } - else - m_preview_image->SetBitmap(EmbeddedImage().Get()); - m_selected_dump = wxString(filename); -} - -void Dialogs::GSDumpDialog::RunDump(wxCommandEvent& event) -{ - m_debug_mode->Enable(); - m_start->Enable(); - m_step->Enable(); - m_selection->Enable(); - m_vsync->Enable(); - m_run->Disable(); - GetCorePlugins().Shutdown(); - - m_thread->m_dump_file = std::make_unique(m_selected_dump, new wxFFileInputStream(m_selected_dump)); - - if (!(m_thread->m_dump_file)->IsOk()) - { - wxString s; - s.Printf(_("Failed to load the dump %s !"), m_selected_dump); - wxMessageBox(s, _("GSDumpGov"), wxICON_ERROR); - return; - } - m_thread->Start(); - return; -} - -void Dialogs::GSDumpDialog::ProcessDumpEvent(const GSData& event, char* regs) -{ - switch (event.id) - { - case Transfer: - { - switch (event.path) - { - case Path1Old: - { - std::unique_ptr data(new char[16384]); - int addr = 16384 - event.length; - memcpy(data.get(), event.data.get() + addr, event.length); - GSgifTransfer1((u32*)data.get(), addr); - break; - } - case Path1New: - GSgifTransfer((u32*)event.data.get(), event.length / 16); - break; - case Path2: - GSgifTransfer2((u32*)event.data.get(), event.length / 16); - break; - case Path3: - GSgifTransfer3((u32*)event.data.get(), event.length / 16); - break; - default: - break; - } - break; - } - case VSync: - { - GSvsync((*((int*)(regs + 4096)) & 0x2000) > 0 ? (u8)1 : (u8)0); - g_FrameCount++; - Pcsx2App* app = (Pcsx2App*)wxApp::GetInstance(); - if (app) - app->FpsManager.DoFrame(); - break; - } - case ReadFIFO2: - { - std::unique_ptr arr(new char[*((int*)event.data.get())]); - GSreadFIFO2((u64*)arr.get(), *((int*)event.data.get())); - break; - } - case Registers: - memcpy(regs, event.data.get(), 8192); - break; - } -} - -void Dialogs::GSDumpDialog::StepPacket(wxCommandEvent& event) -{ - m_button_events.push_back(GSEvent{Step, 0}); -} - -void Dialogs::GSDumpDialog::ToCursor(wxCommandEvent& event) -{ - m_button_events.push_back(GSEvent{RunCursor, wxAtoi(m_gif_list->GetItemText(m_gif_list->GetFocusedItem()).BeforeFirst('-'))}); -} - -void Dialogs::GSDumpDialog::ToVSync(wxCommandEvent& event) -{ - m_button_events.push_back(GSEvent{RunVSync, 0}); -} - -void Dialogs::GSDumpDialog::ToStart(wxCommandEvent& event) -{ - m_button_events.push_back(GSEvent{RunCursor, 0}); -} - -void Dialogs::GSDumpDialog::GenPacketList() -{ - int i = 0; - m_gif_list->DeleteAllItems(); - wxTreeItemId mainrootId = m_gif_list->AddRoot("root"); - wxTreeItemId rootId = m_gif_list->AppendItem(mainrootId, "0 - VSync"); - for (auto& element : m_dump_packets) - { - wxString s, t; - element.id == Transfer ? t.Printf(" - %s", GSTransferPathNames[element.path]) : t.Printf(""); - s.Printf("%d - %s%s - %d byte", i, GSTypeNames[element.id], t, element.length); - if (element.id == VSync) - { - m_gif_list->SetItemText(rootId, s); - rootId = m_gif_list->AppendItem(mainrootId, "VSync"); - } - else - m_gif_list->AppendItem(rootId, s); - i++; - } - m_gif_list->Delete(rootId); -} - -void Dialogs::GSDumpDialog::GenPacketInfo(GSData& dump) -{ - m_gif_packet->DeleteAllItems(); - wxTreeItemId rootId = m_gif_packet->AddRoot("root"); - switch (dump.id) - { - case Transfer: - { - wxTreeItemId trootId; - wxString s; - s.Printf("Transfer Path %s", GSTransferPathNames[dump.path]); - trootId = m_gif_packet->AppendItem(rootId, s); - u64 tag = *(u64*)(dump.data.get()); - u64 regs = *(u64*)(dump.data.get() + 8); - u32 nloop = tag & ((1 << 15) - 1); - u8 eop = (tag >> 15) & 1; - u8 pre = (tag >> 46) & 1; - u32 prim = (tag >> 47) & ((1 << 11) - 1); - u8 flg = ((tag >> 58) & 3); - u32 nreg = (u32)((tag >> 60) & ((1 << 4) - 1)); - if (nreg == 0) - nreg = 16; - - std::vector infos(7); - m_stored_q = 1.0; - - infos[0].Printf("nloop = %u", nloop); - infos[1].Printf("eop = %u", eop); - infos[2].Printf("flg = %s", GifFlagNames[flg]); - infos[3].Printf("pre = %u", pre); - infos[4].Printf("Prim"); - infos[5].Printf("nreg = %u", nreg); - infos[6].Printf("reg"); - - wxTreeItemId primId; - wxTreeItemId regId; - for (int i = 0; i < 7; i++) - { - wxTreeItemId res = m_gif_packet->AppendItem(trootId, infos[i]); - switch (i) - { - case 4: - ParseTreePrim(res, prim); - break; - case 6: - regId = res; - break; - } - } - - int p = 16; - switch ((GifFlag)flg) - { - case GIF_FLG_PACKED: - { - for (u32 j = 0; j < nloop; j++) - { - for (u32 i = 0; i < nreg; i++) - { - u128 reg_data; - reg_data.lo = *(u64*)(dump.data.get() + p); - reg_data.hi = *(u64*)(dump.data.get() + p + 8); - ParseTreeReg(regId, (GIFReg)((regs >> (i * 4)) & ((u64)(1 << 4) - 1)), reg_data, true); - p += 16; - } - } - break; - } - case GIF_FLG_REGLIST: - { - for (u32 j = 0; j < nloop; j++) - { - for (u32 i = 0; i < nreg; i++) - { - u128 reg_data; - reg_data.lo = *(u64*)(dump.data.get() + p); - ParseTreeReg(regId, (GIFReg)((regs >> (i * 4)) & ((u64)(1 << 4) - 1)), reg_data, false); - p += 8; - } - } - break; - } - case GIF_FLG_IMAGE: - case GIF_FLG_IMAGE2: - { - wxString z; - s.Printf("IMAGE %d bytes", nloop * 16); - m_gif_packet->AppendItem(regId, z); - break; - } - } - break; - } - case VSync: - { - wxString s; - s.Printf("Field = %u", *(u8*)(dump.data.get())); - m_gif_packet->AppendItem(rootId, s); - break; - } - case ReadFIFO2: - { - wxString s; - s.Printf("ReadFIFO2: Size = %d byte", dump.length); - m_gif_packet->AppendItem(rootId, s); - break; - } - case Registers: - m_gif_packet->AppendItem(rootId, "Registers"); - break; - } - m_gif_packet->ExpandAll(); -} - -void Dialogs::GSDumpDialog::ParsePacket(wxTreeEvent& event) -{ - int id = wxAtoi(m_gif_list->GetItemText(event.GetItem()).BeforeFirst('-')); - GenPacketInfo(m_dump_packets[id]); -} - -void Dialogs::GSDumpDialog::ParseTreeReg(wxTreeItemId& id, GIFReg reg, u128 data, bool packed) -{ - wxTreeItemId rootId = m_gif_packet->AppendItem(id, wxString(GIFRegName(reg))); - switch (reg) - { - case PRIM: - ParseTreePrim(rootId, data.lo); - break; - case RGBAQ: - { - std::vector rgb_infos(5); - - if (packed) - { - rgb_infos[0].Printf("R = %u", (u32)(data.lo & ((u64)(1 << 8) - 1))); - rgb_infos[1].Printf("G = %u", (u32)((data.lo >> 32) & ((u64)(1 << 8) - 1))); - rgb_infos[2].Printf("B = %u", (u32)(data.hi & ((u64)(1 << 8) - 1))); - rgb_infos[3].Printf("A = %u", (u32)((data.hi >> 32) & ((u64)(1 << 8) - 1))); - rgb_infos[4].Printf("Q = %u", m_stored_q); - } - else - { - rgb_infos[0].Printf("R = %u", (u32)(data.lo & ((u64)(1 << 8) - 1))); - rgb_infos[1].Printf("G = %u", (u32)((data.lo >> 8) & ((u64)(1 << 8) - 1))); - rgb_infos[2].Printf("B = %u", (u32)((data.lo >> 16) & ((u64)(1 << 8) - 1))); - rgb_infos[3].Printf("A = %u", (u32)((data.lo >> 24) & ((u64)(1 << 8) - 1))); - rgb_infos[4].Printf("Q = %u", *(u32*)(&data.lo + 4)); - } - - for (auto& el : rgb_infos) - m_gif_packet->AppendItem(rootId, el); - break; - } - case ST: - { - std::vector st_infos(2); - st_infos[0].Printf("S = %f", *(float*)(&data.lo)); - st_infos[1].Printf("T = %f", *(float*)(&data.lo + 4)); - if (packed) - { - wxString q; - m_stored_q = *(float*)(&data.hi + 4); - q.Printf("Q = %f", m_stored_q); - st_infos.push_back(q); - } - for (auto& el : st_infos) - m_gif_packet->AppendItem(rootId, el); - break; - } - case UV: - { - wxString s, t; - double v; - s.Printf("U = %f", (double)(data.lo & ((u64)(1 << 14) - 1)) / 16.0); - if (packed) - v = (double)((data.lo >> 32) & ((u64)(1 << 14) - 1)) / 16.0; - else - v = (double)((data.lo >> 16) & ((u64)(1 << 14) - 1)) / 16.0; - t.Printf("V = %u", v); - m_gif_packet->AppendItem(rootId, s); - m_gif_packet->AppendItem(rootId, t); - break; - } - case XYZF2: - case XYZF3: - { - if (packed && (reg == XYZF2) && ((data.lo >> 47) & ((u64)(1 << 1) - 1)) == 1) - m_gif_packet->SetItemText(rootId, GIFRegName(XYZF3)); - - std::vector xyzf_infos(4); - if (packed) - { - xyzf_infos[0].Printf("X = %f", (float)(data.lo & ((u64)(1 << 16) - 1)) / 16.0); - xyzf_infos[1].Printf("Y = %f", (float)((data.lo >> 32) & ((u64)(1 << 16) - 1)) / 16.0); - xyzf_infos[2].Printf("Z = %u", (u32)((data.hi >> 4) & ((u64)(1 << 24) - 1))); - xyzf_infos[3].Printf("F = %u", (u32)((data.hi >> 36) & ((u64)(1 << 8) - 1))); - } - else - { - xyzf_infos[0].Printf("X = %f", (float)(data.lo & ((u64)(1 << 16) - 1)) / 16.0); - xyzf_infos[1].Printf("Y = %f", (float)((data.lo >> 16) & ((u64)(1 << 16) - 1)) / 16.0); - xyzf_infos[2].Printf("Z = %u", (u32)((data.lo >> 32) & ((u64)(1 << 24) - 1))); - xyzf_infos[3].Printf("F = %u", (u32)((data.lo >> 56) & ((u64)(1 << 8) - 1))); - } - - for (auto& el : xyzf_infos) - m_gif_packet->AppendItem(rootId, el); - break; - } - case XYZ2: - case XYZ3: - { - if (packed && (reg == XYZ2) && ((data.lo >> 47) & ((u64)(1 << 1) - 1)) == 1) - m_gif_packet->SetItemText(rootId, GIFRegName(XYZ3)); - - std::vector xyz_infos(3); - if (packed) - { - xyz_infos[0].Printf("X = %f", (float)(data.lo & ((u64)(1 << 16) - 1)) / 16.0); - xyz_infos[1].Printf("Y = %f", (float)((data.lo >> 32) & ((u64)(1 << 16) - 1)) / 16.0); - xyz_infos[2].Printf("Z = %u", *(u32*)(&data.hi)); - } - else - { - xyz_infos[0].Printf("X = %f", (float)(data.lo & ((u64)(1 << 16) - 1)) / 16.0); - xyz_infos[1].Printf("Y = %f", (float)((data.lo >> 16) & ((u64)(1 << 16) - 1)) / 16.0); - xyz_infos[2].Printf("Z = %u", *(u32*)(&data.lo)+4); - } - - for (auto& el : xyz_infos) - m_gif_packet->AppendItem(rootId, el); - break; - } - case TEX0_1: - case TEX0_2: - { - std::vector tex_infos(12); - - tex_infos[0].Printf("TBP0 = %u", (u32)(data.lo & ((u64)(1 << 14) - 1))); - tex_infos[1].Printf("TBW = %u", (u32)((data.lo >> 14) & ((u64)(1 << 6) - 1))); - tex_infos[2].Printf("PSM = %s", TEXPSMNames[(u32)((data.lo >> 20) & ((u64)(1 << 6) - 1))]); - tex_infos[3].Printf("TW = %u", (u32)((data.lo >> 26) & ((u64)(1 << 4) - 1))); - tex_infos[4].Printf("TH = %u", (u32)((data.lo >> 30) & ((u64)(1 << 4) - 1))); - tex_infos[5].Printf("TCC = %s", TEXTCCNames[(u32)((data.lo >> 34) & ((u64)(1 << 1) - 1))]); - tex_infos[6].Printf("TFX = %s", TEXTFXNames[(u32)((data.lo >> 35) & ((u64)(1 << 2) - 1))]); - tex_infos[7].Printf("CBP = %u", (u32)((data.lo >> 37) & ((u64)(1 << 14) - 1))); - tex_infos[8].Printf("CPSM = %s", TEXCPSMNames[(u32)((data.lo >> 51) & ((u64)(1 << 4) - 1))]); - tex_infos[9].Printf("CSM = %s", TEXCSMNames[(u32)((data.lo >> 55) & ((u64)(1 << 1) - 1))]); - tex_infos[10].Printf("CSA = %u", (u32)((data.lo >> 56) & ((u64)(1 << 5) - 1))); - tex_infos[11].Printf("CLD = %u", (u32)((data.lo >> 61) & ((u64)(1 << 3) - 1))); - - for (auto& el : tex_infos) - m_gif_packet->AppendItem(rootId, el); - break; - } - case FOG: - { - wxString s; - if (packed) - s.Printf("F = %u", (u32)((data.hi >> 36) & ((u64)(1 << 8) - 1))); - else - s.Printf("F = %u", (u32)((data.lo >> 56) & ((u64)(1 << 8) - 1))); - m_gif_packet->AppendItem(rootId, s); - break; - } - case AD: - { - GIFReg nreg = (GIFReg)(data.hi & ((u64)(1 << 8) - 1)); - if ((GIFReg)nreg == AD) - { - wxString s; - s.Printf("NOP"); - m_gif_packet->AppendItem(id, s); - } - else - ParseTreeReg(id, nreg, data, packed); - m_gif_packet->Delete(rootId); - break; - } - default: - break; - } -} - -void Dialogs::GSDumpDialog::ParseTreePrim(wxTreeItemId& id, u32 prim) -{ - std::vector prim_infos(9); - - prim_infos[0].Printf("Primitive Type = %s", GsPrimNames[(prim & ((u64)(1 << 3) - 1))]); - prim_infos[1].Printf("IIP = %s", GsIIPNames[((prim >> 3) & 1)]); - prim_infos[2].Printf("TME = %s", (bool)((prim >> 4) & 1) ? "True" : "False"); - prim_infos[3].Printf("FGE = %s", (bool)((prim >> 5) & 1) ? "True" : "False"); - prim_infos[4].Printf("FGE = %s", (bool)((prim >> 6) & 1) ? "True" : "False"); - prim_infos[5].Printf("AA1 = %s", (bool)((prim >> 7) & 1) ? "True" : "False"); - prim_infos[6].Printf("FST = %s", GsFSTNames[((prim >> 3) & 1)]); - prim_infos[7].Printf("CTXT = %s", GsCTXTNames[((prim >> 9) & 1)]); - prim_infos[8].Printf("FIX = %s", GsFIXNames[((prim >> 10) & 1)]); - - for (auto& el : prim_infos) - m_gif_packet->AppendItem(id, el); -} - -void Dialogs::GSDumpDialog::CheckDebug(wxCommandEvent& event) -{ - if (m_debug_mode->GetValue()) - GenPacketList(); - else - { - m_gif_list->DeleteAllItems(); - m_gif_packet->DeleteAllItems(); - m_gif_list->Refresh(); - } -} - -Dialogs::GSDumpDialog::GSThread::GSThread(GSDumpDialog* dlg) - : pxThread("GSDump") - , m_root_window(dlg) -{ -} - -Dialogs::GSDumpDialog::GSThread::~GSThread() -{ - try - { - pxThread::Cancel(); - } - DESTRUCTOR_CATCHALL -} - -void Dialogs::GSDumpDialog::GSThread::OnStop() -{ - m_root_window->m_debug_mode->Disable(); - m_root_window->m_start->Disable(); - m_root_window->m_step->Disable(); - m_root_window->m_selection->Disable(); - m_root_window->m_vsync->Disable(); - m_root_window->m_gif_list->DeleteAllItems(); - m_root_window->m_gif_packet->DeleteAllItems(); - m_root_window->m_gif_list->Refresh(); - m_root_window->m_button_events.clear(); - m_root_window->m_debug_mode->SetValue(false); - m_root_window->m_run->Enable(); - m_dump_file->Close(); -} - -void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() -{ - GSDump::isRunning = true; - u32 crc = 0, ss = 0; - s8 renderer_override = 0; - switch (m_root_window->m_renderer_overrides->GetSelection()) - { - // OGL SW - case 1: - renderer_override = 13; - break; - // D3D11 HW - case 2: - renderer_override = 3; - break; - // OGL HW - case 3: - renderer_override = 12; - break; - default: - break; - } - char regs[8192]; - - m_dump_file->Read(&crc, 4); - m_dump_file->Read(&ss, 4); - - - std::unique_ptr state_data(new char[ss]); - m_dump_file->Read(state_data.get(), ss); - m_dump_file->Read(®s, 8192); - - freezeData fd = {(int)ss, (s8*)state_data.get()}; - m_root_window->m_dump_packets.clear(); - - while ( m_dump_file->Tell() < m_dump_file->Length()) - { - GSType id = Transfer; - m_dump_file->Read(&id, 1); - switch (id) - { - case Transfer: - { - GSTransferPath id_transfer; - m_dump_file->Read(&id_transfer, 1); - s32 size = 0; - m_dump_file->Read(&size, 4); - std::unique_ptr transfer_data(new char[size]); - m_dump_file->Read(transfer_data.get(), size); - m_root_window->m_dump_packets.push_back({id, std::move(transfer_data), size, id_transfer}); - break; - } - case VSync: - { - std::unique_ptr vsync(new char[1]); - m_dump_file->Read(vsync.get(), 1); - m_root_window->m_dump_packets.push_back({id, std::move(vsync), 1, Dummy}); - break; - } - case ReadFIFO2: - { - std::unique_ptr fifo(new char[4]); - m_dump_file->Read(fifo.get(), 4); - m_root_window->m_dump_packets.push_back({id, std::move(fifo), 4, Dummy}); - break; - } - case Registers: - { - std::unique_ptr regs_tmp(new char[8192]); - m_dump_file->Read(regs_tmp.get(), 8192); - m_root_window->m_dump_packets.push_back({id, std::move(regs_tmp), 8192, Dummy}); - break; - } - } - } - - if (m_root_window->m_debug_mode->GetValue()) - m_root_window->GenPacketList(); - - //return here to debug pre gs - //return; - - GetCorePlugins().Init(); - sApp.OpenGsPanel(); - - // to gather the gs frame object we have to be a bit hacky since sApp is not syntax complete - Pcsx2App* app = (Pcsx2App*)wxApp::GetInstance(); - GSFrame* window = nullptr; - if (app) - { - app->FpsManager.Reset(); - window = app->GetGsFramePtr(); - g_FrameCount = 0; - } - - GSsetBaseMem((void*)regs); - if (GSopen2((void*)pDsp, (renderer_override<<24)) != 0) - { - OnStop(); - return; - } - - GSsetGameCRC((int)crc, 0); - - if (!GetCorePlugins().DoFreeze(PluginId_GS, 0, &fd, true)) - GSDump::isRunning = false; - GSvsync(1); - GSreset(); - GSsetBaseMem((void*)regs); - GetCorePlugins().DoFreeze(PluginId_GS, 0, &fd, true); - - size_t i = 0; - size_t RunTo = 0; - size_t debug_idx = 0; - - while (GSDump::isRunning) - { - if (m_root_window->m_debug_mode->GetValue()) - { - if (m_root_window->m_button_events.size() > 0) - { - switch (m_root_window->m_button_events[0].index) - { - case Step: - if (debug_idx >= m_root_window->m_dump_packets.size()) - debug_idx = 0; - RunTo = debug_idx; - break; - case RunCursor: - RunTo = m_root_window->m_button_events[0].index; - if (debug_idx > RunTo) - debug_idx = 0; - break; - case RunVSync: - if (debug_idx >= m_root_window->m_dump_packets.size()) - debug_idx = 1; - auto it = std::find_if(m_root_window->m_dump_packets.begin() + debug_idx, m_root_window->m_dump_packets.end(), [](const GSData& gs) { return gs.id == Registers; }); - if (it != std::end(m_root_window->m_dump_packets)) - RunTo = std::distance(m_root_window->m_dump_packets.begin(), it); - break; - } - m_root_window->m_button_events.erase(m_root_window->m_button_events.begin()); - - if (debug_idx <= RunTo) - { - while (debug_idx <= RunTo) - { - m_root_window->ProcessDumpEvent(m_root_window->m_dump_packets[debug_idx++], regs); - } - auto it = std::find_if(m_root_window->m_dump_packets.begin() + debug_idx, m_root_window->m_dump_packets.end(), [](const GSData& gs) { return gs.id == Registers; }); - if (it != std::end(m_root_window->m_dump_packets)) - m_root_window->ProcessDumpEvent(*it, regs); - - debug_idx--; - } - - // do vsync - m_root_window->ProcessDumpEvent({VSync, 0, 0, Dummy}, regs); - } - } - else - { - while (i < (m_root_window->m_dump_packets.size())) - { - m_root_window->ProcessDumpEvent(m_root_window->m_dump_packets[i++], regs); - - if (i >= m_root_window->m_dump_packets.size() || m_root_window->m_dump_packets[i].id == VSync) - break; - } - if (i >= m_root_window->m_dump_packets.size()) - i = 0; - } - if (window) - { - if (!window->IsShown()) - { - sApp.CloseGsPanel(); - GSDump::isRunning = false; - } - } - } - - GetCorePlugins().Close(); - OnStop(); - return; -} - -void Dialogs::GSDumpDialog::PathChanged(wxFileSystemWatcherEvent& event) -{ - GetDumpsList(); -} diff --git a/pcsx2/gui/Dialogs/GSDumpDialog.cpp b/pcsx2/gui/Dialogs/GSDumpDialog.cpp index bf0e095e94..137266663c 100644 --- a/pcsx2/gui/Dialogs/GSDumpDialog.cpp +++ b/pcsx2/gui/Dialogs/GSDumpDialog.cpp @@ -69,14 +69,14 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent) , m_thread(std::make_unique(this)) , m_run(new wxButton(this, ID_RUN_DUMP, _("Run"), wxDefaultPosition, wxSize(150, 100))) { - wxBoxSizer& dump_info(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dump_preview(*new wxBoxSizer(wxVERTICAL)); - wxFlexGridSizer& debugger(*new wxFlexGridSizer(3, StdPadding, StdPadding)); - wxBoxSizer& dumps(*new wxBoxSizer(wxHORIZONTAL)); - wxBoxSizer& dbg_tree(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dbg_actions(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& gif(*new wxBoxSizer(wxVERTICAL)); - wxBoxSizer& dumps_list(*new wxBoxSizer(wxVERTICAL)); + wxBoxSizer* dump_info = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* dump_preview = new wxBoxSizer(wxVERTICAL); + wxFlexGridSizer* debugger = new wxFlexGridSizer(3, StdPadding, StdPadding); + wxBoxSizer* dumps = new wxBoxSizer(wxHORIZONTAL); + wxBoxSizer* dbg_tree = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* dbg_actions = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* gif = new wxBoxSizer(wxVERTICAL); + wxBoxSizer* dumps_list = new wxBoxSizer(wxVERTICAL); wxArrayString rdoverrides; rdoverrides.Add("None"); @@ -85,30 +85,30 @@ Dialogs::GSDumpDialog::GSDumpDialog(wxWindow* parent) rdoverrides.Add("OGL HW"); m_renderer_overrides->Create(this, wxID_ANY, "Renderer overrides", wxDefaultPosition, wxDefaultSize, rdoverrides, 1); - dbg_tree += new wxStaticText(this, wxID_ANY, _("GIF Packets")); - dbg_tree += m_gif_list | StdExpand(); - dbg_actions += m_debug_mode; - dbg_actions += m_start | StdExpand(); - dbg_actions += m_step | StdExpand(); - dbg_actions += m_selection | StdExpand(); - dbg_actions += m_vsync | StdExpand(); - gif += new wxStaticText(this, wxID_ANY, _("Packet Content")); - gif += m_gif_packet | StdExpand(); + dbg_tree->Add(new wxStaticText(this, wxID_ANY, _("GIF Packets"))); + dbg_tree->Add(m_gif_list, StdExpand()); + dbg_actions->Add(m_debug_mode); + dbg_actions->Add(m_start, StdExpand()); + dbg_actions->Add(m_step, StdExpand()); + dbg_actions->Add(m_selection, StdExpand()); + dbg_actions->Add(m_vsync, StdExpand()); + gif->Add(new wxStaticText(this, wxID_ANY, _("Packet Content"))); + gif->Add(m_gif_packet, StdExpand()); - dumps_list += new wxStaticText(this, wxID_ANY, _("GS Dumps List")) | StdExpand(); - dumps_list += m_dump_list | StdExpand(); - dump_info += m_renderer_overrides | StdExpand(); - dump_info += m_run | StdExpand(); - dump_preview += new wxStaticText(this, wxID_ANY, _("Preview")) | StdExpand(); - dump_preview += m_preview_image | StdCenter(); + dumps_list->Add(new wxStaticText(this, wxID_ANY, _("GS Dumps List")), StdExpand()); + dumps_list->Add(m_dump_list, StdExpand()); + dump_info->Add(m_renderer_overrides, StdExpand()); + dump_info->Add(m_run, StdExpand()); + dump_preview->Add(new wxStaticText(this, wxID_ANY, _("Preview")), StdExpand()); + dump_preview->Add(m_preview_image, StdCenter()); - dumps += dumps_list; - dumps += dump_info; - dumps += dump_preview; + dumps->Add(dumps_list); + dumps->Add(dump_info); + dumps->Add(dump_preview); - debugger += dbg_tree; - debugger += dbg_actions; - debugger += gif; + debugger->Add(dbg_tree); + debugger->Add(dbg_actions); + debugger->Add(gif); *this += dumps; *this += debugger; diff --git a/pcsx2/gui/Dialogs/ModalPopups.h b/pcsx2/gui/Dialogs/ModalPopups.h index 9b279cd8d6..029230f8c3 100644 --- a/pcsx2/gui/Dialogs/ModalPopups.h +++ b/pcsx2/gui/Dialogs/ModalPopups.h @@ -142,7 +142,7 @@ namespace Dialogs static wxString GetNameStatic() { - return L"AboutBox"; + return L"GSDumpGov"; } wxString GetDialogName() const {