From 016c6feb49255792e4093be381e20509eb94e6d1 Mon Sep 17 00:00:00 2001
From: Fernando Sahmkow <fsahmkow27@gmail.com>
Date: Thu, 4 May 2023 17:44:49 +0200
Subject: [PATCH] Texture cache: reverse inmediate flush changes

---
 src/video_core/texture_cache/image_info.cpp   | 12 +++++++++
 .../texture_cache/image_view_base.cpp         |  5 +---
 src/video_core/texture_cache/texture_cache.h  | 25 +------------------
 3 files changed, 14 insertions(+), 28 deletions(-)

diff --git a/src/video_core/texture_cache/image_info.cpp b/src/video_core/texture_cache/image_info.cpp
index 11f3f78a15..e8ddde6911 100644
--- a/src/video_core/texture_cache/image_info.cpp
+++ b/src/video_core/texture_cache/image_info.cpp
@@ -4,6 +4,7 @@
 #include <fmt/format.h>
 
 #include "common/assert.h"
+#include "common/settings.h"
 #include "video_core/surface.h"
 #include "video_core/texture_cache/format_lookup_table.h"
 #include "video_core/texture_cache/image_info.h"
@@ -22,6 +23,8 @@ using VideoCore::Surface::PixelFormat;
 using VideoCore::Surface::SurfaceType;
 
 ImageInfo::ImageInfo(const TICEntry& config) noexcept {
+    forced_flushed = config.IsPitchLinear() && !Settings::values.use_reactive_flushing.GetValue();
+    dma_downloaded = forced_flushed;
     format = PixelFormatFromTextureInfo(config.format, config.r_type, config.g_type, config.b_type,
                                         config.a_type, config.srgb_conversion);
     num_samples = NumSamples(config.msaa_mode);
@@ -117,6 +120,9 @@ ImageInfo::ImageInfo(const TICEntry& config) noexcept {
 
 ImageInfo::ImageInfo(const Maxwell3D::Regs::RenderTargetConfig& ct,
                      Tegra::Texture::MsaaMode msaa_mode) noexcept {
+    forced_flushed =
+        ct.tile_mode.is_pitch_linear && !Settings::values.use_reactive_flushing.GetValue();
+    dma_downloaded = forced_flushed;
     format = VideoCore::Surface::PixelFormatFromRenderTargetFormat(ct.format);
     rescaleable = false;
     if (ct.tile_mode.is_pitch_linear) {
@@ -155,6 +161,9 @@ ImageInfo::ImageInfo(const Maxwell3D::Regs::RenderTargetConfig& ct,
 
 ImageInfo::ImageInfo(const Maxwell3D::Regs::Zeta& zt, const Maxwell3D::Regs::ZetaSize& zt_size,
                      Tegra::Texture::MsaaMode msaa_mode) noexcept {
+    forced_flushed =
+        zt.tile_mode.is_pitch_linear && !Settings::values.use_reactive_flushing.GetValue();
+    dma_downloaded = forced_flushed;
     format = VideoCore::Surface::PixelFormatFromDepthFormat(zt.format);
     size.width = zt_size.width;
     size.height = zt_size.height;
@@ -195,6 +204,9 @@ ImageInfo::ImageInfo(const Maxwell3D::Regs::Zeta& zt, const Maxwell3D::Regs::Zet
 
 ImageInfo::ImageInfo(const Fermi2D::Surface& config) noexcept {
     UNIMPLEMENTED_IF_MSG(config.layer != 0, "Surface layer is not zero");
+    forced_flushed = config.linear == Fermi2D::MemoryLayout::Pitch &&
+                     !Settings::values.use_reactive_flushing.GetValue();
+    dma_downloaded = forced_flushed;
     format = VideoCore::Surface::PixelFormatFromRenderTargetFormat(config.format);
     rescaleable = false;
     if (config.linear == Fermi2D::MemoryLayout::Pitch) {
diff --git a/src/video_core/texture_cache/image_view_base.cpp b/src/video_core/texture_cache/image_view_base.cpp
index c3b2b196d7..d134b6738c 100644
--- a/src/video_core/texture_cache/image_view_base.cpp
+++ b/src/video_core/texture_cache/image_view_base.cpp
@@ -4,7 +4,6 @@
 #include <algorithm>
 
 #include "common/assert.h"
-#include "common/settings.h"
 #include "video_core/compatible_formats.h"
 #include "video_core/surface.h"
 #include "video_core/texture_cache/formatter.h"
@@ -26,9 +25,7 @@ ImageViewBase::ImageViewBase(const ImageViewInfo& info, const ImageInfo& image_i
     ASSERT_MSG(VideoCore::Surface::IsViewCompatible(image_info.format, info.format, false, true),
                "Image view format {} is incompatible with image format {}", info.format,
                image_info.format);
-    const bool preemptive =
-        !Settings::values.use_reactive_flushing.GetValue() && image_info.type == ImageType::Linear;
-    if (image_info.forced_flushed || preemptive) {
+    if (image_info.forced_flushed) {
         flags |= ImageViewFlagBits::PreemtiveDownload;
     }
     if (image_info.type == ImageType::e3D && info.type != ImageViewType::e3D) {
diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h
index 762e8a52fe..29ac01eb42 100644
--- a/src/video_core/texture_cache/texture_cache.h
+++ b/src/video_core/texture_cache/texture_cache.h
@@ -711,39 +711,16 @@ void TextureCache<P>::CommitAsyncFlushes() {
         }
 
         if (any_none_dma) {
-            bool all_pre_sync = true;
             auto download_map = runtime.DownloadStagingBuffer(total_size_bytes, true);
             for (const PendingDownload& download_info : download_ids) {
                 if (download_info.is_swizzle) {
                     Image& image = slot_images[download_info.object_id];
-                    all_pre_sync &= image.info.dma_downloaded;
-                    image.info.dma_downloaded = true;
                     const auto copies = FullDownloadCopies(image.info);
                     image.DownloadMemory(download_map, copies);
                     download_map.offset += Common::AlignUp(image.unswizzled_size_bytes, 64);
                 }
             }
-            if (!all_pre_sync) {
-                runtime.Finish();
-                auto it = download_ids.begin();
-                while (it != download_ids.end()) {
-                    const PendingDownload& download_info = *it;
-                    if (download_info.is_swizzle) {
-                        const ImageBase& image = slot_images[download_info.object_id];
-                        const auto copies = FullDownloadCopies(image.info);
-                        download_map.offset -= Common::AlignUp(image.unswizzled_size_bytes, 64);
-                        std::span<u8> download_span =
-                            download_map.mapped_span.subspan(download_map.offset);
-                        SwizzleImage(*gpu_memory, image.gpu_addr, image.info, copies, download_span,
-                                     swizzle_data_buffer);
-                        it = download_ids.erase(it);
-                    } else {
-                        it++;
-                    }
-                }
-            } else {
-                uncommitted_async_buffers.emplace_back(download_map);
-            }
+            uncommitted_async_buffers.emplace_back(download_map);
         }
 
         async_buffers.emplace_back(std::move(uncommitted_async_buffers));