summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar FernandoS272021-10-20 23:21:52 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:32 +0100
commitbf01b7993dca835a516abdc2142be96bc0f216ec (patch)
tree41d447cb6e586a4d071929540c84c2737e77fca8 /src
parentVulkan: fix waiting on semaphore. (diff)
downloadyuzu-bf01b7993dca835a516abdc2142be96bc0f216ec.tar.gz
yuzu-bf01b7993dca835a516abdc2142be96bc0f216ec.tar.xz
yuzu-bf01b7993dca835a516abdc2142be96bc0f216ec.zip
TextureCache: Improve Reaper.
Diffstat (limited to 'src')
-rw-r--r--src/video_core/texture_cache/texture_cache.h38
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h2
2 files changed, 26 insertions, 14 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index a32c11d04..f1254ef62 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -51,8 +51,8 @@ TextureCache<P>::TextureCache(Runtime& runtime_, VideoCore::RasterizerInterface&
51 51
52 if constexpr (HAS_DEVICE_MEMORY_INFO) { 52 if constexpr (HAS_DEVICE_MEMORY_INFO) {
53 const auto device_memory = runtime.GetDeviceLocalMemory(); 53 const auto device_memory = runtime.GetDeviceLocalMemory();
54 const u64 possible_expected_memory = (device_memory * 3) / 10; 54 const u64 possible_expected_memory = (device_memory * 4) / 10;
55 const u64 possible_critical_memory = (device_memory * 6) / 10; 55 const u64 possible_critical_memory = (device_memory * 7) / 10;
56 expected_memory = std::max(possible_expected_memory, DEFAULT_EXPECTED_MEMORY); 56 expected_memory = std::max(possible_expected_memory, DEFAULT_EXPECTED_MEMORY);
57 critical_memory = std::max(possible_critical_memory, DEFAULT_CRITICAL_MEMORY); 57 critical_memory = std::max(possible_critical_memory, DEFAULT_CRITICAL_MEMORY);
58 minimum_memory = 0; 58 minimum_memory = 0;
@@ -69,7 +69,7 @@ void TextureCache<P>::RunGarbageCollector() {
69 const bool high_priority_mode = total_used_memory >= expected_memory; 69 const bool high_priority_mode = total_used_memory >= expected_memory;
70 const bool aggressive_mode = total_used_memory >= critical_memory; 70 const bool aggressive_mode = total_used_memory >= critical_memory;
71 const u64 ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 100ULL; 71 const u64 ticks_to_destroy = aggressive_mode ? 10ULL : high_priority_mode ? 25ULL : 100ULL;
72 size_t num_iterations = aggressive_mode ? 10000 : (high_priority_mode ? 100 : 5); 72 size_t num_iterations = aggressive_mode ? 300 : (high_priority_mode ? 50 : 10);
73 const auto clean_up = [this, &num_iterations, high_priority_mode](ImageId image_id) { 73 const auto clean_up = [this, &num_iterations, high_priority_mode](ImageId image_id) {
74 if (num_iterations == 0) { 74 if (num_iterations == 0) {
75 return true; 75 return true;
@@ -91,7 +91,7 @@ void TextureCache<P>::RunGarbageCollector() {
91 UntrackImage(image, image_id); 91 UntrackImage(image, image_id);
92 } 92 }
93 UnregisterImage(image_id); 93 UnregisterImage(image_id);
94 DeleteImage(image_id); 94 DeleteImage(image_id, image.scale_tick > frame_tick + 5);
95 return false; 95 return false;
96 }; 96 };
97 lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, clean_up); 97 lru_cache.ForEachItemBelow(frame_tick - ticks_to_destroy, clean_up);
@@ -287,7 +287,9 @@ void TextureCache<P>::UpdateRenderTargets(bool is_clear) {
287 if (image_id != CORRUPT_ID) { 287 if (image_id != CORRUPT_ID) {
288 Image& image = slot_images[image_id]; 288 Image& image = slot_images[image_id];
289 image.scale_rating = scale_rating; 289 image.scale_rating = scale_rating;
290 image.scale_tick = frame_tick + 1; 290 if (image.scale_tick <= frame_tick) {
291 image.scale_tick = frame_tick + 1;
292 }
291 } 293 }
292 }; 294 };
293 for (size_t index = 0; index < NUM_RT; ++index) { 295 for (size_t index = 0; index < NUM_RT; ++index) {
@@ -810,6 +812,9 @@ bool TextureCache<P>::ImageCanRescale(ImageBase& image) {
810 812
811template <class P> 813template <class P>
812void TextureCache<P>::InvalidateScale(Image& image) { 814void TextureCache<P>::InvalidateScale(Image& image) {
815 if (image.scale_tick <= frame_tick) {
816 image.scale_tick = frame_tick + 1;
817 }
813 const std::span<const ImageViewId> image_view_ids = image.image_view_ids; 818 const std::span<const ImageViewId> image_view_ids = image.image_view_ids;
814 auto& dirty = maxwell3d.dirty.flags; 819 auto& dirty = maxwell3d.dirty.flags;
815 dirty[Dirty::RenderTargets] = true; 820 dirty[Dirty::RenderTargets] = true;
@@ -842,12 +847,15 @@ void TextureCache<P>::InvalidateScale(Image& image) {
842 847
843template <class P> 848template <class P>
844u64 TextureCache<P>::GetScaledImageSizeBytes(ImageBase& image) { 849u64 TextureCache<P>::GetScaledImageSizeBytes(ImageBase& image) {
845 const f32 add_to_size = Settings::values.resolution_info.up_factor; 850 const u64 scale_up = static_cast<u64>(Settings::values.resolution_info.up_scale *
846 const bool sign = std::signbit(add_to_size); 851 Settings::values.resolution_info.up_scale);
847 const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); 852 const u64 down_shift = static_cast<u64>(Settings::values.resolution_info.down_shift +
848 const u64 tentative_size = image_size_bytes * static_cast<u64>(std::abs(add_to_size)); 853 Settings::values.resolution_info.down_shift);
854 const u64 image_size_bytes =
855 static_cast<u64>(std::max(image.guest_size_bytes, image.unswizzled_size_bytes));
856 const u64 tentative_size = (image_size_bytes * scale_up) >> down_shift;
849 const u64 fitted_size = Common::AlignUp(tentative_size, 1024); 857 const u64 fitted_size = Common::AlignUp(tentative_size, 1024);
850 return sign ? -fitted_size : fitted_size; 858 return fitted_size;
851} 859}
852 860
853template <class P> 861template <class P>
@@ -1510,7 +1518,7 @@ void TextureCache<P>::UntrackImage(ImageBase& image, ImageId image_id) {
1510} 1518}
1511 1519
1512template <class P> 1520template <class P>
1513void TextureCache<P>::DeleteImage(ImageId image_id) { 1521void TextureCache<P>::DeleteImage(ImageId image_id, bool immediate_delete) {
1514 ImageBase& image = slot_images[image_id]; 1522 ImageBase& image = slot_images[image_id];
1515 if (image.HasScaled()) { 1523 if (image.HasScaled()) {
1516 total_used_memory -= GetScaledImageSizeBytes(image); 1524 total_used_memory -= GetScaledImageSizeBytes(image);
@@ -1576,10 +1584,14 @@ void TextureCache<P>::DeleteImage(ImageId image_id) {
1576 num_removed_overlaps); 1584 num_removed_overlaps);
1577 } 1585 }
1578 for (const ImageViewId image_view_id : image_view_ids) { 1586 for (const ImageViewId image_view_id : image_view_ids) {
1579 sentenced_image_view.Push(std::move(slot_image_views[image_view_id])); 1587 if (!immediate_delete) {
1588 sentenced_image_view.Push(std::move(slot_image_views[image_view_id]));
1589 }
1580 slot_image_views.erase(image_view_id); 1590 slot_image_views.erase(image_view_id);
1581 } 1591 }
1582 sentenced_images.Push(std::move(slot_images[image_id])); 1592 if (!immediate_delete) {
1593 sentenced_images.Push(std::move(slot_images[image_id]));
1594 }
1583 slot_images.erase(image_id); 1595 slot_images.erase(image_id);
1584 1596
1585 alloc_images.erase(alloc_image_it); 1597 alloc_images.erase(alloc_image_it);
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h
index 4f876b2f4..eea589269 100644
--- a/src/video_core/texture_cache/texture_cache_base.h
+++ b/src/video_core/texture_cache/texture_cache_base.h
@@ -292,7 +292,7 @@ private:
292 void UntrackImage(ImageBase& image, ImageId image_id); 292 void UntrackImage(ImageBase& image, ImageId image_id);
293 293
294 /// Delete image from the cache 294 /// Delete image from the cache
295 void DeleteImage(ImageId image); 295 void DeleteImage(ImageId image, bool immediate_delete = false);
296 296
297 /// Remove image views references from the cache 297 /// Remove image views references from the cache
298 void RemoveImageViewReferences(std::span<const ImageViewId> removed_views); 298 void RemoveImageViewReferences(std::span<const ImageViewId> removed_views);