summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/StateTracker.cpp
diff options
context:
space:
mode:
authorPierre Bourdon <delroth@gmail.com>2018-11-07 09:32:37 +0100
committerGitHub <noreply@github.com>2018-11-07 09:32:37 +0100
commitdac58a859ca30262b79f72036f1e78ea54be83c4 (patch)
tree9567559377284d746b77b07a14a01518017c99d4 /Source/Core/VideoBackends/Vulkan/StateTracker.cpp
parent710b893b914bcc1e812f1a63fdb9a143ff682561 (diff)
parenta45f977d265bb4360ca0b4a7fd189f4a30362f61 (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.cpp21
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