summaryrefslogtreecommitdiffstats
path: root/src/video_core/texture_cache/texture_cache.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/video_core/texture_cache/texture_cache.h')
-rw-r--r--src/video_core/texture_cache/texture_cache.h38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 53b4876f2..feb1c575e 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -72,12 +72,19 @@ TextureCache<P>::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag
template <class P>
void TextureCache<P>::RunGarbageCollector() {
- bool high_priority_mode = total_used_memory >= expected_memory;
- bool aggressive_mode = total_used_memory >= critical_memory;
- const u64 ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 50ULL;
- size_t num_iterations = aggressive_mode ? 40 : (high_priority_mode ? 20 : 10);
- const auto clean_up = [this, &num_iterations, &high_priority_mode,
- &aggressive_mode](ImageId image_id) {
+ bool high_priority_mode = false;
+ bool aggressive_mode = false;
+ u64 ticks_to_destroy = 0;
+ size_t num_iterations = 0;
+
+ const auto Configure = [&](bool allow_aggressive) {
+ high_priority_mode = total_used_memory >= expected_memory;
+ aggressive_mode = allow_aggressive && total_used_memory >= critical_memory;
+ ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 50ULL;
+ num_iterations = aggressive_mode ? 40 : (high_priority_mode ? 20 : 10);
+ };
+ const auto Cleanup = [this, &num_iterations, &high_priority_mode,
+ &aggressive_mode](ImageId image_id) {
if (num_iterations == 0) {
return true;
}
@@ -123,7 +130,16 @@ void TextureCache<P>::RunGarbageCollector() {
}
return false;
};
- lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, clean_up);
+
+ // Try to remove anything old enough and not high priority.
+ Configure(false);
+ lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup);
+
+ // If pressure is still too high, prune aggressively.
+ if (total_used_memory >= critical_memory) {
+ Configure(true);
+ lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, Cleanup);
+ }
}
template <class P>
@@ -2098,7 +2114,9 @@ void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) {
ASSERT(False(image.flags & ImageFlagBits::Tracked));
image.flags |= ImageFlagBits::Tracked;
if (False(image.flags & ImageFlagBits::Sparse)) {
- device_memory.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1);
+ if (image.cpu_addr < ~(1ULL << 40)) {
+ device_memory.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1);
+ }
return;
}
if (True(image.flags & ImageFlagBits::Registered)) {
@@ -2124,7 +2142,9 @@ void TextureCache<P>::UntrackImage(ImageBase& image, ImageId image_id) {
ASSERT(True(image.flags & ImageFlagBits::Tracked));
image.flags &= ~ImageFlagBits::Tracked;
if (False(image.flags & ImageFlagBits::Sparse)) {
- device_memory.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, -1);
+ if (image.cpu_addr < ~(1ULL << 40)) {
+ device_memory.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, -1);
+ }
return;
}
ASSERT(True(image.flags & ImageFlagBits::Registered));