diff options
author | Liam <byteslice@airmail.cc> | 2023-05-31 18:42:34 +0200 |
---|---|---|
committer | Liam <byteslice@airmail.cc> | 2024-02-11 19:41:13 +0100 |
commit | de8a62393249e944f68eb3e73330537af02a6b0b (patch) | |
tree | 7642555fbfb8370edb74496e819e3bbfbce45031 | |
parent | caches: make critical reclamation less eager and possible in more cases (diff) | |
download | yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar.gz yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar.bz2 yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar.lz yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar.xz yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.tar.zst yuzu-de8a62393249e944f68eb3e73330537af02a6b0b.zip |
-rw-r--r-- | src/video_core/surface.cpp | 14 | ||||
-rw-r--r-- | src/video_core/surface.h | 2 | ||||
-rw-r--r-- | src/video_core/texture_cache/texture_cache.h | 4 |
3 files changed, 15 insertions, 5 deletions
diff --git a/src/video_core/surface.cpp b/src/video_core/surface.cpp index 5b3c7aa5a..9055b1b92 100644 --- a/src/video_core/surface.cpp +++ b/src/video_core/surface.cpp @@ -3,6 +3,7 @@ #include "common/common_types.h" #include "common/math_util.h" +#include "common/settings.h" #include "video_core/surface.h" namespace VideoCore::Surface { @@ -400,11 +401,20 @@ std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) { return {DefaultBlockWidth(format), DefaultBlockHeight(format)}; } -u64 EstimatedDecompressedSize(u64 base_size, PixelFormat format) { +u64 TranscodedAstcSize(u64 base_size, PixelFormat format) { constexpr u64 RGBA8_PIXEL_SIZE = 4; const u64 base_block_size = static_cast<u64>(DefaultBlockWidth(format)) * static_cast<u64>(DefaultBlockHeight(format)) * RGBA8_PIXEL_SIZE; - return (base_size * base_block_size) / BytesPerBlock(format); + const u64 uncompressed_size = (base_size * base_block_size) / BytesPerBlock(format); + + switch (Settings::values.astc_recompression.GetValue()) { + case Settings::AstcRecompression::Bc1: + return uncompressed_size / 8; + case Settings::AstcRecompression::Bc3: + return uncompressed_size / 4; + default: + return uncompressed_size; + } } } // namespace VideoCore::Surface diff --git a/src/video_core/surface.h b/src/video_core/surface.h index a5e8e2f62..ec9cd2fbf 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h @@ -517,6 +517,6 @@ size_t PixelComponentSizeBitsInteger(PixelFormat format); std::pair<u32, u32> GetASTCBlockSize(PixelFormat format); -u64 EstimatedDecompressedSize(u64 base_size, PixelFormat format); +u64 TranscodedAstcSize(u64 base_size, PixelFormat format); } // namespace VideoCore::Surface diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index 3faff0c2f..5986a7680 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -1972,7 +1972,7 @@ void TextureCache<P>::RegisterImage(ImageId image_id) { if ((IsPixelFormatASTC(image.info.format) && True(image.flags & ImageFlagBits::AcceleratedUpload)) || True(image.flags & ImageFlagBits::Converted)) { - tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format); + tentative_size = TranscodedAstcSize(tentative_size, image.info.format); } total_used_memory += Common::AlignUp(tentative_size, 1024); image.lru_index = lru_cache.Insert(image_id, frame_tick); @@ -2142,7 +2142,7 @@ void TextureCache<P>::DeleteImage(ImageId image_id, bool immediate_delete) { if ((IsPixelFormatASTC(image.info.format) && True(image.flags & ImageFlagBits::AcceleratedUpload)) || True(image.flags & ImageFlagBits::Converted)) { - tentative_size = EstimatedDecompressedSize(tentative_size, image.info.format); + tentative_size = TranscodedAstcSize(tentative_size, image.info.format); } total_used_memory -= Common::AlignUp(tentative_size, 1024); const GPUVAddr gpu_addr = image.gpu_addr; |