Merge pull request #10777 from tellowkrinkle/EFBFlush

VideoCommon: Remember to flush command buffers after multiple EFB copies
This commit is contained in:
JMC47 2022-07-13 19:45:31 -04:00 committed by GitHub
commit e237aa1435
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 0 deletions

View File

@ -789,6 +789,16 @@ void VertexManagerBase::OnDraw()
{
m_draw_counter++;
// If the last efb copy was too close to the one before it, don't forget about it until the next
// efb copy happens (which might not be for a long time)
u32 diff = m_draw_counter - m_last_efb_copy_draw_counter;
if (m_unflushed_efb_copy && diff > MINIMUM_DRAW_CALLS_PER_COMMAND_BUFFER_FOR_READBACK)
{
g_renderer->Flush();
m_unflushed_efb_copy = false;
m_last_efb_copy_draw_counter = m_draw_counter;
}
// If we didn't have any CPU access last frame, do nothing.
if (m_scheduled_command_buffer_kicks.empty() || !m_allow_background_execution)
return;
@ -800,6 +810,8 @@ void VertexManagerBase::OnDraw()
{
// Kick a command buffer on the background thread.
g_renderer->Flush();
m_unflushed_efb_copy = false;
m_last_efb_copy_draw_counter = m_draw_counter;
}
}
@ -826,8 +838,12 @@ void VertexManagerBase::OnEFBCopyToRAM()
const u32 diff = m_draw_counter - m_last_efb_copy_draw_counter;
m_last_efb_copy_draw_counter = m_draw_counter;
if (diff < MINIMUM_DRAW_CALLS_PER_COMMAND_BUFFER_FOR_READBACK)
{
m_unflushed_efb_copy = true;
return;
}
m_unflushed_efb_copy = false;
g_renderer->Flush();
}

View File

@ -212,6 +212,7 @@ private:
// CPU access tracking
u32 m_draw_counter = 0;
u32 m_last_efb_copy_draw_counter = 0;
bool m_unflushed_efb_copy = false;
std::vector<u32> m_cpu_accesses_this_frame;
std::vector<u32> m_scheduled_command_buffer_kicks;
bool m_allow_background_execution = true;