diff options
| author | Pierre Bourdon <delroth@gmail.com> | 2018-11-07 09:32:37 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-11-07 09:32:37 +0100 |
| commit | dac58a859ca30262b79f72036f1e78ea54be83c4 (patch) | |
| tree | 9567559377284d746b77b07a14a01518017c99d4 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp | |
| parent | 710b893b914bcc1e812f1a63fdb9a143ff682561 (diff) | |
| parent | a45f977d265bb4360ca0b4a7fd189f4a30362f61 (diff) | |
Merge pull request #7539 from stenzek/batched-efb-copies
TextureCache: Deferred/batched EFB copies
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/StateTracker.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/StateTracker.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp index 38a91c61ad..f3b2752ddd 100644 --- a/Source/Core/VideoBackends/Vulkan/StateTracker.cpp +++ b/Source/Core/VideoBackends/Vulkan/StateTracker.cpp @@ -513,7 +513,7 @@ void StateTracker::OnDraw() } } -void StateTracker::OnReadback() +void StateTracker::OnCPUEFBAccess() { // Check this isn't another access without any draws inbetween. if (!m_cpu_accesses_this_frame.empty() && m_cpu_accesses_this_frame.back() == m_draw_counter) @@ -523,9 +523,28 @@ void StateTracker::OnReadback() m_cpu_accesses_this_frame.emplace_back(m_draw_counter); } +void StateTracker::OnEFBCopyToRAM() +{ + // If we're not deferring, try to preempt it next frame. + if (!g_ActiveConfig.bDeferEFBCopies) + { + OnCPUEFBAccess(); + return; + } + + // Otherwise, only execute if we have at least 10 objects between us and the last copy. + 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) + return; + + Util::ExecuteCurrentCommandsAndRestoreState(true); +} + void StateTracker::OnEndFrame() { m_draw_counter = 0; + m_last_efb_copy_draw_counter = 0; m_scheduled_command_buffer_kicks.clear(); // If we have no CPU access at all, leave everything in the one command buffer for maximum |
