summaryrefslogtreecommitdiff
path: root/src/video_core/renderer_vulkan
diff options
context:
space:
mode:
authorGravatar ameerj2021-12-23 22:30:10 -0500
committerGravatar ameerj2021-12-23 22:35:19 -0500
commitf9e0681d59adaed2f077eb94642f6dbc3acf246e (patch)
tree1a36ad994e4e103ca7095df81cbc62c2c2ecf343 /src/video_core/renderer_vulkan
parentMerge pull request #7614 from liushuyu/fix-linux-inhibit (diff)
downloadyuzu-f9e0681d59adaed2f077eb94642f6dbc3acf246e.tar.gz
yuzu-f9e0681d59adaed2f077eb94642f6dbc3acf246e.tar.xz
yuzu-f9e0681d59adaed2f077eb94642f6dbc3acf246e.zip
vk_texture_cache: Use 3D scale helpers for MSAA texture scaling on Intel Windows drivers
Fixes a crash when scaling MSAA textures in titles such as Sonic Colors Ultimate.
Diffstat (limited to 'src/video_core/renderer_vulkan')
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp39
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h2
2 files changed, 23 insertions, 18 deletions
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 1941170cb..a4cce6142 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1344,7 +1344,6 @@ bool Image::ScaleUp(bool ignore) {
1344 return false; 1344 return false;
1345 } 1345 }
1346 has_scaled = true; 1346 has_scaled = true;
1347 const auto& device = runtime->device;
1348 if (!scaled_image) { 1347 if (!scaled_image) {
1349 const bool is_2d = info.type == ImageType::e2D; 1348 const bool is_2d = info.type == ImageType::e2D;
1350 const u32 scaled_width = resolution.ScaleUp(info.size.width); 1349 const u32 scaled_width = resolution.ScaleUp(info.size.width);
@@ -1352,7 +1351,7 @@ bool Image::ScaleUp(bool ignore) {
1352 auto scaled_info = info; 1351 auto scaled_info = info;
1353 scaled_info.size.width = scaled_width; 1352 scaled_info.size.width = scaled_width;
1354 scaled_info.size.height = scaled_height; 1353 scaled_info.size.height = scaled_height;
1355 scaled_image = MakeImage(device, scaled_info); 1354 scaled_image = MakeImage(runtime->device, scaled_info);
1356 auto& allocator = runtime->memory_allocator; 1355 auto& allocator = runtime->memory_allocator;
1357 scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal)); 1356 scaled_commit = MemoryCommit(allocator.Commit(scaled_image, MemoryUsage::DeviceLocal));
1358 ignore = false; 1357 ignore = false;
@@ -1361,18 +1360,13 @@ bool Image::ScaleUp(bool ignore) {
1361 if (ignore) { 1360 if (ignore) {
1362 return true; 1361 return true;
1363 } 1362 }
1364
1365 if (aspect_mask == 0) { 1363 if (aspect_mask == 0) {
1366 aspect_mask = ImageAspectMask(info.format); 1364 aspect_mask = ImageAspectMask(info.format);
1367 } 1365 }
1368 static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal; 1366 if (NeedsScaleHelper()) {
1369 const PixelFormat format = StorageFormat(info.format);
1370 const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
1371 const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
1372 if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) {
1373 BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution);
1374 } else {
1375 return BlitScaleHelper(true); 1367 return BlitScaleHelper(true);
1368 } else {
1369 BlitScale(*scheduler, *original_image, *scaled_image, info, aspect_mask, resolution);
1376 } 1370 }
1377 return true; 1371 return true;
1378} 1372}
@@ -1394,15 +1388,10 @@ bool Image::ScaleDown(bool ignore) {
1394 if (aspect_mask == 0) { 1388 if (aspect_mask == 0) {
1395 aspect_mask = ImageAspectMask(info.format); 1389 aspect_mask = ImageAspectMask(info.format);
1396 } 1390 }
1397 static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal; 1391 if (NeedsScaleHelper()) {
1398 const PixelFormat format = StorageFormat(info.format);
1399 const auto& device = runtime->device;
1400 const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
1401 const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
1402 if (device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT)) {
1403 BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false);
1404 } else {
1405 return BlitScaleHelper(false); 1392 return BlitScaleHelper(false);
1393 } else {
1394 BlitScale(*scheduler, *scaled_image, *original_image, info, aspect_mask, resolution, false);
1406 } 1395 }
1407 return true; 1396 return true;
1408} 1397}
@@ -1470,6 +1459,20 @@ bool Image::BlitScaleHelper(bool scale_up) {
1470 return true; 1459 return true;
1471} 1460}
1472 1461
1462bool Image::NeedsScaleHelper() const {
1463 const auto& device = runtime->device;
1464 const bool needs_msaa_helper = info.num_samples > 1 && device.CantBlitMSAA();
1465 if (needs_msaa_helper) {
1466 return true;
1467 }
1468 static constexpr auto OPTIMAL_FORMAT = FormatType::Optimal;
1469 const PixelFormat format = StorageFormat(info.format);
1470 const auto vk_format = MaxwellToVK::SurfaceFormat(device, OPTIMAL_FORMAT, false, format).format;
1471 const auto blit_usage = VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
1472 const bool needs_blit_helper = !device.IsFormatSupported(vk_format, blit_usage, OPTIMAL_FORMAT);
1473 return needs_blit_helper;
1474}
1475
1473ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info, 1476ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewInfo& info,
1474 ImageId image_id_, Image& image) 1477 ImageId image_id_, Image& image)
1475 : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device}, 1478 : VideoCommon::ImageViewBase{info, image.info, image_id_}, device{&runtime.device},
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index c592f2666..cad033af7 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -148,6 +148,8 @@ public:
148private: 148private:
149 bool BlitScaleHelper(bool scale_up); 149 bool BlitScaleHelper(bool scale_up);
150 150
151 bool NeedsScaleHelper() const;
152
151 VKScheduler* scheduler{}; 153 VKScheduler* scheduler{};
152 TextureCacheRuntime* runtime{}; 154 TextureCacheRuntime* runtime{};
153 155