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 ::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 ::ImageSizeBytes(const ImageBase& image) {
template ::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;
}