From dbf5ee4e1f43e94710c7f2fe21aa40fe98bff852 Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Tue, 28 Jul 2026 00:06:09 -0400 Subject: [PATCH] [TEST] Keep tuning the drain/ memory allocation --- src/video_core/buffer_cache/buffer_cache.h | 8 ++++++-- .../renderer_opengl/gl_buffer_cache.h | 4 ++++ .../renderer_opengl/gl_texture_cache.h | 4 ++++ .../renderer_vulkan/vk_buffer_cache.h | 4 ++++ .../renderer_vulkan/vk_texture_cache.h | 4 ++++ src/video_core/texture_cache/texture_cache.h | 18 ++++++++++++++++-- 6 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 986630cd58..5009e12e5e 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -43,7 +43,7 @@ BufferCache

::~BufferCache() = default; template u64 BufferCache

::DeviceUsage(bool force_refresh) { - if (!runtime.CanReportMemoryUsage()) { + if (!runtime.CanReportAllocationUsage()) { return total_used_memory; } if (force_refresh || usage_refresh_countdown == 0) { @@ -61,6 +61,9 @@ u64 BufferCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { return 0; } in_reclaim = true; + const size_t sentenced_before = sentenced_buffers.Size(); + sentenced_buffers.Reclaim(runtime.CompletedSyncPoint()); + const bool drained = sentenced_buffers.Size() != sentenced_before; u64 freed = 0; const auto clean_up = [&](BufferId buffer_id) { if (freed >= target_bytes) { @@ -82,9 +85,10 @@ u64 BufferCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { if (freed < target_bytes) { 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; + reclaim_stalled = freed == 0 && !drained; return freed; } diff --git a/src/video_core/renderer_opengl/gl_buffer_cache.h b/src/video_core/renderer_opengl/gl_buffer_cache.h index 7ee8464c48..e9834b6638 100644 --- a/src/video_core/renderer_opengl/gl_buffer_cache.h +++ b/src/video_core/renderer_opengl/gl_buffer_cache.h @@ -142,6 +142,10 @@ public: return GetDeviceMemoryUsage(); } + bool CanReportAllocationUsage() const { + return device.CanReportMemoryUsage(); + } + void BindFastUniformBuffer(size_t stage, u32 binding_index, u32 size) { const GLuint handle = fast_uniforms[stage][binding_index].handle; const GLsizeiptr gl_size = static_cast(size); diff --git a/src/video_core/renderer_opengl/gl_texture_cache.h b/src/video_core/renderer_opengl/gl_texture_cache.h index 942ffdd514..17f860f910 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.h +++ b/src/video_core/renderer_opengl/gl_texture_cache.h @@ -91,6 +91,10 @@ public: return GetDeviceMemoryUsage(); } + bool CanReportAllocationUsage() const { + return device.CanReportMemoryUsage(); + } + bool CanReportMemoryUsage() const { return device.CanReportMemoryUsage(); } diff --git a/src/video_core/renderer_vulkan/vk_buffer_cache.h b/src/video_core/renderer_vulkan/vk_buffer_cache.h index ed45aa7125..7f097a5fa7 100644 --- a/src/video_core/renderer_vulkan/vk_buffer_cache.h +++ b/src/video_core/renderer_vulkan/vk_buffer_cache.h @@ -110,6 +110,10 @@ public: u64 GetDeviceAllocationUsage() const; + bool CanReportAllocationUsage() const noexcept { + return true; + } + bool CanReportMemoryUsage() const; u32 GetUniformBufferAlignment() const; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 1ef3639853..41d9c38c70 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -72,6 +72,10 @@ public: u64 GetDeviceAllocationUsage() const; + bool CanReportAllocationUsage() const noexcept { + return true; + } + bool CanReportMemoryUsage() const; std::optional GetSamplerHeapBudget() const; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index d6a4c00e53..f171b969d9 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -153,7 +153,7 @@ u64 TextureCache

::ImageSizeBytes(const ImageBase& image) { template u64 TextureCache

::DeviceUsage(bool force_refresh) { - if (!runtime.CanReportMemoryUsage()) { + if (!runtime.CanReportAllocationUsage()) { return total_used_memory; } if (force_refresh || usage_refresh_countdown == 0) { @@ -171,6 +171,16 @@ u64 TextureCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { return 0; } in_reclaim = true; + const u64 drain_point = runtime.CompletedSyncPoint(); + const size_t sentenced_before = sentenced_images.Size() + sentenced_image_view.Size() + + sentenced_framebuffers.Size(); + TickEvictionDownloads(drain_point); + sentenced_images.Reclaim(drain_point); + sentenced_image_view.Reclaim(drain_point); + sentenced_framebuffers.Reclaim(drain_point); + const bool drained = sentenced_images.Size() + sentenced_image_view.Size() + + sentenced_framebuffers.Size() != + sentenced_before; u64 freed = 0; const auto evict = [&](ImageId image_id) { if (freed >= target_bytes) { @@ -209,9 +219,13 @@ u64 TextureCache

::ReclaimMemory(u64 target_bytes, bool allow_download) { if (freed < target_bytes) { lru_cache.ForEachItemBelow(frame_tick > 0 ? frame_tick - 1 : 0, evict); } + const u64 exit_point = runtime.CompletedSyncPoint(); + sentenced_images.Reclaim(exit_point); + sentenced_image_view.Reclaim(exit_point); + sentenced_framebuffers.Reclaim(exit_point); in_reclaim = false; usage_refresh_countdown = 0; - reclaim_stalled = freed == 0; + reclaim_stalled = freed == 0 && !drained; return freed; }