mirror of https://github.com/PCSX2/pcsx2.git
GS: Double buffer the EE transfer queue
This commit is contained in:
parent
3c0b7f7724
commit
795d0a6682
|
@ -113,6 +113,7 @@ GSState::GSState()
|
|||
GrowVertexBuffer();
|
||||
|
||||
m_draw_transfers.clear();
|
||||
m_draw_transfers_double_buff.clear();
|
||||
|
||||
PRIM = &m_env.PRIM;
|
||||
//CSR->rREV = 0x20;
|
||||
|
|
|
@ -235,6 +235,7 @@ public:
|
|||
u32 m_dirty_gs_regs = 0;
|
||||
int m_backed_up_ctx = 0;
|
||||
std::vector<GSUploadQueue> m_draw_transfers;
|
||||
std::vector<GSUploadQueue> m_draw_transfers_double_buff;
|
||||
|
||||
static int s_n;
|
||||
static int s_last_transfer_draw_n;
|
||||
|
|
|
@ -119,15 +119,19 @@ void GSRendererHW::VSync(u32 field, bool registers_written, bool idle_frame)
|
|||
m_force_preload--;
|
||||
if (m_force_preload == 0)
|
||||
{
|
||||
for (auto iter = m_draw_transfers.begin(); iter != m_draw_transfers.end();)
|
||||
for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++)
|
||||
{
|
||||
if ((s_n - iter->draw) > 5)
|
||||
iter = m_draw_transfers.erase(iter);
|
||||
else
|
||||
break;
|
||||
else // Keep the last 5 draws worth of transfers.
|
||||
{
|
||||
iter++;
|
||||
GSUploadQueue transfer = *iter;
|
||||
m_draw_transfers_double_buff.push_back(transfer);
|
||||
}
|
||||
}
|
||||
m_draw_transfers.clear();
|
||||
// Flip EE queue.
|
||||
m_draw_transfers.swap(m_draw_transfers_double_buff);
|
||||
}
|
||||
}
|
||||
else if (!idle_frame)
|
||||
|
@ -136,18 +140,20 @@ void GSRendererHW::VSync(u32 field, bool registers_written, bool idle_frame)
|
|||
// Rocky Legend does this with the main menu FMV's.
|
||||
if (s_last_transfer_draw_n == s_n)
|
||||
{
|
||||
for (auto iter = m_draw_transfers.begin(); iter != m_draw_transfers.end();)
|
||||
for (auto iter = m_draw_transfers.rbegin(); iter != m_draw_transfers.rend(); iter++)
|
||||
{
|
||||
if ((s_n - iter->draw) > 5)
|
||||
iter = m_draw_transfers.erase(iter);
|
||||
else
|
||||
break;
|
||||
else // Keep the last 5 draws worth of transfers.
|
||||
{
|
||||
iter++;
|
||||
GSUploadQueue transfer = *iter;
|
||||
m_draw_transfers_double_buff.push_back(transfer);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
m_draw_transfers.clear();
|
||||
m_draw_transfers.clear();
|
||||
// Flip EE queue.
|
||||
m_draw_transfers.swap(m_draw_transfers_double_buff);
|
||||
}
|
||||
|
||||
if (GSConfig.LoadTextureReplacements)
|
||||
|
|
Loading…
Reference in New Issue