From cd4c1e920e846533c07304039a4e269e4cf066c4 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Sat, 18 Feb 2023 20:09:22 +0000 Subject: [PATCH] GS: Flush targets back to GS memory when swapping renderers --- pcsx2/GS/GS.cpp | 2 ++ pcsx2/GS/Renderers/HW/GSRendererHW.cpp | 2 +- pcsx2/GS/Renderers/HW/GSTextureCache.cpp | 6 +++++- pcsx2/GS/Renderers/HW/GSTextureCache.h | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index 439beb40be..059b2dfa25 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -800,6 +800,8 @@ void GSSwitchRenderer(GSRendererType new_renderer) if (existing_api == RenderAPI::OpenGLES) existing_api = RenderAPI::OpenGL; + g_gs_renderer->PurgeTextureCache(); + const bool is_software_switch = (new_renderer == GSRendererType::SW || GSConfig.Renderer == GSRendererType::SW); const bool recreate_display = (!is_software_switch && existing_api != GetAPIForRenderer(new_renderer)); const Pcsx2Config::GSOptions old_config(GSConfig); diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index 193e875b01..ecb10ad774 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -72,7 +72,7 @@ void GSRendererHW::Destroy() void GSRendererHW::PurgeTextureCache() { GSRenderer::PurgeTextureCache(); - m_tc->RemoveAll(); + m_tc->RemoveAll(true); } GSTexture* GSRendererHW::LookupPaletteSource(u32 CBP, u32 CPSM, u32 CBW, GSVector2i& offset, const GSVector2i& size) diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp index 8a438450ca..57b23ffcfc 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp @@ -46,14 +46,18 @@ GSTextureCache::~GSTextureCache() _aligned_free(s_unswizzle_buffer); } -void GSTextureCache::RemoveAll() +void GSTextureCache::RemoveAll(bool readback_targets) { m_src.RemoveAll(); for (int type = 0; type < 2; type++) { for (auto t : m_dst[type]) + { + if (readback_targets) + Read(t, t->m_drawn_since_read); delete t; + } m_dst[type].clear(); } diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.h b/pcsx2/GS/Renderers/HW/GSTextureCache.h index 06bebb6352..8be30fedc1 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.h +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.h @@ -396,7 +396,7 @@ public: void Read(Target* t, const GSVector4i& r); void Read(Source* t, const GSVector4i& r); - void RemoveAll(); + void RemoveAll(bool readback_targets = false); void AddDirtyRectTarget(Target* target, GSVector4i rect, u32 psm, u32 bw); GSTexture* LookupPaletteSource(u32 CBP, u32 CPSM, u32 CBW, GSVector2i& offset, const GSVector2i& size);