From 753efd8c4ac2d3eeb123706b58e7e55d4a1cda59 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 26 Feb 2023 14:51:04 +1000 Subject: [PATCH] GS/HW: Track target sources in all pages ... instead of just the first page it falls within. --- pcsx2/GS/Renderers/HW/GSTextureCache.cpp | 26 +++--------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp index 15143a2dc0..86be04ed75 100644 --- a/pcsx2/GS/Renderers/HW/GSTextureCache.cpp +++ b/pcsx2/GS/Renderers/HW/GSTextureCache.cpp @@ -2985,7 +2985,7 @@ void GSTextureCache::Source::SetPages() m_repeating = !m_from_hash_cache && m_TEX0.IsRepeating() && !m_region.IsFixedTEX0(tw, th); - if (m_repeating && !CanPreload()) + if (m_repeating && !m_target && !CanPreload()) { // TODO: wrong for lupin/invalid tex0 m_p2t = g_gs_renderer->m_mem.GetPage2TileMap(m_TEX0); @@ -3519,18 +3519,6 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0, const GSO { m_surfaces.insert(s); - if (s->m_target) - { - // TODO - - // GH: I don't know why but it seems we only consider the first page for a render target - const size_t page = TEX0.TBP0 >> 5; - - s->m_erase_it[page] = m_map[page].InsertFront(s); - - return; - } - // The source pointer will be stored/duplicated in all m_map[array of pages] s->m_pages.loopPages([this, s](u32 page) { @@ -3568,18 +3556,10 @@ void GSTextureCache::SourceMap::RemoveAt(Source* s) s->m_texture ? s->m_texture->GetID() : 0, s->m_TEX0.TBP0); - if (s->m_target) + s->m_pages.loopPages([this, s](u32 page) { - const size_t page = s->m_TEX0.TBP0 >> 5; m_map[page].EraseIndex(s->m_erase_it[page]); - } - else - { - s->m_pages.loopPages([this, s](u32 page) - { - m_map[page].EraseIndex(s->m_erase_it[page]); - }); - } + }); if (s->m_from_hash_cache) {