From 22cb6b0c9c9bd3f8356b7c243fed7564021d2df1 Mon Sep 17 00:00:00 2001 From: refractionpcsx2 Date: Wed, 6 May 2026 23:33:21 +0100 Subject: [PATCH] GS/HW: Remove zero clear from GSUploadQueue, use transfer_type instead --- pcsx2/GS/GSState.cpp | 14 ++++++-------- pcsx2/GS/GSState.h | 6 +++--- pcsx2/GS/Renderers/HW/GSRendererHW.cpp | 4 ++-- pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp | 2 +- pcsx2/GS/Renderers/HW/GSTextureCache.cpp | 10 +++++----- 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp index 41891772aa..c2132201b5 100644 --- a/pcsx2/GS/GSState.cpp +++ b/pcsx2/GS/GSState.cpp @@ -1279,12 +1279,12 @@ void GSState::DumpTransferList(const std::string& filename) (*file) << std::endl; // clear, EE->GS, or GS->GS - (*file) << LIST_ITEM << "type: " << (transfer.zero_clear ? "clear" : ((transfer.transfer_type == EEGS_TransferType::EE_to_GS) ? "EE_to_GS" : "GS_to_GS")) << std::endl; + (*file) << LIST_ITEM << "type: " << ((transfer.transfer_type == EEGS_TransferType::Clear) ? "clear" : ((transfer.transfer_type == EEGS_TransferType::EE_to_GS) ? "EE_to_GS" : "GS_to_GS")) << std::endl; // Dump BITBLTBUF (*file) << INDENT << "BITBLTBUF: " << OPEN_MAP; - const bool gs_to_gs = (transfer.transfer_type == EEGS_TransferType::GS_to_GS) && !transfer.zero_clear; + const bool gs_to_gs = (transfer.transfer_type == EEGS_TransferType::GS_to_GS) && transfer.transfer_type != EEGS_TransferType::Clear; if (gs_to_gs) { @@ -1330,11 +1330,11 @@ void GSState::DumpTransferImages() const GSUploadQueue& transfer = m_draw_transfers[i]; std::string filename; - if ((transfer.transfer_type == EEGS_TransferType::EE_to_GS) || transfer.zero_clear) + if ((transfer.transfer_type == EEGS_TransferType::EE_to_GS) || transfer.transfer_type == EEGS_TransferType::Clear) { // clear or EE->GS: only the destination info is relevant. filename = GetDrawDumpPath("%05lld_transfer%02d_%s_%04x_%d_%s_%d_%d_%d_%d.png", - s_n, transfer_n++, (transfer.zero_clear ? "clear" : "EE_to_GS"), transfer.blit.DBP, transfer.blit.DBW, + s_n, transfer_n++, ((transfer.transfer_type == EEGS_TransferType::Clear) ? "clear" : "EE_to_GS"), transfer.blit.DBP, transfer.blit.DBW, GSUtil::GetPSMName(transfer.blit.DPSM), transfer.rect.x, transfer.rect.y, transfer.rect.z, transfer.rect.w); } else @@ -2911,12 +2911,11 @@ void GSState::Write(const u8* mem, int len) m_draw_transfers.pop_back(); transfer.rect = transfer.rect.runion(r); transfer.draw = s_n; - transfer.zero_clear = false; m_draw_transfers.push_back(transfer); } else { - const GSUploadQueue new_transfer = {blit, r, s_n, false, EEGS_TransferType::EE_to_GS}; + const GSUploadQueue new_transfer = {blit, s_n, r, EEGS_TransferType::EE_to_GS}; m_draw_transfers.push_back(new_transfer); } @@ -3111,12 +3110,11 @@ void GSState::Move() m_draw_transfers.pop_back(); transfer.rect = transfer.rect.runion(r); transfer.draw = s_n; - transfer.zero_clear = false; m_draw_transfers.push_back(transfer); } else { - const GSUploadQueue new_transfer = {m_env.BITBLTBUF, r, s_n, false, EEGS_TransferType::GS_to_GS}; + const GSUploadQueue new_transfer = {m_env.BITBLTBUF, s_n, r, EEGS_TransferType::GS_to_GS}; m_draw_transfers.push_back(new_transfer); } diff --git a/pcsx2/GS/GSState.h b/pcsx2/GS/GSState.h index 082e587ba4..dad4a86726 100644 --- a/pcsx2/GS/GSState.h +++ b/pcsx2/GS/GSState.h @@ -258,15 +258,15 @@ public: { EE_to_GS, GS_to_GS, - GS_to_EE + GS_to_EE, + Clear }; struct GSUploadQueue { GIFRegBITBLTBUF blit; - GSVector4i rect; u64 draw; - bool zero_clear; + GSVector4i rect; EEGS_TransferType transfer_type; }; diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp index 71c5e8124c..8e16e5388b 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp @@ -9761,12 +9761,12 @@ bool GSRendererHW::TryGSMemClear(bool no_rt, bool preserve_rt, bool invalidate_r rt_end_bp, m_cached_ctx.FRAME.PSM, m_cached_ctx.FRAME.FBW, m_cached_ctx.FRAME.FBMSK); GSUploadQueue clear_queue; + clear_queue.transfer_type = EEGS_TransferType::Clear; clear_queue.draw = s_n; clear_queue.rect = m_r; clear_queue.blit.DBP = m_cached_ctx.FRAME.Block(); clear_queue.blit.DBW = m_cached_ctx.FRAME.FBW; clear_queue.blit.DPSM = m_cached_ctx.FRAME.PSM; - clear_queue.zero_clear = true; m_draw_transfers.push_back(clear_queue); } else @@ -9791,12 +9791,12 @@ bool GSRendererHW::TryGSMemClear(bool no_rt, bool preserve_rt, bool invalidate_r ds_end_bp, m_cached_ctx.ZBUF.PSM, m_cached_ctx.FRAME.FBW); GSUploadQueue clear_queue; + clear_queue.transfer_type = EEGS_TransferType::Clear; clear_queue.draw = s_n; clear_queue.rect = m_r; clear_queue.blit.DBP = m_cached_ctx.ZBUF.Block(); clear_queue.blit.DBW = m_cached_ctx.FRAME.FBW; clear_queue.blit.DPSM = m_cached_ctx.ZBUF.PSM; - clear_queue.zero_clear = true; m_draw_transfers.push_back(clear_queue); } } diff --git a/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp b/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp index 79fc424955..5afd08eeac 100644 --- a/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp +++ b/pcsx2/GS/Renderers/HW/GSRendererHWMultiISA.cpp @@ -551,13 +551,13 @@ bool GSRendererHWFunctions::SwPrimRender(GSRendererHW& hw, bool invalidate_tc, b if (add_ee_transfer) { GSRendererHW::GSUploadQueue uq; + uq.transfer_type = GSRendererHW::GetInstance()->EEGS_TransferType::EE_to_GS; uq.blit.U64 = 0; uq.blit.DBP = hw.m_cached_ctx.FRAME.Block(); uq.blit.DBW = hw.m_cached_ctx.FRAME.FBW; uq.blit.DPSM = hw.m_cached_ctx.FRAME.PSM; uq.draw = GSState::s_n; uq.rect = bbox; - uq.zero_clear = false; hw.m_draw_transfers.push_back(uq); } diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp index e065c033db..122512b828 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp @@ -3482,14 +3482,15 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons else eerect = eerect.runion(targetr); + const bool transfer_is_clear = iter->transfer_type == GSRendererHW::GetInstance()->EEGS_TransferType::Clear; // Later writes might be partial over a previously cleared area. We want to upload in these cases. - hw_clear = hw_clear.has_value() ? (hw_clear.value() && iter->zero_clear) : iter->zero_clear; + hw_clear = hw_clear.has_value() ? (hw_clear.value() && transfer_is_clear) : transfer_is_clear; // When the write covers the entire target, don't bother checking any earlier writes. if (iter->blit.DBP <= TEX0.TBP0 && transfer_end >= rect_end) { // If it was a clear draw then we can use that as our target size. - if (iter->zero_clear && iter->blit.DBP == TEX0.TBP0 && iter->blit.DPSM == TEX0.PSM) + if (iter->transfer_type == GSRendererHW::GetInstance()->EEGS_TransferType::Clear && iter->blit.DBP == TEX0.TBP0 && iter->blit.DPSM == TEX0.PSM) dst->UpdateValidity(iter->rect); // Some games clear RT and Z at the same time, only erase if it's specifically this target. @@ -3528,7 +3529,7 @@ bool GSTextureCache::PreloadTarget(GIFRegTEX0 TEX0, const GSVector2i& size, cons if (iter->draw < (GSState::s_n - 1)) break; - if (iter->zero_clear && iter->blit.DBP == TEX0.TBP0 && iter->blit.DBW == TEX0.TBW) + if (iter->transfer_type == GSRendererHW::GetInstance()->EEGS_TransferType::Clear && iter->blit.DBP == TEX0.TBP0 && iter->blit.DBW == TEX0.TBW) { hw_clear = true; transfers.erase(std::next(iter).base()); @@ -3863,7 +3864,6 @@ GSTextureCache::Target* GSTextureCache::LookupDisplayTarget(GIFRegTEX0 TEX0, con const u32 bp = TEX0.TBP0; Target* dst = nullptr; - Target* dst_match = nullptr; auto* list = &m_dst[RenderTarget]; // Let's try to find a perfect frame that contains valid data @@ -4019,7 +4019,7 @@ GSTextureCache::Target* GSTextureCache::LookupDisplayTarget(GIFRegTEX0 TEX0, con else eerect = eerect.runion(targetr); - if (iter->zero_clear && iter->draw == last_draw) + if (iter->transfer_type == GSRendererHW::GetInstance()->EEGS_TransferType::Clear && iter->draw == last_draw) { can_create = false; break;