فهرست منبع

vk_texture_cache: Fix early returns on unsupported scales

ameerj 4 سال پیش
والد
کامیت
f8339cd703
2فایلهای تغییر یافته به همراه11 افزوده شده و 19 حذف شده
  1. 10 18
      src/video_core/renderer_vulkan/vk_texture_cache.cpp
  2. 1 1
      src/video_core/texture_cache/texture_cache.h

+ 10 - 18
src/video_core/renderer_vulkan/vk_texture_cache.cpp

@@ -1130,13 +1130,19 @@ bool Image::ScaleUp() {
         return false;
     }
     ASSERT(info.type != ImageType::Linear);
-    flags |= ImageFlagBits::Rescaled;
-
     const auto& resolution = runtime->resolution;
     if (!resolution.active) {
-        return true;
+        return false;
     }
     const auto& device = runtime->device;
+    const PixelFormat format = StorageFormat(info.format);
+    const auto format_info = MaxwellToVK::SurfaceFormat(device, FormatType::Optimal, false, format);
+    const auto similar = device.GetSupportedFormat(
+        format_info.format, (VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT),
+        FormatType::Optimal);
+    if (similar != format_info.format) {
+        return true;
+    }
     if (!scaled_image) {
         const u32 up = resolution.up_scale;
         const u32 down = resolution.down_shift;
@@ -1155,23 +1161,9 @@ bool Image::ScaleUp() {
     if (aspect_mask == 0) {
         aspect_mask = ImageAspectMask(info.format);
     }
-    if (info.num_samples > 1) {
-        return true;
-    }
-    const PixelFormat format = StorageFormat(info.format);
-    const auto format_info = MaxwellToVK::SurfaceFormat(device, FormatType::Optimal, false, format);
-    const auto similar = device.GetSupportedFormat(
-        format_info.format, (VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT),
-        FormatType::Optimal);
-
-    if (similar != format_info.format) {
-        return true;
-    }
-    if (aspect_mask == 0) {
-        aspect_mask = ImageAspectMask(info.format);
-    }
     BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution, true);
     current_image = *scaled_image;
+    flags |= ImageFlagBits::Rescaled;
     return true;
 }
 

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

@@ -857,7 +857,7 @@ u64 TextureCache<P>::GetScaledImageSizeBytes(Image& image) {
     const f32 add_to_size = Settings::values.resolution_info.up_factor - 1.0f;
     const bool sign = std::signbit(add_to_size);
     const u32 image_size_bytes = std::max(image.guest_size_bytes, image.unswizzled_size_bytes);
-    const u64 tentative_size = static_cast<u64>(image_size_bytes * std::abs(add_to_size));
+    const u64 tentative_size = image_size_bytes * static_cast<u32>(std::abs(add_to_size));
     const u64 fitted_size = Common::AlignUp(tentative_size, 1024);
     return sign ? -fitted_size : fitted_size;
 }