From 4fd06b5ea86eeb9d8deae07523f5fbb8d7175519 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Fri, 27 May 2022 21:24:21 +1000 Subject: [PATCH] GS: Clear current/merge textures on hardware reset --- pcsx2/GS/GS.cpp | 4 ++++ pcsx2/GS/Renderers/Common/GSDevice.cpp | 15 +++++++++++++++ pcsx2/GS/Renderers/Common/GSDevice.h | 1 + pcsx2/GS/Renderers/Common/GSRenderer.cpp | 9 +++++++++ pcsx2/GS/Renderers/Common/GSRenderer.h | 2 ++ 5 files changed, 31 insertions(+) diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index 310cd8b3b5..6677dc9914 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -496,6 +496,10 @@ int GSfreeze(FreezeAction mode, freezeData* data) } else if (mode == FreezeAction::Load) { + // Since Defrost doesn't do a hardware reset (since it would be clearing + // local memory just before it's overwritten), we have to manually wipe + // out the current textures. + g_gs_device->ClearCurrent(); return g_gs_renderer->Defrost(data); } } diff --git a/pcsx2/GS/Renderers/Common/GSDevice.cpp b/pcsx2/GS/Renderers/Common/GSDevice.cpp index 6e665ff260..487baa085e 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.cpp +++ b/pcsx2/GS/Renderers/Common/GSDevice.cpp @@ -315,6 +315,21 @@ void GSDevice::StretchRect(GSTexture* sTex, GSTexture* dTex, const GSVector4& dR StretchRect(sTex, GSVector4(0, 0, 1, 1), dTex, dRect, shader, linear); } +void GSDevice::ClearCurrent() +{ + m_current = nullptr; + + delete m_merge; + delete m_weavebob; + delete m_blend; + delete m_target_tmp; + + m_merge = nullptr; + m_weavebob = nullptr; + m_blend = nullptr; + m_target_tmp = nullptr; +} + void GSDevice::Merge(GSTexture* sTex[3], GSVector4* sRect, GSVector4* dRect, const GSVector2i& fs, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c) { // KH:COM crashes at startup when booting *through the bios* due to m_merge being NULL. diff --git a/pcsx2/GS/Renderers/Common/GSDevice.h b/pcsx2/GS/Renderers/Common/GSDevice.h index 76a53749c5..05e1550ece 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.h +++ b/pcsx2/GS/Renderers/Common/GSDevice.h @@ -727,6 +727,7 @@ public: __fi FeatureSupport Features() const { return m_features; } __fi GSTexture* GetCurrent() const { return m_current; } + void ClearCurrent(); void Merge(GSTexture* sTex[3], GSVector4* sRect, GSVector4* dRect, const GSVector2i& fs, const GSRegPMODE& PMODE, const GSRegEXTBUF& EXTBUF, const GSVector4& c); void Interlace(const GSVector2i& ds, int field, int mode, float yoffset); void FXAA(); diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.cpp b/pcsx2/GS/Renderers/Common/GSRenderer.cpp index d073153c9f..6e6d173c68 100644 --- a/pcsx2/GS/Renderers/Common/GSRenderer.cpp +++ b/pcsx2/GS/Renderers/Common/GSRenderer.cpp @@ -60,6 +60,15 @@ GSRenderer::GSRenderer() = default; GSRenderer::~GSRenderer() = default; +void GSRenderer::Reset(bool hardware_reset) +{ + // clear the current display texture + if (hardware_reset) + g_gs_device->ClearCurrent(); + + GSState::Reset(hardware_reset); +} + void GSRenderer::Destroy() { } diff --git a/pcsx2/GS/Renderers/Common/GSRenderer.h b/pcsx2/GS/Renderers/Common/GSRenderer.h index 9fa0d28e21..30c0148cdc 100644 --- a/pcsx2/GS/Renderers/Common/GSRenderer.h +++ b/pcsx2/GS/Renderers/Common/GSRenderer.h @@ -51,6 +51,8 @@ public: GSRenderer(); virtual ~GSRenderer(); + virtual void Reset(bool hardware_reset) override; + virtual void Destroy(); virtual void VSync(u32 field, bool registers_written);