diff options
| author | 2021-10-20 23:21:52 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:32 +0100 | |
| commit | bf01b7993dca835a516abdc2142be96bc0f216ec (patch) | |
| tree | 41d447cb6e586a4d071929540c84c2737e77fca8 /src | |
| parent | Vulkan: fix waiting on semaphore. (diff) | |
| download | yuzu-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.h | 38 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache_base.h | 2 |
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 | ||
| 811 | template <class P> | 813 | template <class P> |
| 812 | void TextureCache<P>::InvalidateScale(Image& image) { | 814 | void 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 | ||
| 843 | template <class P> | 848 | template <class P> |
| 844 | u64 TextureCache<P>::GetScaledImageSizeBytes(ImageBase& image) { | 849 | u64 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 | ||
| 853 | template <class P> | 861 | template <class P> |
| @@ -1510,7 +1518,7 @@ void TextureCache<P>::UntrackImage(ImageBase& image, ImageId image_id) { | |||
| 1510 | } | 1518 | } |
| 1511 | 1519 | ||
| 1512 | template <class P> | 1520 | template <class P> |
| 1513 | void TextureCache<P>::DeleteImage(ImageId image_id) { | 1521 | void 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); |