summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-10-17 18:01:18 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commit425ab9ef4b982213f4ee0d53196f5474e255374f (patch)
tree467bc959ea481d58514d11ca73e8f31b3557d4aa /src/video_core/texture_cache
parentPresentation: add Nearest Neighbor filter. (diff)
downloadyuzu-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.cpp4
-rw-r--r--src/video_core/texture_cache/image_base.h5
-rw-r--r--src/video_core/texture_cache/texture_cache.h31
-rw-r--r--src/video_core/texture_cache/texture_cache_base.h2
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 {
60ImageBase::ImageBase(const ImageInfo& info_, GPUVAddr gpu_addr_, VAddr cpu_addr_) 60ImageBase::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
856template <class P> 856template <class P>
857u64 TextureCache<P>::GetScaledImageSizeBytes(Image& image) { 857u64 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
866template <class P> 866template <class P>
867bool TextureCache<P>::ScaleUp(Image& image) { 867bool 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>
1478void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) { 1477void 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;