Texture cache: reverse inmediate flush changes
This commit is contained in:
		| @@ -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) { | ||||
|   | ||||
| @@ -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) { | ||||
|   | ||||
| @@ -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)); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user