aboutsummaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache/texture_cache.h
diff options
context:
space:
mode:
authorTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 07:05:03 -0400
committerTakoroka <137927095+Takoroka@users.noreply.github.com>2026-10-29 20:49:47 -0400
commit6912d650f7d0b47dfec9705ca6c400f90ada5bef (patch)
tree36b16f25a28f71b0c039528f8b491128cd2a748f /src/video_core/texture_cache/texture_cache.h
parent6b7185676d59976bf02f6666368032067ff344bc (diff)
texture_cache: count evictions that download; EDEN_NX2_TC_MIN_AGE knob
The collector's periodic log now also counts evictions that downloaded the image first (each a full GPU wait). EDEN_NX2_TC_MIN_AGE=<frames> keeps images used more recently than that (a VRAM thrash test on 8 GB: 120 frames made no difference over three runs).
Diffstat (limited to 'src/video_core/texture_cache/texture_cache.h')
-rw-r--r--src/video_core/texture_cache/texture_cache.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index fb8adef161..b95d9d8a39 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -129,6 +129,12 @@ void TextureCache<P>::RunGarbageCollector() {
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;
+ // EDEN_NX2_TC_MIN_AGE=<frames>: never evict images used more recently (thrash tests).
+ static const u64 min_age = [] {
+ const char* value = std::getenv("EDEN_NX2_TC_MIN_AGE");
+ return value != nullptr ? std::strtoull(value, nullptr, 10) : 0ULL;
+ }();
+ ticks_to_destroy = (std::max)(ticks_to_destroy, min_age);
num_iterations = aggressive_mode ? 40 : (high_priority_mode ? 20 : 10);
};
const auto Cleanup = [this, &num_iterations, &high_priority_mode, &aggressive_mode](ImageId image_id) {
@@ -150,6 +156,7 @@ void TextureCache<P>::RunGarbageCollector() {
image.DownloadMemory(map, copies);
runtime.Finish();
SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, map.mapped_span, swizzle_data_buffer);
+ ++gc_download_deletes;
}
if (True(image.flags & ImageFlagBits::Tracked)) {
UntrackImage(image, image_id);
@@ -269,8 +276,9 @@ void TextureCache<P>::TickFrame() {
if constexpr (requires { runtime.LogMemoryStatistics(); }) {
runtime.LogMemoryStatistics();
}
- LOG_INFO(HW_GPU, "Texture cache last 600 frames: created {} images, deleted {} (collector {}, {} costly), {} async decodes, ASTC {} opaque / {} alpha",
+ LOG_INFO(HW_GPU, "Texture cache last 600 frames: created {} images, deleted {} (collector {}, {} costly, {} downloaded), {} async decodes, ASTC {} opaque / {} alpha",
images_created, images_deleted, gc_deletes + gc_costly_deletes, gc_costly_deletes,
+ gc_download_deletes,
async_decodes_queued, astc_opaque_images, astc_alpha_images);
astc_opaque_images = astc_alpha_images = 0;
std::vector<std::pair<u32, u64>> shapes;
@@ -284,7 +292,7 @@ void TextureCache<P>::TickFrame() {
created_shapes[key].second);
}
created_shapes.clear();
- gc_deletes = gc_costly_deletes = async_decodes_queued = 0;
+ gc_deletes = gc_costly_deletes = gc_download_deletes = async_decodes_queued = 0;
images_created = images_deleted = 0;
}
if (total_used_memory > minimum_memory) {