GLCache: Align compressed texture sizes to their compression ratio, and then align that compressed size to the block height for tiled textures.

This fixes issues with retrieving non-block-aligned tiled compressed textures from the cache.
This commit is contained in:
Subv 2018-06-08 12:27:19 -05:00
parent 5aff2d38a9
commit 8d9534d830

View File

@ -1033,8 +1033,11 @@ Surface RasterizerCacheOpenGL::GetTextureSurface(const Tegra::Texture::FullTextu
params.addr = config.tic.Address(); params.addr = config.tic.Address();
params.is_tiled = config.tic.IsTiled(); params.is_tiled = config.tic.IsTiled();
params.pixel_format = SurfaceParams::PixelFormatFromTextureFormat(config.tic.format); params.pixel_format = SurfaceParams::PixelFormatFromTextureFormat(config.tic.format);
params.width = config.tic.Width() / params.GetCompresssionFactor();
params.height = config.tic.Height() / params.GetCompresssionFactor(); params.width = Common::AlignUp(config.tic.Width(), params.GetCompresssionFactor()) /
params.GetCompresssionFactor();
params.height = Common::AlignUp(config.tic.Height(), params.GetCompresssionFactor()) /
params.GetCompresssionFactor();
// TODO(Subv): Different types per component are not supported. // TODO(Subv): Different types per component are not supported.
ASSERT(config.tic.r_type.Value() == config.tic.g_type.Value() && ASSERT(config.tic.r_type.Value() == config.tic.g_type.Value() &&
@ -1045,6 +1048,8 @@ Surface RasterizerCacheOpenGL::GetTextureSurface(const Tegra::Texture::FullTextu
if (config.tic.IsTiled()) { if (config.tic.IsTiled()) {
params.block_height = config.tic.BlockHeight(); params.block_height = config.tic.BlockHeight();
params.width = Common::AlignUp(params.width, params.block_height);
params.height = Common::AlignUp(params.height, params.block_height);
} else { } else {
// Use the texture-provided stride value if the texture isn't tiled. // Use the texture-provided stride value if the texture isn't tiled.
params.stride = static_cast<u32>(params.PixelsInBytes(config.tic.Pitch())); params.stride = static_cast<u32>(params.PixelsInBytes(config.tic.Pitch()));