From ee0633f43a9caff75a8585e72838372ac9ee36fb Mon Sep 17 00:00:00 2001 From: kd-11 Date: Thu, 26 Sep 2019 14:46:38 +0300 Subject: [PATCH] vk: Add turing workaround - Turing crashes if using the depth->color transfer hack --- rpcs3/Emu/RSX/VK/VKTexture.cpp | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKTexture.cpp b/rpcs3/Emu/RSX/VK/VKTexture.cpp index a6fbf32b60..94f827f953 100644 --- a/rpcs3/Emu/RSX/VK/VKTexture.cpp +++ b/rpcs3/Emu/RSX/VK/VKTexture.cpp @@ -471,9 +471,23 @@ namespace vk } case VK_FORMAT_D24_UNORM_S8_UINT: { - auto typeless = vk::get_typeless_helper(VK_FORMAT_B8G8R8A8_UNORM, typeless_w, typeless_h); - change_image_layout(cmd, typeless, VK_IMAGE_LAYOUT_GENERAL); - stretch_image_typeless_unsafe(src, dst, typeless->value, src_rect, dst_rect, VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT); + const VkImageAspectFlags depth_stencil = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; + if (vk::get_chip_family() != vk::chip_class::NV_turing) + { + auto typeless = vk::get_typeless_helper(VK_FORMAT_B8G8R8A8_UNORM, typeless_w, typeless_h); + change_image_layout(cmd, typeless, VK_IMAGE_LAYOUT_GENERAL); + stretch_image_typeless_unsafe(src, dst, typeless->value, src_rect, dst_rect, depth_stencil); + } + else + { + auto typeless_depth = vk::get_typeless_helper(VK_FORMAT_B8G8R8A8_UNORM, typeless_w, typeless_h); + auto typeless_stencil = vk::get_typeless_helper(VK_FORMAT_R8_UNORM, typeless_w, typeless_h); + change_image_layout(cmd, typeless_depth, VK_IMAGE_LAYOUT_GENERAL); + change_image_layout(cmd, typeless_stencil, VK_IMAGE_LAYOUT_GENERAL); + + stretch_image_typeless_safe(src, dst, typeless_depth->value, src_rect, dst_rect, depth_stencil, VK_IMAGE_ASPECT_DEPTH_BIT); + stretch_image_typeless_safe(src, dst, typeless_stencil->value, src_rect, dst_rect, depth_stencil, VK_IMAGE_ASPECT_STENCIL_BIT); + } break; } case VK_FORMAT_D32_SFLOAT_S8_UINT: @@ -488,8 +502,6 @@ namespace vk change_image_layout(cmd, typeless_stencil, VK_IMAGE_LAYOUT_GENERAL); const VkImageAspectFlags depth_stencil = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT; - - // Blit DEPTH aspect stretch_image_typeless_safe(src, dst, typeless_depth->value, src_rect, dst_rect, depth_stencil, VK_IMAGE_ASPECT_DEPTH_BIT); stretch_image_typeless_safe(src, dst, typeless_stencil->value, src_rect, dst_rect, depth_stencil, VK_IMAGE_ASPECT_STENCIL_BIT); break;