Просмотр исходного кода

texture_cache: avoid overestimation of ASTC texture sizes

Liam 3 лет назад
Родитель
Сommit
de8a623932
3 измененных файлов с 15 добавлено и 5 удалено
  1. 12 2
      src/video_core/surface.cpp
  2. 1 1
      src/video_core/surface.h
  3. 2 2
      src/video_core/texture_cache/texture_cache.h

+ 12 - 2
src/video_core/surface.cpp

@@ -3,6 +3,7 @@
 
 
 #include "common/common_types.h"
 #include "common/common_types.h"
 #include "common/math_util.h"
 #include "common/math_util.h"
+#include "common/settings.h"
 #include "video_core/surface.h"
 #include "video_core/surface.h"
 
 
 namespace VideoCore::Surface {
 namespace VideoCore::Surface {
@@ -400,11 +401,20 @@ std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) {
     return {DefaultBlockWidth(format), DefaultBlockHeight(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;
     constexpr u64 RGBA8_PIXEL_SIZE = 4;
     const u64 base_block_size = static_cast<u64>(DefaultBlockWidth(format)) *
     const u64 base_block_size = static_cast<u64>(DefaultBlockWidth(format)) *
                                 static_cast<u64>(DefaultBlockHeight(format)) * RGBA8_PIXEL_SIZE;
                                 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
 } // namespace VideoCore::Surface

+ 1 - 1
src/video_core/surface.h

@@ -517,6 +517,6 @@ size_t PixelComponentSizeBitsInteger(PixelFormat format);
 
 
 std::pair<u32, u32> GetASTCBlockSize(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
 } // namespace VideoCore::Surface

+ 2 - 2
src/video_core/texture_cache/texture_cache.h

@@ -1972,7 +1972,7 @@ void TextureCache<P>::RegisterImage(ImageId image_id) {
     if ((IsPixelFormatASTC(image.info.format) &&
     if ((IsPixelFormatASTC(image.info.format) &&
          True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
          True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
         True(image.flags & ImageFlagBits::Converted)) {
         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);
     total_used_memory += Common::AlignUp(tentative_size, 1024);
     image.lru_index = lru_cache.Insert(image_id, frame_tick);
     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) &&
     if ((IsPixelFormatASTC(image.info.format) &&
          True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
          True(image.flags & ImageFlagBits::AcceleratedUpload)) ||
         True(image.flags & ImageFlagBits::Converted)) {
         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);
     total_used_memory -= Common::AlignUp(tentative_size, 1024);
     const GPUVAddr gpu_addr = image.gpu_addr;
     const GPUVAddr gpu_addr = image.gpu_addr;