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