summaryrefslogtreecommitdiffstats
path: root/src/video_core/buffer_cache
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2021-06-17 00:29:48 +0200
committerFernando Sahmkow <fsahmkow27@gmail.com>2021-06-17 00:29:48 +0200
commitca6f47c6862a24dfa78f3d25c8b7819636218cdd (patch)
treed45fea664fa1e1d4de04b206289f638ffe1ceedc /src/video_core/buffer_cache
parentReaper: Address Feedback. (diff)
downloadyuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar.gz
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar.bz2
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar.lz
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar.xz
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.tar.zst
yuzu-ca6f47c6862a24dfa78f3d25c8b7819636218cdd.zip
Diffstat (limited to 'src/video_core/buffer_cache')
-rw-r--r--src/video_core/buffer_cache/buffer_cache.h48
1 files changed, 25 insertions, 23 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h
index 82a4a10d6..6d04d00da 100644
--- a/src/video_core/buffer_cache/buffer_cache.h
+++ b/src/video_core/buffer_cache/buffer_cache.h
@@ -106,6 +106,8 @@ public:
void TickFrame();
+ void RunGarbageCollector();
+
void WriteMemory(VAddr cpu_addr, u64 size);
void CachedWriteMemory(VAddr cpu_addr, u64 size);
@@ -350,29 +352,7 @@ BufferCache<P>::BufferCache(VideoCore::RasterizerInterface& rasterizer_,
}
template <class P>
-void BufferCache<P>::TickFrame() {
- const bool enabled_gc = Settings::values.use_caches_gc.GetValue();
- SCOPE_EXIT({
- ++frame_tick;
- delayed_destruction_ring.Tick();
- });
- // Calculate hits and shots and move hit bits to the right
- const u32 hits = std::reduce(uniform_cache_hits.begin(), uniform_cache_hits.end());
- const u32 shots = std::reduce(uniform_cache_shots.begin(), uniform_cache_shots.end());
- std::copy_n(uniform_cache_hits.begin(), uniform_cache_hits.size() - 1,
- uniform_cache_hits.begin() + 1);
- std::copy_n(uniform_cache_shots.begin(), uniform_cache_shots.size() - 1,
- uniform_cache_shots.begin() + 1);
- uniform_cache_hits[0] = 0;
- uniform_cache_shots[0] = 0;
-
- const bool skip_preferred = hits * 256 < shots * 251;
- uniform_buffer_skip_cache_size = skip_preferred ? DEFAULT_SKIP_CACHE_SIZE : 0;
-
- const bool activate_gc = enabled_gc && total_used_memory >= EXPECTED_MEMORY;
- if (!activate_gc) {
- return;
- }
+void BufferCache<P>::RunGarbageCollector() {
const bool aggressive_gc = total_used_memory >= CRITICAL_MEMORY;
const u64 ticks_to_destroy = aggressive_gc ? 60 : 120;
int num_iterations = aggressive_gc ? 64 : 32;
@@ -393,6 +373,28 @@ void BufferCache<P>::TickFrame() {
}
template <class P>
+void BufferCache<P>::TickFrame() {
+ // Calculate hits and shots and move hit bits to the right
+ const u32 hits = std::reduce(uniform_cache_hits.begin(), uniform_cache_hits.end());
+ const u32 shots = std::reduce(uniform_cache_shots.begin(), uniform_cache_shots.end());
+ std::copy_n(uniform_cache_hits.begin(), uniform_cache_hits.size() - 1,
+ uniform_cache_hits.begin() + 1);
+ std::copy_n(uniform_cache_shots.begin(), uniform_cache_shots.size() - 1,
+ uniform_cache_shots.begin() + 1);
+ uniform_cache_hits[0] = 0;
+ uniform_cache_shots[0] = 0;
+
+ const bool skip_preferred = hits * 256 < shots * 251;
+ uniform_buffer_skip_cache_size = skip_preferred ? DEFAULT_SKIP_CACHE_SIZE : 0;
+
+ if (Settings::values.use_caches_gc.GetValue() && total_used_memory >= EXPECTED_MEMORY) {
+ RunGarbageCollector();
+ }
+ ++frame_tick;
+ delayed_destruction_ring.Tick();
+}
+
+template <class P>
void BufferCache<P>::WriteMemory(VAddr cpu_addr, u64 size) {
ForEachBufferInRange(cpu_addr, size, [&](BufferId, Buffer& buffer) {
buffer.MarkRegionAsCpuModified(cpu_addr, size);