GS/HW: Use range erase instead of vector swap for draw transfers

This commit is contained in:
Stenzek 2023-06-27 19:58:25 +10:00 committed by Connor McLaughlin
parent 29b97209fe
commit 828fb8972c
4 changed files with 12 additions and 25 deletions

View File

@ -112,9 +112,6 @@ GSState::GSState()
GrowVertexBuffer(); GrowVertexBuffer();
m_draw_transfers.clear();
m_draw_transfers_double_buff.clear();
PRIM = &m_env.PRIM; PRIM = &m_env.PRIM;
//CSR->rREV = 0x20; //CSR->rREV = 0x20;
m_env.PRMODECONT.AC = 1; m_env.PRMODECONT.AC = 1;

View File

@ -235,7 +235,6 @@ public:
u32 m_dirty_gs_regs = 0; u32 m_dirty_gs_regs = 0;
int m_backed_up_ctx = 0; int m_backed_up_ctx = 0;
std::vector<GSUploadQueue> m_draw_transfers; std::vector<GSUploadQueue> m_draw_transfers;
std::vector<GSUploadQueue> m_draw_transfers_double_buff;
static int s_n; static int s_n;
static int s_last_transfer_draw_n; static int s_last_transfer_draw_n;

View File

@ -122,16 +122,11 @@ void GSRendererHW::VSync(u32 field, bool registers_written, bool idle_frame)
for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++) for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++)
{ {
if ((s_n - iter->draw) > 5) if ((s_n - iter->draw) > 5)
break;
else // Keep the last 5 draws worth of transfers.
{ {
GSUploadQueue transfer = *iter; m_draw_transfers.erase(m_draw_transfers.begin(), std::next(iter).base());
m_draw_transfers_double_buff.push_back(transfer); break;
} }
} }
m_draw_transfers.clear();
// Flip EE queue.
m_draw_transfers.swap(m_draw_transfers_double_buff);
} }
} }
else if (!idle_frame) else if (!idle_frame)
@ -143,17 +138,16 @@ void GSRendererHW::VSync(u32 field, bool registers_written, bool idle_frame)
for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++) for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++)
{ {
if ((s_n - iter->draw) > 5) if ((s_n - iter->draw) > 5)
break;
else // Keep the last 5 draws worth of transfers.
{ {
GSUploadQueue transfer = *iter; m_draw_transfers.erase(m_draw_transfers.begin(), std::next(iter).base());
m_draw_transfers_double_buff.push_back(transfer); break;
} }
} }
} }
m_draw_transfers.clear(); else
// Flip EE queue. {
m_draw_transfers.swap(m_draw_transfers_double_buff); m_draw_transfers.clear();
}
} }
if (GSConfig.LoadTextureReplacements) if (GSConfig.LoadTextureReplacements)
@ -1094,11 +1088,11 @@ void GSRendererHW::InvalidateLocalMem(const GIFRegBITBLTBUF& BITBLTBUF, const GS
if (clut) if (clut)
return; // FIXME return; // FIXME
std::vector<GSState::GSUploadQueue>::iterator iter = GSRendererHW::GetInstance()->m_draw_transfers.end(); auto iter = m_draw_transfers.end();
bool skip = false; bool skip = false;
// If the EE write overlaps the readback and was done since the last draw, there's no need to read it back. // If the EE write overlaps the readback and was done since the last draw, there's no need to read it back.
// Dog's life does this. // Dog's life does this.
while (iter != GSRendererHW::GetInstance()->m_draw_transfers.begin()) while (iter != m_draw_transfers.begin())
{ {
--iter; --iter;
@ -4880,8 +4874,7 @@ __ri void GSRendererHW::DrawPrims(GSTextureCache::Target* rt, GSTextureCache::Ta
// If the EE uploaded a new CLUT since the last draw, use that. // If the EE uploaded a new CLUT since the last draw, use that.
bool GSRendererHW::HasEEUpload(GSVector4i r) bool GSRendererHW::HasEEUpload(GSVector4i r)
{ {
std::vector<GSState::GSUploadQueue>::iterator iter; for (auto iter = m_draw_transfers.begin(); iter != m_draw_transfers.end(); ++iter)
for (iter = m_draw_transfers.begin(); iter != m_draw_transfers.end();)
{ {
if (iter->draw == (s_n - 1) && iter->blit.DBP == m_cached_ctx.TEX0.TBP0 && GSUtil::HasSharedBits(iter->blit.DPSM, m_cached_ctx.TEX0.PSM)) if (iter->draw == (s_n - 1) && iter->blit.DBP == m_cached_ctx.TEX0.TBP0 && GSUtil::HasSharedBits(iter->blit.DPSM, m_cached_ctx.TEX0.PSM))
{ {
@ -4904,8 +4897,6 @@ bool GSRendererHW::HasEEUpload(GSVector4i r)
if (rect.rintersect(r).eq(r)) if (rect.rintersect(r).eq(r))
return true; return true;
} }
iter++;
} }
return false; return false;
} }

View File

@ -1548,7 +1548,7 @@ GSTextureCache::Target* GSTextureCache::CreateTarget(GIFRegTEX0 TEX0, const GSVe
else else
continue; continue;
} }
iter++; ++iter;
} }
if (!eerect.rempty()) if (!eerect.rempty())