From e4f29899d22351711bb47256adf162064a367955 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Wed, 29 Jul 2026 16:32:54 -0400 Subject: [PATCH] [TEST] Adjustment memory reclamation 2 --- src/video_core/buffer_cache/buffer_cache.h | 13 +++++++++++-- src/video_core/buffer_cache/buffer_cache_base.h | 5 ++++- src/video_core/texture_cache/texture_cache.h | 13 +++++++++++-- src/video_core/texture_cache/texture_cache_base.h | 3 ++- src/video_core/vulkan_common/vulkan_device.cpp | 13 ++++++++++--- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index dceb18f7b7..1907d52f55 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -80,13 +80,16 @@ u64 BufferCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { const u64 cold_tick = frame_tick > RECLAIM_GUARD_FRAMES ? frame_tick - RECLAIM_GUARD_FRAMES : 0; lru_cache.ForEachItemBelow(cold_tick, clean_up); - if (freed < target_bytes) { + if (freed == 0) { lru_cache.ForEachItemBelow(frame_tick > 0 ? frame_tick - 1 : 0, clean_up); } sentenced_buffers.Reclaim(runtime.CompletedSyncPoint()); in_reclaim = false; usage_refresh_countdown = 0; reclaim_stalled = freed == 0; + if (freed > 0) { + reclaim_wait_sync_point = runtime.CurrentSyncPoint(); + } return freed; } @@ -95,13 +98,19 @@ void BufferCache

::EnsureHeadroom(bool allow_download) { if (reclaim_stalled) { return; } + if (runtime.CompletedSyncPoint() < reclaim_wait_sync_point) { + return; + } const u64 limit = memory_budget > RECLAIM_HEADROOM ? memory_budget - RECLAIM_HEADROOM : 0; const u64 usage = DeviceUsage(false); if (usage <= limit) { return; } const u64 target = (limit / 100) * RECLAIM_TARGET_PERCENT; - ReclaimMemory((std::min)(usage - target, total_used_memory), allow_download); + const u64 excess = usage - target; + const u64 usage_mib = (std::max)(usage >> 20, u64{1}); + const u64 share = (((excess >> 20) * (total_used_memory >> 20)) / usage_mib) << 20; + ReclaimMemory((std::min)(share, total_used_memory), allow_download); } template diff --git a/src/video_core/buffer_cache/buffer_cache_base.h b/src/video_core/buffer_cache/buffer_cache_base.h index 3422291441..f7f65f462e 100644 --- a/src/video_core/buffer_cache/buffer_cache_base.h +++ b/src/video_core/buffer_cache/buffer_cache_base.h @@ -191,7 +191,7 @@ class BufferCache : public VideoCommon::ChannelSetupCaches::ReclaimMemory(u64 target_bytes, bool allow_download) { const u64 cold_tick = frame_tick > RECLAIM_GUARD_FRAMES ? frame_tick - RECLAIM_GUARD_FRAMES : 0; lru_cache.ForEachItemBelow(cold_tick, evict); - if (freed < target_bytes) { + if (freed == 0) { lru_cache.ForEachItemBelow(frame_tick > 0 ? frame_tick - 1 : 0, evict); } const u64 exit_point = runtime.CompletedSyncPoint(); @@ -221,6 +221,9 @@ u64 TextureCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { in_reclaim = false; usage_refresh_countdown = 0; reclaim_stalled = freed == 0; + if (freed > 0) { + reclaim_wait_sync_point = runtime.CurrentSyncPoint(); + } return freed; } @@ -229,13 +232,19 @@ void TextureCache

::EnsureHeadroom(bool allow_download) { if (reclaim_stalled) { return; } + if (runtime.CompletedSyncPoint() < reclaim_wait_sync_point) { + return; + } const u64 limit = memory_budget > RECLAIM_HEADROOM ? memory_budget - RECLAIM_HEADROOM : 0; const u64 usage = DeviceUsage(false); if (usage <= limit) { return; } const u64 target = (limit / 100) * RECLAIM_TARGET_PERCENT; - ReclaimMemory((std::min)(usage - target, total_used_memory), allow_download); + const u64 excess = usage - target; + const u64 usage_mib = (std::max)(usage >> 20, u64{1}); + const u64 share = (((excess >> 20) * (total_used_memory >> 20)) / usage_mib) << 20; + ReclaimMemory((std::min)(share, total_used_memory), allow_download); } template diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index f704c64196..93a6a36f45 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h @@ -121,7 +121,7 @@ class TextureCache : public VideoCommon::ChannelSetupCaches(device_access_memory - device_initial_usage); - const u64 memory_size = Settings::values.vram_usage_mode.GetValue() == Settings::VramUsageMode::Aggressive ? 6_GiB : 4_GiB; - device_access_memory = static_cast(std::max(std::min(available_memory - 8_GiB, memory_size), std::min(local_memory, memory_size))); + const bool aggressive = + Settings::values.vram_usage_mode.GetValue() == Settings::VramUsageMode::Aggressive; + const s64 available_memory = + static_cast(device_access_memory) - static_cast(device_initial_usage); + const u64 reserve = std::min(local_memory / 8, 1_GiB); + const u64 usable = available_memory > static_cast(reserve) + ? static_cast(available_memory) - reserve + : 0; + const u64 cap = (local_memory / 8) * (aggressive ? 6 : 5); + device_access_memory = std::max(std::min(usable, cap), 1_GiB); } else { const u64 reserve_memory = std::min(device_access_memory / 8, 1_GiB); device_access_memory -= reserve_memory;