From db22377a0d724365f715edfecba067820502d16a Mon Sep 17 00:00:00 2001
From: refractionpcsx2 <refraction@gmail.com>
Date: Sun, 19 Mar 2023 16:03:19 +0000
Subject: [PATCH] GS: Remove ExpandTarget on EE Write

---
 pcsx2/GS/GSState.cpp                     |  2 -
 pcsx2/GS/GSState.h                       |  1 -
 pcsx2/GS/Renderers/HW/GSRendererHW.cpp   |  5 ---
 pcsx2/GS/Renderers/HW/GSRendererHW.h     |  1 -
 pcsx2/GS/Renderers/HW/GSTextureCache.cpp | 56 ------------------------
 pcsx2/GS/Renderers/HW/GSTextureCache.h   |  1 -
 pcsx2/GS/Renderers/SW/GSRendererSW.cpp   |  2 -
 pcsx2/GS/Renderers/SW/GSRendererSW.h     |  1 -
 8 files changed, 69 deletions(-)

diff --git a/pcsx2/GS/GSState.cpp b/pcsx2/GS/GSState.cpp
index e0c5ba64f4..d1421479e5 100644
--- a/pcsx2/GS/GSState.cpp
+++ b/pcsx2/GS/GSState.cpp
@@ -1512,7 +1512,6 @@ void GSState::FlushWrite()
 	r.top = m_env.TRXPOS.DSAY;
 	r.right = r.left + m_env.TRXREG.RRW;
 	r.bottom = r.top + m_env.TRXREG.RRH;
-	ExpandTarget(m_env.BITBLTBUF, r);
 	InvalidateVideoMem(m_env.BITBLTBUF, r, true);
 
 	const GSLocalMemory::writeImage wi = GSLocalMemory::m_psm[m_env.BITBLTBUF.DPSM].wi;
@@ -1789,7 +1788,6 @@ void GSState::Write(const u8* mem, int len)
 	if (m_tr.end == 0 && len >= m_tr.total)
 	{
 		// received all data in one piece, no need to buffer it
-		ExpandTarget(m_env.BITBLTBUF, r);
 		InvalidateVideoMem(blit, r, true);
 
 		psm.wi(m_mem, m_tr.x, m_tr.y, mem, m_tr.total, blit, m_env.TRXPOS, m_env.TRXREG);
diff --git a/pcsx2/GS/GSState.h b/pcsx2/GS/GSState.h
index 5ae2756da4..4141db857e 100644
--- a/pcsx2/GS/GSState.h
+++ b/pcsx2/GS/GSState.h
@@ -891,7 +891,6 @@ public:
 	virtual void ReadbackTextureCache();
 	virtual void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) {}
 	virtual void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) {}
-	virtual void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) {}
 
 	virtual void Move();
 
diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp
index db4923d0b6..b6a6b73597 100644
--- a/pcsx2/GS/Renderers/HW/GSRendererHW.cpp
+++ b/pcsx2/GS/Renderers/HW/GSRendererHW.cpp
@@ -923,11 +923,6 @@ GSVector4i GSRendererHW::GetSplitTextureShuffleDrawRect() const
 	return r.insert64<0>(0).ralign<Align_Outside>(frame_psm.pgs);
 }
 
-void GSRendererHW::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r)
-{
-	m_tc->ExpandTarget(BITBLTBUF, r);
-}
-
 void GSRendererHW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite)
 {
 	// printf("[%d] InvalidateVideoMem %d,%d - %d,%d %05x (%d)\n", static_cast<int>(g_perfmon.GetFrame()), r.left, r.top, r.right, r.bottom, static_cast<int>(BITBLTBUF.DBP), static_cast<int>(BITBLTBUF.DPSM));
diff --git a/pcsx2/GS/Renderers/HW/GSRendererHW.h b/pcsx2/GS/Renderers/HW/GSRendererHW.h
index ba7d466c3b..69fa9f75ab 100644
--- a/pcsx2/GS/Renderers/HW/GSRendererHW.h
+++ b/pcsx2/GS/Renderers/HW/GSRendererHW.h
@@ -167,7 +167,6 @@ public:
 
 	GSTexture* GetOutput(int i, float& scale, int& y_offset) override;
 	GSTexture* GetFeedbackOutput(float& scale) override;
-	void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override;
 	void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) override;
 	void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override;
 	void Move() override;
diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp
index d7255ad861..fe57564069 100644
--- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp
+++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp
@@ -1554,62 +1554,6 @@ bool GSTextureCache::PrepareDownloadTexture(u32 width, u32 height, GSTexture::Fo
 	return true;
 }
 
-// Expands targets where the write from the EE overlaps the edge of a render target and uses the same base pointer.
-void GSTextureCache::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r)
-{
-	GIFRegTEX0 TEX0;
-	TEX0.TBP0 = BITBLTBUF.DBP;
-	TEX0.TBW = BITBLTBUF.DBW;
-	TEX0.PSM = BITBLTBUF.DPSM;
-	Target* dst = nullptr;
-	auto& list = m_dst[RenderTarget];
-	RGBAMask rgba;
-	rgba._u32 = GSUtil::GetChannelMask(TEX0.PSM);
-
-	for (auto i = list.begin(); i != list.end(); ++i)
-	{
-		Target* t = *i;
-
-		if (TEX0.TBP0 == t->m_TEX0.TBP0 && GSLocalMemory::m_psm[TEX0.PSM].bpp == GSLocalMemory::m_psm[t->m_TEX0.PSM].bpp && t->Overlaps(TEX0.TBP0, TEX0.TBW, TEX0.PSM, r))
-		{
-			list.MoveFront(i.Index());
-
-			dst = t;
-			break;
-		}
-	}
-
-	if (!dst)
-		return;
-
-	// Only expand the target when the FBW matches. Otherwise, games like GT4 will end up with the main render target
-	// being 2000+ due to unrelated EE writes.
-	if (TEX0.TBW == dst->m_TEX0.TBW)
-	{
-		// Round up to the nearest even height, like the draw target allocator.
-		const s32 aligned_height = Common::AlignUpPow2(r.w, 2);
-		if (r.z > dst->m_unscaled_size.x || aligned_height > dst->m_unscaled_size.y)
-		{
-			// We don't recycle here, because most of the time when this happens it's strange-sized textures
-			// which are being expanded one-line-at-a-time.
-			if (dst->ResizeTexture(std::max(r.z, dst->m_unscaled_size.x),
-					std::max(aligned_height, dst->m_unscaled_size.y), false))
-			{
-				AddDirtyRectTarget(dst, r, TEX0.PSM, TEX0.TBW, rgba);
-				GetTargetHeight(TEX0.TBP0, TEX0.TBW, TEX0.PSM, aligned_height);
-				dst->UpdateValidity(r);
-				dst->UpdateValidBits(GSLocalMemory::m_psm[TEX0.PSM].fmsk);
-			}
-		}
-	}
-	else
-	{
-		const GSVector4i clamped_r(r.rintersect(dst->GetUnscaledRect()));
-		AddDirtyRectTarget(dst, clamped_r, TEX0.PSM, TEX0.TBW, rgba);
-		dst->UpdateValidity(clamped_r);
-		dst->UpdateValidBits(GSLocalMemory::m_psm[TEX0.PSM].fmsk);
-	}
-}
 // Goal: Depth And Target at the same address is not possible. On GS it is
 // the same memory but not on the Dx/GL. Therefore a write to the Depth/Target
 // must invalidate the Target/Depth respectively
diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.h b/pcsx2/GS/Renderers/HW/GSTextureCache.h
index 7401f314ca..0dcb93b844 100644
--- a/pcsx2/GS/Renderers/HW/GSTextureCache.h
+++ b/pcsx2/GS/Renderers/HW/GSTextureCache.h
@@ -444,7 +444,6 @@ public:
 	u32 GetTargetHeight(u32 fbp, u32 fbw, u32 psm, u32 min_height);
 	bool Has32BitTarget(u32 bp);
 
-	void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r);
 	void InvalidateVideoMemType(int type, u32 bp);
 	void InvalidateVideoMemSubTarget(GSTextureCache::Target* rt);
 	void InvalidateVideoMem(const GSOffset& off, const GSVector4i& r, bool eewrite = false, bool target = true);
diff --git a/pcsx2/GS/Renderers/SW/GSRendererSW.cpp b/pcsx2/GS/Renderers/SW/GSRendererSW.cpp
index 2b730c176d..36c780ed83 100644
--- a/pcsx2/GS/Renderers/SW/GSRendererSW.cpp
+++ b/pcsx2/GS/Renderers/SW/GSRendererSW.cpp
@@ -617,8 +617,6 @@ void GSRendererSW::Sync(int reason)
 	g_perfmon.Put(GSPerfMon::Fillrate, pixels);
 }
 
-void  GSRendererSW::ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) {}
-
 void GSRendererSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite)
 {
 	if (LOG)
diff --git a/pcsx2/GS/Renderers/SW/GSRendererSW.h b/pcsx2/GS/Renderers/SW/GSRendererSW.h
index 509a06c0e8..9295a0f044 100644
--- a/pcsx2/GS/Renderers/SW/GSRendererSW.h
+++ b/pcsx2/GS/Renderers/SW/GSRendererSW.h
@@ -78,7 +78,6 @@ protected:
 	void Draw() override;
 	void Queue(GSRingHeap::SharedPtr<GSRasterizerData>& item);
 	void Sync(int reason);
-	void ExpandTarget(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r) override;
 	void InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool eewrite = false) override;
 	void InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GSVector4i& r, bool clut = false) override;