mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	Merge pull request #10529 from liamwhite/critical-spacing
caches: make critical reclamation less eager and possible in more cases
This commit is contained in:
		@@ -35,7 +35,7 @@ BufferCache<P>::BufferCache(Tegra::MaxwellDeviceMemoryManager& device_memory_, R
 | 
				
			|||||||
    const s64 min_spacing_critical = device_local_memory - 512_MiB;
 | 
					    const s64 min_spacing_critical = device_local_memory - 512_MiB;
 | 
				
			||||||
    const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);
 | 
					    const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);
 | 
				
			||||||
    const s64 min_vacancy_expected = (6 * mem_threshold) / 10;
 | 
					    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>(
 | 
					    minimum_memory = static_cast<u64>(
 | 
				
			||||||
        std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),
 | 
					        std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),
 | 
				
			||||||
                 DEFAULT_EXPECTED_MEMORY));
 | 
					                 DEFAULT_EXPECTED_MEMORY));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,7 @@ TextureCache<P>::TextureCache(Runtime& runtime_, Tegra::MaxwellDeviceMemoryManag
 | 
				
			|||||||
        const s64 min_spacing_critical = device_local_memory - 512_MiB;
 | 
					        const s64 min_spacing_critical = device_local_memory - 512_MiB;
 | 
				
			||||||
        const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);
 | 
					        const s64 mem_threshold = std::min(device_local_memory, TARGET_THRESHOLD);
 | 
				
			||||||
        const s64 min_vacancy_expected = (6 * mem_threshold) / 10;
 | 
					        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>(
 | 
					        expected_memory = static_cast<u64>(
 | 
				
			||||||
            std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),
 | 
					            std::max(std::min(device_local_memory - min_vacancy_expected, min_spacing_expected),
 | 
				
			||||||
                     DEFAULT_EXPECTED_MEMORY));
 | 
					                     DEFAULT_EXPECTED_MEMORY));
 | 
				
			||||||
@@ -1979,7 +1979,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);
 | 
				
			||||||
@@ -2149,7 +2149,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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user