diff options
| author | 2021-10-17 18:01:18 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | 425ab9ef4b982213f4ee0d53196f5474e255374f (patch) | |
| tree | 467bc959ea481d58514d11ca73e8f31b3557d4aa /src/video_core/texture_cache | |
| parent | Presentation: add Nearest Neighbor filter. (diff) | |
| download | yuzu-425ab9ef4b982213f4ee0d53196f5474e255374f.tar.gz yuzu-425ab9ef4b982213f4ee0d53196f5474e255374f.tar.xz yuzu-425ab9ef4b982213f4ee0d53196f5474e255374f.zip | |
Texture Cache: Fix downscaling and correct memory comsumption.
Diffstat (limited to 'src/video_core/texture_cache')
| -rw-r--r-- | src/video_core/texture_cache/image_base.cpp | 4 | ||||
| -rw-r--r-- | src/video_core/texture_cache/image_base.h | 5 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 31 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache_base.h | 2 |
4 files changed, 28 insertions, 14 deletions
diff --git a/src/video_core/texture_cache/image_base.cpp b/src/video_core/texture_cache/image_base.cpp index 1909c9ecb..3db2ec825 100644 --- a/src/video_core/texture_cache/image_base.cpp +++ b/src/video_core/texture_cache/image_base.cpp | |||
| @@ -60,8 +60,8 @@ namespace { | |||
| 60 | ImageBase::ImageBase(const ImageInfo& info_, GPUVAddr gpu_addr_, VAddr cpu_addr_) | 60 | ImageBase::ImageBase(const ImageInfo& info_, GPUVAddr gpu_addr_, VAddr cpu_addr_) |
| 61 | : info{info_}, guest_size_bytes{CalculateGuestSizeInBytes(info)}, | 61 | : info{info_}, guest_size_bytes{CalculateGuestSizeInBytes(info)}, |
| 62 | unswizzled_size_bytes{CalculateUnswizzledSizeBytes(info)}, | 62 | unswizzled_size_bytes{CalculateUnswizzledSizeBytes(info)}, |
| 63 | converted_size_bytes{CalculateConvertedSizeBytes(info)}, scale_rating{}, | 63 | converted_size_bytes{CalculateConvertedSizeBytes(info)}, scale_rating{}, scale_tick{}, |
| 64 | scale_tick{}, gpu_addr{gpu_addr_}, cpu_addr{cpu_addr_}, | 64 | scale_count{}, gpu_addr{gpu_addr_}, cpu_addr{cpu_addr_}, |
| 65 | cpu_addr_end{cpu_addr + guest_size_bytes}, mip_level_offsets{CalculateMipLevelOffsets(info)} { | 65 | cpu_addr_end{cpu_addr + guest_size_bytes}, mip_level_offsets{CalculateMipLevelOffsets(info)} { |
| 66 | if (info.type == ImageType::e3D) { | 66 | if (info.type == ImageType::e3D) { |
| 67 | slice_offsets = CalculateSliceOffsets(info); | 67 | slice_offsets = CalculateSliceOffsets(info); |
diff --git a/src/video_core/texture_cache/image_base.h b/src/video_core/texture_cache/image_base.h index bab290ac7..cd4b5f636 100644 --- a/src/video_core/texture_cache/image_base.h +++ b/src/video_core/texture_cache/image_base.h | |||
| @@ -77,6 +77,10 @@ struct ImageBase { | |||
| 77 | void CheckBadOverlapState(); | 77 | void CheckBadOverlapState(); |
| 78 | void CheckAliasState(); | 78 | void CheckAliasState(); |
| 79 | 79 | ||
| 80 | bool HasScaled() { | ||
| 81 | return scale_count > 0; | ||
| 82 | } | ||
| 83 | |||
| 80 | ImageInfo info; | 84 | ImageInfo info; |
| 81 | 85 | ||
| 82 | u32 guest_size_bytes = 0; | 86 | u32 guest_size_bytes = 0; |
| @@ -84,6 +88,7 @@ struct ImageBase { | |||
| 84 | u32 converted_size_bytes = 0; | 88 | u32 converted_size_bytes = 0; |
| 85 | u32 scale_rating = 0; | 89 | u32 scale_rating = 0; |
| 86 | u64 scale_tick = 0; | 90 | u64 scale_tick = 0; |
| 91 | u32 scale_count = 0; | ||
| 87 | ImageFlagBits flags = ImageFlagBits::CpuModified; | 92 | ImageFlagBits flags = ImageFlagBits::CpuModified; |
| 88 | 93 | ||
| 89 | GPUVAddr gpu_addr = 0; | 94 | GPUVAddr gpu_addr = 0; |
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index a035d2b18..cf0d33a45 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h | |||
| @@ -854,8 +854,8 @@ void TextureCache<P>::InvalidateScale(Image& image) { | |||
| 854 | } | 854 | } |
| 855 | 855 | ||
| 856 | template <class P> | 856 | template <class P> |
| 857 | u64 TextureCache<P>::GetScaledImageSizeBytes(Image& image) { | 857 | u64 TextureCache<P>::GetScaledImageSizeBytes(ImageBase& image) { |
| 858 | const f32 add_to_size = Settings::values.resolution_info.up_factor - 1.0f; | 858 | const f32 add_to_size = Settings::values.resolution_info.up_factor; |
| 859 | const bool sign = std::signbit(add_to_size); | 859 | const bool sign = std::signbit(add_to_size); |
| 860 | const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); | 860 | const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); |
| 861 | const u64 tentative_size = image_size_bytes * static_cast<u64>(std::abs(add_to_size)); | 861 | const u64 tentative_size = image_size_bytes * static_cast<u64>(std::abs(add_to_size)); |
| @@ -865,11 +865,14 @@ u64 TextureCache<P>::GetScaledImageSizeBytes(Image& image) { | |||
| 865 | 865 | ||
| 866 | template <class P> | 866 | template <class P> |
| 867 | bool TextureCache<P>::ScaleUp(Image& image) { | 867 | bool TextureCache<P>::ScaleUp(Image& image) { |
| 868 | const bool has_copy = image.HasScaled(); | ||
| 868 | const bool rescaled = image.ScaleUp(); | 869 | const bool rescaled = image.ScaleUp(); |
| 869 | if (!rescaled) { | 870 | if (!rescaled) { |
| 870 | return false; | 871 | return false; |
| 871 | } | 872 | } |
| 872 | total_used_memory += GetScaledImageSizeBytes(image); | 873 | if (!has_copy) { |
| 874 | total_used_memory += GetScaledImageSizeBytes(image); | ||
| 875 | } | ||
| 873 | InvalidateScale(image); | 876 | InvalidateScale(image); |
| 874 | return true; | 877 | return true; |
| 875 | } | 878 | } |
| @@ -880,7 +883,10 @@ bool TextureCache<P>::ScaleDown(Image& image) { | |||
| 880 | if (!rescaled) { | 883 | if (!rescaled) { |
| 881 | return false; | 884 | return false; |
| 882 | } | 885 | } |
| 883 | total_used_memory -= GetScaledImageSizeBytes(image); | 886 | const bool has_copy = image.HasScaled(); |
| 887 | if (!has_copy) { | ||
| 888 | total_used_memory -= GetScaledImageSizeBytes(image); | ||
| 889 | } | ||
| 884 | InvalidateScale(image); | 890 | InvalidateScale(image); |
| 885 | return true; | 891 | return true; |
| 886 | } | 892 | } |
| @@ -1391,13 +1397,6 @@ void TextureCache<P>::UnregisterImage(ImageId image_id) { | |||
| 1391 | "Trying to unregister an already registered image"); | 1397 | "Trying to unregister an already registered image"); |
| 1392 | image.flags &= ~ImageFlagBits::Registered; | 1398 | image.flags &= ~ImageFlagBits::Registered; |
| 1393 | image.flags &= ~ImageFlagBits::BadOverlap; | 1399 | image.flags &= ~ImageFlagBits::BadOverlap; |
| 1394 | u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); | ||
| 1395 | if ((IsPixelFormatASTC(image.info.format) && | ||
| 1396 | True(image.flags & ImageFlagBits::AcceleratedUpload)) || | ||
| 1397 | True(image.flags & ImageFlagBits::Converted)) { | ||
| 1398 | tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format); | ||
| 1399 | } | ||
| 1400 | total_used_memory -= Common::AlignUp(tentative_size, 1024); | ||
| 1401 | lru_cache.Free(image.lru_index); | 1400 | lru_cache.Free(image.lru_index); |
| 1402 | const auto& clear_page_table = | 1401 | const auto& clear_page_table = |
| 1403 | [this, image_id]( | 1402 | [this, image_id]( |
| @@ -1478,6 +1477,16 @@ template <class P> | |||
| 1478 | void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) { | 1477 | void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) { |
| 1479 | ASSERT(False(image.flags & ImageFlagBits::Tracked)); | 1478 | ASSERT(False(image.flags & ImageFlagBits::Tracked)); |
| 1480 | image.flags |= ImageFlagBits::Tracked; | 1479 | image.flags |= ImageFlagBits::Tracked; |
| 1480 | if (image.HasScaled()) { | ||
| 1481 | total_used_memory -= GetScaledImageSizeBytes(image); | ||
| 1482 | } | ||
| 1483 | u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes); | ||
| 1484 | if ((IsPixelFormatASTC(image.info.format) && | ||
| 1485 | True(image.flags & ImageFlagBits::AcceleratedUpload)) || | ||
| 1486 | True(image.flags & ImageFlagBits::Converted)) { | ||
| 1487 | tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format); | ||
| 1488 | } | ||
| 1489 | total_used_memory -= Common::AlignUp(tentative_size, 1024); | ||
| 1481 | if (False(image.flags & ImageFlagBits::Sparse)) { | 1490 | if (False(image.flags & ImageFlagBits::Sparse)) { |
| 1482 | rasterizer.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1); | 1491 | rasterizer.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1); |
| 1483 | return; | 1492 | return; |
diff --git a/src/video_core/texture_cache/texture_cache_base.h b/src/video_core/texture_cache/texture_cache_base.h index 4dbe050af..e210393ba 100644 --- a/src/video_core/texture_cache/texture_cache_base.h +++ b/src/video_core/texture_cache/texture_cache_base.h | |||
| @@ -331,7 +331,7 @@ private: | |||
| 331 | void InvalidateScale(Image& image); | 331 | void InvalidateScale(Image& image); |
| 332 | bool ScaleUp(Image& image); | 332 | bool ScaleUp(Image& image); |
| 333 | bool ScaleDown(Image& image); | 333 | bool ScaleDown(Image& image); |
| 334 | u64 GetScaledImageSizeBytes(Image& image); | 334 | u64 GetScaledImageSizeBytes(ImageBase& image); |
| 335 | 335 | ||
| 336 | Runtime& runtime; | 336 | Runtime& runtime; |
| 337 | VideoCore::RasterizerInterface& rasterizer; | 337 | VideoCore::RasterizerInterface& rasterizer; |