From 5737cbdd5fe39852745a6d2b4b84ac59e205e47e Mon Sep 17 00:00:00 2001 From: CamilleLaVey Date: Sat, 29 Nov 2025 00:29:07 -0400 Subject: [PATCH] [Re-introduced] Added linear filtering in texture blitting operations --- .../renderer_vulkan/vk_texture_cache.cpp | 55 +++++++++++++------ .../renderer_vulkan/vk_texture_cache.h | 1 + 2 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index e2d932c4e9..f2c21d77aa 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -739,7 +739,7 @@ void TryTransformSwizzleIfNeeded(PixelFormat format, std::array copies) { // As per the size-compatible formats section of vulkan, copy manually via ReinterpretImage @@ -2025,7 +2045,9 @@ bool Image::ScaleUp(bool ignore) { if (NeedsScaleHelper()) { return BlitScaleHelper(true); } else { - BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution); + const bool supports_linear_filter = runtime->SupportsLinearFilter(info.format); + BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution, + supports_linear_filter); } return true; } @@ -2050,7 +2072,9 @@ bool Image::ScaleDown(bool ignore) { if (NeedsScaleHelper()) { return BlitScaleHelper(false); } else { - BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false); + const bool supports_linear_filter = runtime->SupportsLinearFilter(info.format); + BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, + supports_linear_filter, false); } return true; } @@ -2059,9 +2083,10 @@ bool Image::BlitScaleHelper(bool scale_up) { using namespace VideoCommon; static constexpr auto BLIT_OPERATION = Tegra::Engines::Fermi2D::Operation::SrcCopy; const bool is_color{aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT}; - const bool is_bilinear{is_color && !IsPixelFormatInteger(info.format)}; - const auto operation = is_bilinear ? Tegra::Engines::Fermi2D::Filter::Bilinear - : Tegra::Engines::Fermi2D::Filter::Point; + const bool supports_linear_filter = runtime->SupportsLinearFilter(info.format); + const bool is_bilinear = is_color && supports_linear_filter; + const auto filter_mode = is_bilinear ? Tegra::Engines::Fermi2D::Filter::Bilinear + : Tegra::Engines::Fermi2D::Filter::Point; const bool is_2d = info.type == ImageType::e2D; const auto& resolution = runtime->resolution; @@ -2095,13 +2120,11 @@ bool Image::BlitScaleHelper(bool scale_up) { if (aspect_mask == VK_IMAGE_ASPECT_COLOR_BIT) { if (!blit_framebuffer) blit_framebuffer.emplace(*runtime, view_ptr, nullptr, extent, scale_up); - runtime->blit_image_helper.BlitColor(&*blit_framebuffer, *blit_view, - dst_region, src_region, operation, BLIT_OPERATION); + runtime->blit_image_helper.BlitColor(&blit_framebuffer.value(), *blit_view, dst_region, src_region, filter_mode, BLIT_OPERATION); } else if (aspect_mask == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (!blit_framebuffer) blit_framebuffer.emplace(*runtime, nullptr, view_ptr, extent, scale_up); - runtime->blit_image_helper.BlitDepthStencil(&*blit_framebuffer, *blit_view, - dst_region, src_region, operation, BLIT_OPERATION); + runtime->blit_image_helper.BlitDepthStencil(&blit_framebuffer.value(), *blit_view, dst_region, src_region, filter_mode, BLIT_OPERATION); } else { // TODO: Use helper blits where applicable flags &= ~ImageFlagBits::Rescaled; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index b62310a97f..9d8917a6a6 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -122,6 +122,7 @@ public: bool IsFormatDitherable(VideoCore::Surface::PixelFormat format); bool IsFormatScalable(VideoCore::Surface::PixelFormat format); + bool SupportsLinearFilter(VideoCore::Surface::PixelFormat format) const; VkFormat GetSupportedFormat(VkFormat requested_format, VkFormatFeatureFlags required_features) const;