diff options
| author | MatÃas Locatti <42481638+goldenx86@users.noreply.github.com> | 2024-02-20 23:19:27 -0300 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-20 23:19:27 -0300 | 
| commit | e0c17a21138ba4379a5c77b40a7d3fd7414ca605 (patch) | |
| tree | 798f8678677cabd7c9048ed06022997a804a1aa5 | |
| parent | 4e1fcd4a63219ea2ce6dd962e0ee040b7d50e051 (diff) | |
| parent | 368bf2211fdc58014e479db84dab5a152ebbe459 (diff) | |
Merge pull request #10529 from liamwhite/critical-spacing
caches: make critical reclamation less eager and possible in more cases
| -rw-r--r-- | src/video_core/buffer_cache/buffer_cache.h | 2 | ||||
| -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 | 6 | 
4 files changed, 17 insertions, 7 deletions
diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 296c90e85..ed7a5b27e 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -35,7 +35,7 @@ BufferCache<P>::BufferCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, R      const s64 min_spacing_critical = device_local_memory - 512_MiB;      const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);      const s64 min_vacancy_expected = (6 * mem_threshold) / 10; -    const s64 min_vacancy_critical = (3 * mem_threshold) / 10; +    const s64 min_vacancy_critical = (2 * mem_threshold) / 10;      minimum_memory = static_cast<u64>(          std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),                   DEFAULT_EXPECTED_MEMORY)); 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 01c3561c9..53b4876f2 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -55,7 +55,7 @@ TextureCache<P>::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag          const s64 min_spacing_critical = device_local_memory - 512_MiB;          const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);          const s64 min_vacancy_expected = (6 * mem_threshold) / 10; -        const s64 min_vacancy_critical = (3 * mem_threshold) / 10; +        const s64 min_vacancy_critical = (2 * mem_threshold) / 10;          expected_memory = static_cast<u64>(              std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),                       DEFAULT_EXPECTED_MEMORY)); @@ -1979,7 +1979,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); @@ -2149,7 +2149,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;  | 
