|
|
@ -153,7 +153,7 @@ u64 TextureCache<P>::ImageSizeBytes(const ImageBase& image) { |
|
|
|
|
|
|
|
|
template <class P> |
|
|
template <class P> |
|
|
u64 TextureCache<P>::DeviceUsage(bool force_refresh) { |
|
|
u64 TextureCache<P>::DeviceUsage(bool force_refresh) { |
|
|
if (!runtime.CanReportMemoryUsage()) { |
|
|
|
|
|
|
|
|
if (!runtime.CanReportAllocationUsage()) { |
|
|
return total_used_memory; |
|
|
return total_used_memory; |
|
|
} |
|
|
} |
|
|
if (force_refresh || usage_refresh_countdown == 0) { |
|
|
if (force_refresh || usage_refresh_countdown == 0) { |
|
|
@ -171,6 +171,16 @@ u64 TextureCache<P>::ReclaimMemory(u64 target_bytes, bool allow_download) { |
|
|
return 0; |
|
|
return 0; |
|
|
} |
|
|
} |
|
|
in_reclaim = true; |
|
|
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; |
|
|
u64 freed = 0; |
|
|
const auto evict = [&](ImageId image_id) { |
|
|
const auto evict = [&](ImageId image_id) { |
|
|
if (freed >= target_bytes) { |
|
|
if (freed >= target_bytes) { |
|
|
@ -209,9 +219,13 @@ u64 TextureCache<P>::ReclaimMemory(u64 target_bytes, bool allow_download) { |
|
|
if (freed < target_bytes) { |
|
|
if (freed < target_bytes) { |
|
|
lru_cache.ForEachItemBelow(frame_tick > 0 ? frame_tick - 1 : 0, evict); |
|
|
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; |
|
|
in_reclaim = false; |
|
|
usage_refresh_countdown = 0; |
|
|
usage_refresh_countdown = 0; |
|
|
reclaim_stalled = freed == 0; |
|
|
|
|
|
|
|
|
reclaim_stalled = freed == 0 && !drained; |
|
|
return freed; |
|
|
return freed; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|