image_info: Fix guest size calculation for linear render targets (#3700)

This commit is contained in:
TheTurtle
2025-10-04 23:09:40 +03:00
committed by GitHub
parent 81098da509
commit 08878385e1
2 changed files with 21 additions and 7 deletions

View File

@@ -72,9 +72,15 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer,
meta_info.fmask_addr = buffer.info.compression ? buffer.FmaskAddress() : 0;
guest_address = buffer.Address();
const auto color_slice_sz = buffer.GetColorSliceSize();
guest_size = color_slice_sz * buffer.NumSlices();
mips_layout.emplace_back(guest_size, pitch, buffer.Height(), 0);
if (props.is_tiled) {
guest_size = buffer.GetColorSliceSize() * resources.layers;
mips_layout.emplace_back(guest_size, pitch, buffer.Height(), 0);
} else {
std::tie(std::ignore, std::ignore, guest_size) =
ImageSizeLinearAligned(pitch, size.height, num_bits, num_samples);
guest_size *= resources.layers;
mips_layout.emplace_back(guest_size, pitch, size.height, 0);
}
alt_tile = Libraries::Kernel::sceKernelIsNeoMode() && buffer.info.alt_tile_mode;
}
@@ -102,9 +108,15 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, u32 num_slice
stencil_size = pitch * size.height * sizeof(u8);
guest_address = write_buffer ? buffer.DepthWriteAddress() : buffer.DepthAddress();
const auto depth_slice_sz = buffer.GetDepthSliceSize();
guest_size = depth_slice_sz * num_slices;
mips_layout.emplace_back(guest_size, pitch, buffer.Height(), 0);
if (props.is_tiled) {
guest_size = buffer.GetDepthSliceSize() * resources.layers;
mips_layout.emplace_back(guest_size, pitch, buffer.Height(), 0);
} else {
std::tie(std::ignore, std::ignore, guest_size) =
ImageSizeLinearAligned(pitch, size.height, num_bits, num_samples);
guest_size *= resources.layers;
mips_layout.emplace_back(guest_size, pitch, size.height, 0);
}
}
ImageInfo::ImageInfo(const AmdGpu::Image& image, const Shader::ImageResource& desc) noexcept {
@@ -164,7 +176,6 @@ void ImageInfo::UpdateSize() {
}
switch (array_mode) {
case AmdGpu::ArrayMode::ArrayLinearGeneral:
case AmdGpu::ArrayMode::ArrayLinearAligned: {
std::tie(mip_info.pitch, mip_info.height, mip_info.size) =
ImageSizeLinearAligned(mip_w, mip_h, num_bits, num_samples);

View File

@@ -575,6 +575,9 @@ ImageView& TextureCache::FindTexture(ImageId image_id, const BaseDesc& desc) {
ImageView& TextureCache::FindRenderTarget(ImageId image_id, const BaseDesc& desc) {
Image& image = slot_images[image_id];
image.flags |= ImageFlagBits::GpuModified;
if (Config::readbackLinearImages() && !image.info.props.is_tiled) {
download_images.emplace(image_id);
}
image.usage.render_target = 1u;
UpdateImage(image_id);