diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index cacc68d02f..e65d594c31 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp @@ -732,7 +732,7 @@ void TryTransformSwizzleIfNeeded(PixelFormat format, std::array copies) { // As per the size-compatible formats section of vulkan, copy manually via ReinterpretImage @@ -2018,7 +2038,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; } @@ -2043,7 +2065,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; } @@ -2052,9 +2076,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; diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h index 4bb9687ab0..f102ee5222 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.h +++ b/src/video_core/renderer_vulkan/vk_texture_cache.h @@ -118,6 +118,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;