mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01:00 
			
		
		
		
	texture_cache: avoid overestimation of ASTC texture sizes
This commit is contained in:
		
							parent
							
								
									865a0186b6
								
							
						
					
					
						commit
						de8a623932
					
				| @ -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
 | ||||
|  | ||||
| @ -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
 | ||||
|  | ||||
| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user