summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/video_core/texture_cache/texture_cache.h8
-rw-r--r--src/video_core/texture_cache/util.cpp25
2 files changed, 17 insertions, 16 deletions
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 06257f064..4188f93c5 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -1096,13 +1096,13 @@ typename TextureCache<P>::BlitImages TextureCache<P>::GetBlitImages(
if (GetFormatType(dst_info.format) != GetFormatType(src_info.format)) {
continue;
}
- src_id = FindOrInsertImage(src_info, src_addr);
- RelaxedOptions dst_options{};
+ RelaxedOptions find_options{};
if (src_info.num_samples > 1) {
// it's a resolve, we must enforce the same format.
- dst_options = RelaxedOptions::ForceBrokenViews;
+ find_options = RelaxedOptions::ForceBrokenViews;
}
- dst_id = FindOrInsertImage(dst_info, dst_addr, dst_options);
+ src_id = FindOrInsertImage(src_info, src_addr, find_options);
+ dst_id = FindOrInsertImage(dst_info, dst_addr, find_options);
} while (has_deleted_images);
return BlitImages{
.dst_id = dst_id,
diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp
index 8f9eb387c..e4d82631e 100644
--- a/src/video_core/texture_cache/util.cpp
+++ b/src/video_core/texture_cache/util.cpp
@@ -1151,19 +1151,25 @@ bool IsSubresource(const ImageInfo& candidate, const ImageBase& image, GPUVAddr
void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase* dst,
const ImageBase* src) {
+ bool is_resolve = false;
+ const auto original_src_format = src_info.format;
+ const auto original_dst_format = dst_info.format;
if (src) {
- src_info.format = src->info.format;
+ if (GetFormatType(src->info.format) != SurfaceType::ColorTexture) {
+ src_info.format = src->info.format;
+ }
+ is_resolve = src->info.num_samples > 1;
src_info.num_samples = src->info.num_samples;
src_info.size = src->info.size;
}
- if (dst) {
+ if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
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 (dst) {
- src_info.format = dst_info.format;
+ if (GetFormatType(dst->info.format) == SurfaceType::ColorTexture) {
+ src_info.format = original_src_format;
+ }
} else {
dst_info.format = src->info.format;
}
@@ -1171,18 +1177,13 @@ void DeduceBlitImages(ImageInfo& dst_info, ImageInfo& src_info, const ImageBase*
if (dst && GetFormatType(dst->info.format) != SurfaceType::ColorTexture) {
if (src) {
if (GetFormatType(src->info.format) == SurfaceType::ColorTexture) {
- dst_info.format = src->info.format;
+ dst_info.format = original_dst_format;
}
} else {
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;
- }
+ ASSERT(!is_resolve || dst_info.format == src_info.format);
}
u32 MapSizeBytes(const ImageBase& image) {