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/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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user