TextureCache: Fix regression caused by ART and improve blit detection algorithm to be smarter.
This commit is contained in:
parent
2ec7fcecb7
commit
b130f648d7
|
@ -475,6 +475,7 @@ void TextureCache<P>::BlitImage(const Tegra::Engines::Fermi2D::Surface& dst,
|
||||||
const BlitImages images = GetBlitImages(dst, src);
|
const BlitImages images = GetBlitImages(dst, src);
|
||||||
const ImageId dst_id = images.dst_id;
|
const ImageId dst_id = images.dst_id;
|
||||||
const ImageId src_id = images.src_id;
|
const ImageId src_id = images.src_id;
|
||||||
|
|
||||||
PrepareImage(src_id, false, false);
|
PrepareImage(src_id, false, false);
|
||||||
PrepareImage(dst_id, true, false);
|
PrepareImage(dst_id, true, false);
|
||||||
|
|
||||||
|
@ -1094,12 +1095,8 @@ typename TextureCache<P>::BlitImages TextureCache<P>::GetBlitImages(
|
||||||
if (GetFormatType(dst_info.format) != GetFormatType(src_info.format)) {
|
if (GetFormatType(dst_info.format) != GetFormatType(src_info.format)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!dst_id) {
|
src_id = FindOrInsertImage(src_info, src_addr);
|
||||||
dst_id = InsertImage(dst_info, dst_addr, RelaxedOptions{});
|
dst_id = FindOrInsertImage(dst_info, dst_addr);
|
||||||
}
|
|
||||||
if (!src_id) {
|
|
||||||
src_id = InsertImage(src_info, src_addr, RelaxedOptions{});
|
|
||||||
}
|
|
||||||
} while (has_deleted_images);
|
} while (has_deleted_images);
|
||||||
return BlitImages{
|
return BlitImages{
|
||||||
.dst_id = dst_id,
|
.dst_id = dst_id,
|
||||||
|
|
|
@ -1151,19 +1151,39 @@ bool IsSubresource(const ImageInfo& candidate, const ImageBase& image, GPUVAddr
|
||||||
|
|
||||||
void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase* dst,
|
void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase* dst,
|
||||||
const ImageBase* src) {
|
const ImageBase* src) {
|
||||||
if (src && GetFormatType(src->info.format) != SurfaceType::ColorTexture) {
|
if (src) {
|
||||||
src_info.format = src->info.format;
|
src_info.format = src->info.format;
|
||||||
|
src_info.num_samples = src->info.num_samples;
|
||||||
|
src_info.size = src->info.size;
|
||||||
}
|
}
|
||||||
if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
|
if (dst) {
|
||||||
dst_info.format = dst->info.format;
|
dst_info.format = dst->info.format;
|
||||||
|
dst_info.num_samples = dst->info.num_samples;
|
||||||
|
dst_info.size = dst->info.size;
|
||||||
}
|
}
|
||||||
if (src && GetFormatType(src->info.format) != SurfaceType::ColorTexture) {
|
if (src && GetFormatType(src->info.format) != SurfaceType::ColorTexture) {
|
||||||
|
if (dst) {
|
||||||
|
src_info.format = dst_info.format;
|
||||||
|
} else {
|
||||||
dst_info.format = src->info.format;
|
dst_info.format = src->info.format;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
|
if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
|
||||||
|
if (src) {
|
||||||
|
if (GetFormatType(src->info.format) == SurfaceType::ColorTexture) {
|
||||||
|
dst_info.format = src->info.format;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
src_info.format = dst->info.format;
|
src_info.format = dst->info.format;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (src_info.num_samples > 1) {
|
||||||
|
dst_info.format = src_info.format;
|
||||||
|
}
|
||||||
|
if (dst_info.num_samples > 1) {
|
||||||
|
src_info.format = dst_info.format;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
u32 MapSizeBytes(const ImageBase& image) {
|
u32 MapSizeBytes(const ImageBase& image) {
|
||||||
if (True(image.flags & ImageFlagBits::AcceleratedUpload)) {
|
if (True(image.flags & ImageFlagBits::AcceleratedUpload)) {
|
||||||
|
|
Loading…
Reference in New Issue