@ -883,6 +883,7 @@ ImageId TextureCache<P>::FindImage(const ImageInfo& info, GPUVAddr gpu_addr,
if ( ! cpu_addr ) {
return ImageId { } ;
}
const bool broken_views = runtime . HasBrokenTextureViewFormats ( ) ;
ImageId image_id ;
const auto lambda = [ & ] ( ImageId existing_image_id , ImageBase & existing_image ) {
if ( info . type = = ImageType : : Linear | | existing_image . info . type = = ImageType : : Linear ) {
@ -892,11 +893,11 @@ ImageId TextureCache<P>::FindImage(const ImageInfo& info, GPUVAddr gpu_addr,
if ( existing_image . gpu_addr = = gpu_addr & & existing . type = = info . type & &
existing . pitch = = info . pitch & &
IsPitchLinearSameSize ( existing , info , strict_size ) & &
IsViewCompatible ( existing . format , info . format )) {
IsViewCompatible ( existing . format , info . format , broken_views )) {
image_id = existing_image_id ;
return true ;
}
} else if ( IsSubresource ( info , existing_image , gpu_addr , options )) {
} else if ( IsSubresource ( info , existing_image , gpu_addr , options , broken_views )) {
image_id = existing_image_id ;
return true ;
}
@ -926,6 +927,7 @@ template <class P>
ImageId TextureCache < P > : : JoinImages ( const ImageInfo & info , GPUVAddr gpu_addr , VAddr cpu_addr ) {
ImageInfo new_info = info ;
const size_t size_bytes = CalculateGuestSizeInBytes ( new_info ) ;
const bool broken_views = runtime . HasBrokenTextureViewFormats ( ) ;
std : : vector < ImageId > overlap_ids ;
std : : vector < ImageId > left_aliased_ids ;
std : : vector < ImageId > right_aliased_ids ;
@ -940,7 +942,9 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, VA
}
return ;
}
const auto solution = ResolveOverlap ( new_info , gpu_addr , cpu_addr , overlap , true ) ;
static constexpr bool strict_size = true ;
const std : : optional < OverlapResult > solution =
ResolveOverlap ( new_info , gpu_addr , cpu_addr , overlap , strict_size , broken_views ) ;
if ( solution ) {
gpu_addr = solution - > gpu_addr ;
cpu_addr = solution - > cpu_addr ;
@ -950,9 +954,10 @@ ImageId TextureCache<P>::JoinImages(const ImageInfo& info, GPUVAddr gpu_addr, VA
}
static constexpr auto options = RelaxedOptions : : Size | RelaxedOptions : : Format ;
const ImageBase new_image_base ( new_info , gpu_addr , cpu_addr ) ;
if ( IsSubresource ( new_info , overlap , gpu_addr , options )) {
if ( IsSubresource ( new_info , overlap , gpu_addr , options , broken_views )) {
left_aliased_ids . push_back ( overlap_id ) ;
} else if ( IsSubresource ( overlap . info , new_image_base , overlap . gpu_addr , options ) ) {
} else if ( IsSubresource ( overlap . info , new_image_base , overlap . gpu_addr , options ,
broken_views ) ) {
right_aliased_ids . push_back ( overlap_id ) ;
}
} ) ;