|
|
@ -211,7 +211,7 @@ u64 TextureCache<P>::ReclaimMemory(u64 target_bytes, bool allow_download) { |
|
|
const u64 cold_tick = |
|
|
const u64 cold_tick = |
|
|
frame_tick > RECLAIM_GUARD_FRAMES ? frame_tick - RECLAIM_GUARD_FRAMES : 0; |
|
|
frame_tick > RECLAIM_GUARD_FRAMES ? frame_tick - RECLAIM_GUARD_FRAMES : 0; |
|
|
lru_cache.ForEachItemBelow(cold_tick, evict); |
|
|
lru_cache.ForEachItemBelow(cold_tick, evict); |
|
|
if (freed < target_bytes) { |
|
|
|
|
|
|
|
|
if (freed == 0) { |
|
|
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(); |
|
|
const u64 exit_point = runtime.CompletedSyncPoint(); |
|
|
@ -221,6 +221,9 @@ u64 TextureCache<P>::ReclaimMemory(u64 target_bytes, bool allow_download) { |
|
|
in_reclaim = false; |
|
|
in_reclaim = false; |
|
|
usage_refresh_countdown = 0; |
|
|
usage_refresh_countdown = 0; |
|
|
reclaim_stalled = freed == 0; |
|
|
reclaim_stalled = freed == 0; |
|
|
|
|
|
if (freed > 0) { |
|
|
|
|
|
reclaim_wait_sync_point = runtime.CurrentSyncPoint(); |
|
|
|
|
|
} |
|
|
return freed; |
|
|
return freed; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
@ -229,13 +232,19 @@ void TextureCache<P>::EnsureHeadroom(bool allow_download) { |
|
|
if (reclaim_stalled) { |
|
|
if (reclaim_stalled) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
if (runtime.CompletedSyncPoint() < reclaim_wait_sync_point) { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
const u64 limit = memory_budget > RECLAIM_HEADROOM ? memory_budget - RECLAIM_HEADROOM : 0; |
|
|
const u64 limit = memory_budget > RECLAIM_HEADROOM ? memory_budget - RECLAIM_HEADROOM : 0; |
|
|
const u64 usage = DeviceUsage(false); |
|
|
const u64 usage = DeviceUsage(false); |
|
|
if (usage <= limit) { |
|
|
if (usage <= limit) { |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
const u64 target = (limit / 100) * RECLAIM_TARGET_PERCENT; |
|
|
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 <class P> |
|
|
template <class P> |
|
|
|