diff options
| author | 2021-10-18 22:56:36 +0200 | |
|---|---|---|
| committer | 2021-11-16 22:11:31 +0100 | |
| commit | 3b61de74e6dc7526ffa8f03c21d81e2c3566ce90 (patch) | |
| tree | 4f97e24ed00d7e46564e6aa8ecd3c05d6f6525ff /src/video_core/texture_cache | |
| parent | Texture Cache: ease the requirements of textures being blacklisted. (diff) | |
| download | yuzu-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.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/texture_cache/image_base.h | 6 | ||||
| -rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 22 |
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> | |||
| 1464 | void TextureCache<P>::TrackImage(ImageBase& image, ImageId image_id) { | 1464 | void 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) { | |||
| 1519 | template <class P> | 1509 | template <class P> |
| 1520 | void TextureCache<P>::DeleteImage(ImageId image_id) { | 1510 | void 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()) { |