diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index a01ea6aae6..a2248b3ff2 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -275,6 +275,9 @@ namespace SaveState if (g_Config.iRewindSnapshotInterval <= 0) { return; } + if (coreState != CORE_RUNNING) { + return; + } // For fast-forwarding, otherwise they may be useless and too close. double now = time_now_d(); diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 4a53aa740a..eed544a18d 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -248,7 +248,9 @@ void GPU_GLES::BeginHostFrame() { textureCache_->StartFrame(); // Save the cache from time to time. TODO: How often? We save on exit, so shouldn't need to do this all that often. - if (shaderCachePath_.Valid() && (gpuStats.numFlips & 4095) == 0) { + + const int saveShaderCacheFrameInterval = 32767; // power of 2 - 1. About every 10 minutes at 60fps. + if (shaderCachePath_.Valid() && !(gpuStats.numFlips & saveShaderCacheFrameInterval) && coreState == CORE_RUNNING) { shaderManagerGL_->SaveCache(shaderCachePath_, &drawEngine_); } shaderManagerGL_->DirtyLastShader(); diff --git a/Windows/GEDebugger/CtrlDisplayListView.cpp b/Windows/GEDebugger/CtrlDisplayListView.cpp index e759effefa..7318beb808 100644 --- a/Windows/GEDebugger/CtrlDisplayListView.cpp +++ b/Windows/GEDebugger/CtrlDisplayListView.cpp @@ -279,6 +279,10 @@ void CtrlDisplayListView::PromptBreakpointCond() { void CtrlDisplayListView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) { + if (!validDisplayList || !gpuDebug) { + return; + } + int y = HIWORD(lParam); int line = y/rowHeight; @@ -306,17 +310,15 @@ void CtrlDisplayListView::onMouseDown(WPARAM wParam, LPARAM lParam, int button) void CtrlDisplayListView::onMouseUp(WPARAM wParam, LPARAM lParam, int button) { + if (!validDisplayList || !gpuDebug) { + return; + } + if (button == 2) { HMENU menu = GetContextMenu(ContextMenuID::DISPLAYLISTVIEW); EnableMenuItem(menu, ID_GEDBG_SETCOND, GPUBreakpoints::IsAddressBreakpoint(curAddress) ? MF_ENABLED : MF_GRAYED); - // We don't want to let the users play with deallocated or uninitialized debugging objects - GlobalUIState state = GetUIState(); - if (state != UISTATE_INGAME && state != UISTATE_PAUSEMENU) { - return; - } - switch (TriggerContextMenu(ContextMenuID::DISPLAYLISTVIEW, wnd, ContextPoint::FromEvent(lParam))) { case ID_DISASM_GOTOINMEMORYVIEW: diff --git a/Windows/GEDebugger/CtrlDisplayListView.h b/Windows/GEDebugger/CtrlDisplayListView.h index 28adfdd371..47729b856c 100644 --- a/Windows/GEDebugger/CtrlDisplayListView.h +++ b/Windows/GEDebugger/CtrlDisplayListView.h @@ -56,6 +56,10 @@ public: list = displayList; gotoAddr(list.pc); } + void clearDisplayList() + { + validDisplayList = false; + } void scrollWindow(int lines) { diff --git a/Windows/GEDebugger/GEDebugger.cpp b/Windows/GEDebugger/GEDebugger.cpp index 6aa2265051..e33e882e6f 100644 --- a/Windows/GEDebugger/GEDebugger.cpp +++ b/Windows/GEDebugger/GEDebugger.cpp @@ -87,6 +87,8 @@ static void UpdateDisplayListTab(GEDebuggerTab *tab, TabControl *tabs, GETabPosi DisplayList list; if (gpuDebug != nullptr && gpuDebug->GetCurrentDisplayList(list)) { view->setDisplayList(list); + } else { + view->clearDisplayList(); } } @@ -291,13 +293,16 @@ void CGEDebugger::SetupPreviews() { EnableMenuItem(subMenu, ID_GEDBG_TRACK_PIXEL_STOP, primaryTrackX_ == 0xFFFFFFFF ? MF_GRAYED : MF_ENABLED); break; case ID_GEDBG_EXPORT_IMAGE: - PreviewExport(primaryBuffer_); + if (primaryBuffer_) + PreviewExport(primaryBuffer_); break; case ID_GEDBG_COPY_IMAGE: - PreviewToClipboard(primaryBuffer_, false); + if (primaryBuffer_) + PreviewToClipboard(primaryBuffer_, false); break; case ID_GEDBG_COPY_IMAGE_ALPHA: - PreviewToClipboard(primaryBuffer_, true); + if (primaryBuffer_) + PreviewToClipboard(primaryBuffer_, true); break; case ID_GEDBG_TRACK_PIXEL: primaryTrackX_ = x; @@ -336,13 +341,16 @@ void CGEDebugger::SetupPreviews() { EnableMenuItem(subMenu, ID_GEDBG_TRACK_PIXEL_STOP, secondTrackX_ == 0xFFFFFFFF ? MF_GRAYED : MF_ENABLED); break; case ID_GEDBG_EXPORT_IMAGE: - PreviewExport(secondBuffer_); + if (secondBuffer_) + PreviewExport(secondBuffer_); break; case ID_GEDBG_COPY_IMAGE: - PreviewToClipboard(secondBuffer_, false); + if (secondBuffer_) + PreviewToClipboard(secondBuffer_, false); break; case ID_GEDBG_COPY_IMAGE_ALPHA: - PreviewToClipboard(secondBuffer_, true); + if (secondBuffer_) + PreviewToClipboard(secondBuffer_, true); break; case ID_GEDBG_TRACK_PIXEL: secondTrackX_ = x;