Explorar o código

TextureCache: force same image format when resolving an image.

Fernando Sahmkow %!s(int64=4) %!d(string=hai) anos
pai
achega
0ff228405f

+ 8 - 2
src/video_core/texture_cache/texture_cache.h

@@ -759,7 +759,8 @@ ImageId TextureCache<P>::FindImage(const ImageInfo& info, GPUVAddr gpu_addr,
             return ImageId{};
         }
     }
-    const bool broken_views = runtime.HasBrokenTextureViewFormats();
+    const bool broken_views =
+        runtime.HasBrokenTextureViewFormats() || True(options & RelaxedOptions::ForceBrokenViews);
     const bool native_bgr = runtime.HasNativeBgr();
     ImageId image_id;
     const auto lambda = [&](ImageId existing_image_id, ImageBase& existing_image) {
@@ -1096,7 +1097,12 @@ typename TextureCache<P>::BlitImages TextureCache<P>::GetBlitImages(
             continue;
         }
         src_id = FindOrInsertImage(src_info, src_addr);
-        dst_id = FindOrInsertImage(dst_info, dst_addr);
+        RelaxedOptions dst_options{};
+        if (src_info.num_samples > 1) {
+            // it's a resolve, we must enforce the same format.
+            dst_options = RelaxedOptions::ForceBrokenViews;
+        }
+        dst_id = FindOrInsertImage(dst_info, dst_addr, dst_options);
     } while (has_deleted_images);
     return BlitImages{
         .dst_id = dst_id,

+ 1 - 0
src/video_core/texture_cache/types.h

@@ -54,6 +54,7 @@ enum class RelaxedOptions : u32 {
     Size = 1 << 0,
     Format = 1 << 1,
     Samples = 1 << 2,
+    ForceBrokenViews = 1 << 3,
 };
 DECLARE_ENUM_FLAG_OPERATORS(RelaxedOptions)