tile: Fix some tile thickness calculation errors. (#2203)

* tile: Fix some tile thickness calculation errors.

* tile: Do not pad mip height to tile height.
This commit is contained in:
squidbus 2025-01-22 00:40:00 -08:00 committed by GitHub
parent 5c62a00134
commit 2a4798cfa6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 8 additions and 9 deletions

View file

@ -178,7 +178,6 @@ void ImageInfo::UpdateSize() {
case AmdGpu::TilingMode::Display_Linear: {
std::tie(mip_info.pitch, mip_info.size) =
ImageSizeLinearAligned(mip_w, mip_h, bpp, num_samples);
mip_info.height = mip_h;
break;
}
case AmdGpu::TilingMode::Texture_Volume:
@ -188,12 +187,7 @@ void ImageInfo::UpdateSize() {
case AmdGpu::TilingMode::Display_MicroTiled:
case AmdGpu::TilingMode::Texture_MicroTiled: {
std::tie(mip_info.pitch, mip_info.size) =
ImageSizeMicroTiled(mip_w, mip_h, bpp, thickness, num_samples);
mip_info.height = std::max(mip_h, 8u);
if (props.is_block) {
mip_info.pitch = std::max(mip_info.pitch * 4, 32u);
mip_info.height = std::max(mip_info.height * 4, 32u);
}
ImageSizeMicroTiled(mip_w, mip_h, thickness, bpp, num_samples);
break;
}
case AmdGpu::TilingMode::Display_MacroTiled:
@ -208,6 +202,11 @@ void ImageInfo::UpdateSize() {
UNREACHABLE();
}
}
mip_info.height = mip_h;
if (props.is_block) {
mip_info.pitch = std::max(mip_info.pitch * 4, 32u);
mip_info.height = std::max(mip_info.height * 4, 32u);
}
mip_info.size *= mip_d;
mip_info.offset = guest_size;
mips_layout.emplace_back(mip_info);

View file

@ -313,8 +313,8 @@ constexpr std::pair<u32, size_t> ImageSizeMicroTiled(u32 pitch, u32 height, u32
const auto& [pitch_align, height_align] = micro_tile_extent;
auto pitch_aligned = (pitch + pitch_align - 1) & ~(pitch_align - 1);
const auto height_aligned = (height + height_align - 1) & ~(height_align - 1);
size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples * thickness + 7) / 8;
while (log_sz % 256) {
size_t log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8;
while ((log_sz * thickness) % 256) {
pitch_aligned += pitch_align;
log_sz = (pitch_aligned * height_aligned * bpp * num_samples + 7) / 8;
}