From 4c7ad66bd7ca50ea25e8705e68fe9e46bc674f68 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Tue, 31 Jan 2023 11:49:00 +0000 Subject: [PATCH] GS-HW: Check for CLUT upload before invalidating or running on GPU. Clean up some preload code and improve the detection. --- pcsx2/GS/Renderers/HW/GSRendererHW.cpp | 15 +++++++++++++++ pcsx2/GS/Renderers/HW/GSTextureCache.cpp | 9 ++------- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index 1f5d861ac5..299ccb642e 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -209,6 +209,7 @@ void GSRendererHW::VSync(u32 field, bool registers_written) else m_force_preload = false; + m_draw_transfers.clear(); if (GSConfig.LoadTextureReplacements) GSTextureReplacements::ProcessAsyncLoadedTextures(); @@ -4002,6 +4003,12 @@ GSRendererHW::CLUTDrawTestResult GSRendererHW::PossibleCLUTDraw() // If we have GPU CLUT enabled, don't do a CPU draw when it would result in a download. if (GSConfig.UserHacks_GPUTargetCLUTMode != GSGPUTargetCLUTMode::Disabled) { + for (auto upload : m_draw_transfers) + { + if (upload.DBP == m_context->TEX0.TBP0 && GSUtil::HasSharedBits(upload.DPSM, m_context->TEX0.PSM)) + return CLUTDrawTestResult::CLUTDrawOnCPU; + } + GSTextureCache::Target* tgt = m_tc->GetExactTarget(m_context->TEX0.TBP0, m_context->TEX0.TBW, m_context->TEX0.PSM); if (tgt) { @@ -4021,6 +4028,14 @@ GSRendererHW::CLUTDrawTestResult GSRendererHW::PossibleCLUTDraw() } } } + else + { + for (auto upload : m_draw_transfers) + { + if (upload.DBP == m_context->TEX0.TBP0 && GSUtil::HasSharedBits(upload.DPSM, m_context->TEX0.PSM)) + return CLUTDrawTestResult::CLUTDrawOnCPU; + } + } GIFRegBITBLTBUF BITBLTBUF = {}; BITBLTBUF.SBP = m_context->TEX0.TBP0; diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp index 3a47e1a90a..84ba7b86aa 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp @@ -706,12 +706,9 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con { if (!is_frame && !forced_preload) { - // Check for an EE transfer that matches our RT. - while (static_cast(g_gs_renderer.get())->m_draw_transfers.size() > 0) + for (auto transfer : static_cast(g_gs_renderer.get())->m_draw_transfers) { - const GIFRegBITBLTBUF* transfer = &static_cast(g_gs_renderer.get())->m_draw_transfers.front(); - - if (transfer->DBP == TEX0.TBP0 && GSUtil::HasSharedBits(transfer->DPSM, TEX0.PSM)) + if (transfer.DBP == TEX0.TBP0 && GSUtil::HasSharedBits(transfer.DPSM, TEX0.PSM)) { GL_INS("Preloading the RT DATA"); const GSVector4i newrect = GSVector4i(0, 0, real_w, real_h); @@ -719,7 +716,6 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con dst->Update(true); break; } - static_cast(g_gs_renderer.get())->m_draw_transfers.pop_front(); } } else @@ -729,7 +725,6 @@ GSTextureCache::Target* GSTextureCache::LookupTarget(const GIFRegTEX0& TEX0, con AddDirtyRectTarget(dst, newrect, TEX0.PSM, TEX0.TBW); dst->Update(true); } - static_cast(g_gs_renderer.get())->m_draw_transfers.clear(); } } if (used)