From c004e9ca9dd010116f2e8275c6f0b3bbb3460aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sat, 13 Nov 2021 22:10:37 +0100 Subject: [PATCH] Windows debugger: Load the dialogs on demand. I think this is especially good for the Ge dialog since we now can avoid initializing that extra GL context unless you open the dialog. --- Windows/Debugger/Debugger_Disasm.cpp | 3 ++- Windows/Debugger/Debugger_Lists.cpp | 3 +++ Windows/MainWindow.cpp | 33 ++++++++++++++++++---------- Windows/MainWindow.h | 5 +++-- Windows/MainWindowMenu.cpp | 3 +++ Windows/main.cpp | 5 ++++- 6 files changed, 36 insertions(+), 16 deletions(-) diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index 833a9dbe0d..5c4f0a13ad 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -899,7 +899,8 @@ void CDisasm::UpdateDialog(bool _bComplete) _snwprintf(tempTicks, 24, L"%lld", CoreTiming::GetTicks() - lastTicks); SetDlgItemText(m_hDlg, IDC_DEBUG_COUNT, tempTicks); } - // Update Register Dialog + + // Update memory window if (memoryWindow) memoryWindow->Update(); diff --git a/Windows/Debugger/Debugger_Lists.cpp b/Windows/Debugger/Debugger_Lists.cpp index 9c90d6d0f2..b60ed587d1 100644 --- a/Windows/Debugger/Debugger_Lists.cpp +++ b/Windows/Debugger/Debugger_Lists.cpp @@ -6,6 +6,7 @@ #include "Windows/Debugger/DebuggerShared.h" #include "Windows/Debugger/CtrlDisAsmView.h" #include "Windows/W32Util/ContextMenu.h" +#include "Windows/MainWindow.h" #include "Windows/resource.h" #include "Windows/main.h" #include "Common/Data/Encoding/Utf8.h" @@ -373,10 +374,12 @@ void CtrlBreakpointList::gotoBreakpointAddress(int itemIndex) if (isMemory) { u32 address = displayedMemChecks_[index].start; + MainWindow::CreateMemoryWindow(); if (memoryWindow) memoryWindow->Goto(address); } else { u32 address = displayedBreakPoints_[index].addr; + MainWindow::CreateDisasmWindow(); if (disasmWindow) disasmWindow->Goto(address); } diff --git a/Windows/MainWindow.cpp b/Windows/MainWindow.cpp index e583846e6c..22998cc376 100644 --- a/Windows/MainWindow.cpp +++ b/Windows/MainWindow.cpp @@ -533,36 +533,46 @@ namespace MainWindow return TRUE; } - void CreateDebugWindows() { - disasmWindow = new CDisasm(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); - DialogManager::AddDlg(disasmWindow); - disasmWindow->Show(g_Config.bShowDebuggerOnLoad, false); + void CreateDisasmWindow() { + if (!disasmWindow) { + disasmWindow = new CDisasm(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); + DialogManager::AddDlg(disasmWindow); + } + } + void CreateGeDebuggerWindow() { + if (!geDebuggerWindow) { #if PPSSPP_API(ANY_GL) - geDebuggerWindow = new CGEDebugger(MainWindow::GetHInstance(), MainWindow::GetHWND()); - DialogManager::AddDlg(geDebuggerWindow); + geDebuggerWindow = new CGEDebugger(MainWindow::GetHInstance(), MainWindow::GetHWND()); + DialogManager::AddDlg(geDebuggerWindow); #endif - memoryWindow = new CMemoryDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); - DialogManager::AddDlg(memoryWindow); + } + } + + void CreateMemoryWindow() { + if (!memoryWindow) { + memoryWindow = new CMemoryDlg(MainWindow::GetHInstance(), MainWindow::GetHWND(), currentDebugMIPS); + DialogManager::AddDlg(memoryWindow); + } } void DestroyDebugWindows() { DialogManager::RemoveDlg(disasmWindow); if (disasmWindow) delete disasmWindow; - disasmWindow = 0; + disasmWindow = nullptr; #if PPSSPP_API(ANY_GL) DialogManager::RemoveDlg(geDebuggerWindow); if (geDebuggerWindow) delete geDebuggerWindow; - geDebuggerWindow = 0; + geDebuggerWindow = nullptr; #endif DialogManager::RemoveDlg(memoryWindow); if (memoryWindow) delete memoryWindow; - memoryWindow = 0; + memoryWindow = nullptr; } LRESULT CALLBACK DisplayProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { @@ -928,7 +938,6 @@ namespace MainWindow disasmWindow->NotifyMapLoaded(); if (memoryWindow) memoryWindow->NotifyMapLoaded(); - if (disasmWindow) disasmWindow->UpdateDialog(); break; diff --git a/Windows/MainWindow.h b/Windows/MainWindow.h index 23ee0a2696..0792222d89 100644 --- a/Windows/MainWindow.h +++ b/Windows/MainWindow.h @@ -61,9 +61,10 @@ namespace MainWindow void Init(HINSTANCE hInstance); BOOL Show(HINSTANCE hInstance); - void CreateDebugWindows(); + void CreateDisasmWindow(); + void CreateGeDebuggerWindow(); + void CreateMemoryWindow(); void DestroyDebugWindows(); - void Close(); void UpdateMenus(bool isMenuSelect = false); void UpdateCommands(); void UpdateSwitchUMD(); diff --git a/Windows/MainWindowMenu.cpp b/Windows/MainWindowMenu.cpp index acda99fdbb..66e69787b3 100644 --- a/Windows/MainWindowMenu.cpp +++ b/Windows/MainWindowMenu.cpp @@ -896,18 +896,21 @@ namespace MainWindow { break; case ID_DEBUG_DISASSEMBLY: + CreateDisasmWindow(); if (disasmWindow) disasmWindow->Show(true); break; case ID_DEBUG_GEDEBUGGER: #if PPSSPP_API(ANY_GL) + CreateGeDebuggerWindow(); if (geDebuggerWindow) geDebuggerWindow->Show(true); #endif break; case ID_DEBUG_MEMORYVIEW: + CreateMemoryWindow(); if (memoryWindow) memoryWindow->Show(true); break; diff --git a/Windows/main.cpp b/Windows/main.cpp index 59ee239d7d..fab160b037 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -686,7 +686,10 @@ int WINAPI WinMain(HINSTANCE _hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLin #endif DialogManager::AddDlg(vfpudlg = new CVFPUDlg(_hInstance, hwndMain, currentDebugMIPS)); - MainWindow::CreateDebugWindows(); + if (g_Config.bShowDebuggerOnLoad) { + MainWindow::CreateDisasmWindow(); + disasmWindow->Show(g_Config.bShowDebuggerOnLoad, false); + } const bool minimized = iCmdShow == SW_MINIMIZE || iCmdShow == SW_SHOWMINIMIZED || iCmdShow == SW_SHOWMINNOACTIVE; if (minimized) {