summaryrefslogtreecommitdiff
path: root/src/video_core/texture_cache
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-10-18 22:56:36 +0200
committerGravatar Fernando Sahmkow2021-11-16 22:11:31 +0100
commit3b61de74e6dc7526ffa8f03c21d81e2c3566ce90 (patch)
tree4f97e24ed00d7e46564e6aa8ecd3c05d6f6525ff /src/video_core/texture_cache
parentTexture Cache: ease the requirements of textures being blacklisted. (diff)
downloadyuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.gz
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.tar.xz
yuzu-3b61de74e6dc7526ffa8f03c21d81e2c3566ce90.zip
Texture Cache: fix memory managment and optimize scaled downloads, uploads.
Diffstat (limited to 'src/video_core/texture_cache')
-rw-r--r--src/video_core/texture_cache/image_base.cpp2
-rw-r--r--src/video_core/texture_cache/image_base.h6
-rw-r--r--src/video_core/texture_cache/texture_cache.h22
3 files changed, 15 insertions, 15 deletions
diff --git a/src/video_core/texture_cache/image_base.cpp b/src/video_core/texture_cache/image_base.cpp
index 3db2ec825..3db2fdf34 100644
--- a/src/video_core/texture_cache/image_base.cpp
+++ b/src/video_core/texture_cache/image_base.cpp
@@ -61,7 +61,7 @@ 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{}, scale_tick{}, 63 converted_size_bytes{CalculateConvertedSizeBytes(info)}, scale_rating{}, scale_tick{},
64 scale_count{}, gpu_addr{gpu_addr_}, cpu_addr{cpu_addr_}, 64 has_scaled{}, 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 cd4b5f636..02c669766 100644
--- a/src/video_core/texture_cache/image_base.h
+++ b/src/video_core/texture_cache/image_base.h
@@ -77,8 +77,8 @@ struct ImageBase {
77 void CheckBadOverlapState(); 77 void CheckBadOverlapState();
78 void CheckAliasState(); 78 void CheckAliasState();
79 79
80 bool HasScaled() { 80 bool HasScaled() const {
81 return scale_count > 0; 81 return has_scaled;
82 } 82 }
83 83
84 ImageInfo info; 84 ImageInfo info;
@@ -88,7 +88,7 @@ struct ImageBase {
88 u32 converted_size_bytes = 0; 88 u32 converted_size_bytes = 0;
89 u32 scale_rating = 0; 89 u32 scale_rating = 0;
90 u64 scale_tick = 0; 90 u64 scale_tick = 0;
91 u32 scale_count = 0; 91 bool has_scaled = false;
92 ImageFlagBits flags = ImageFlagBits::CpuModified; 92 ImageFlagBits flags = ImageFlagBits::CpuModified;
93 93
94 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 c885586e8..13914dc8b 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -60,7 +60,7 @@ TextureCache<P>::TextureCache(Runtime& runtime_, VideoCore::RasterizerInterface&
60 // On OpenGL we can be more conservatives as the driver takes care. 60 // On OpenGL we can be more conservatives as the driver takes care.
61 expected_memory = DEFAULT_EXPECTED_MEMORY + 512_MiB; 61 expected_memory = DEFAULT_EXPECTED_MEMORY + 512_MiB;
62 critical_memory = DEFAULT_CRITICAL_MEMORY + 1_GiB; 62 critical_memory = DEFAULT_CRITICAL_MEMORY + 1_GiB;
63 minimum_memory = expected_memory; 63 minimum_memory = 0;
64 } 64 }
65} 65}
66 66
@@ -1464,16 +1464,6 @@ template <class P>
1464void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) { 1464void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) {
1465 ASSERT(False(image.flags & ImageFlagBits::Tracked)); 1465 ASSERT(False(image.flags & ImageFlagBits::Tracked));
1466 image.flags |= ImageFlagBits::Tracked; 1466 image.flags |= ImageFlagBits::Tracked;
1467 if (image.HasScaled()) {
1468 total_used_memory -= GetScaledImageSizeBytes(image);
1469 }
1470 u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes);
1471 if ((IsPixelFormatASTC(image.info.format) &&
1472 True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
1473 True(image.flags & ImageFlagBits::Converted)) {
1474 tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format);
1475 }
1476 total_used_memory -= Common::AlignUp(tentative_size, 1024);
1477 if (False(image.flags & ImageFlagBits::Sparse)) { 1467 if (False(image.flags & ImageFlagBits::Sparse)) {
1478 rasterizer.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1); 1468 rasterizer.UpdatePagesCachedCount(image.cpu_addr, image.guest_size_bytes, 1);
1479 return; 1469 return;
@@ -1519,6 +1509,16 @@ void TextureCache<P>::UntrackImage(ImageBase& image, ImageId image_id) {
1519template <class P> 1509template <class P>
1520void TextureCache<P>::DeleteImage(ImageId image_id) { 1510void TextureCache<P>::DeleteImage(ImageId image_id) {
1521 ImageBase& image = slot_images[image_id]; 1511 ImageBase& image = slot_images[image_id];
1512 if (image.HasScaled()) {
1513 total_used_memory -= GetScaledImageSizeBytes(image);
1514 }
1515 u64 tentative_size = std::max(image.guest_size_bytes, image.unswizzled_size_bytes);
1516 if ((IsPixelFormatASTC(image.info.format) &&
1517 True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
1518 True(image.flags & ImageFlagBits::Converted)) {
1519 tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format);
1520 }
1521 total_used_memory -= Common::AlignUp(tentative_size, 1024);
1522 const GPUVAddr gpu_addr = image.gpu_addr; 1522 const GPUVAddr gpu_addr = image.gpu_addr;
1523 const auto alloc_it = image_allocs_table.find(gpu_addr); 1523 const auto alloc_it = image_allocs_table.find(gpu_addr);
1524 if (alloc_it == image_allocs_table.end()) { 1524 if (alloc_it == image_allocs_table.end()) {