From 8848dc6673894a9623ccf3376da341bc6cad0079 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 17 Aug 2021 15:47:29 +0300 Subject: [PATCH] vk: Improve driver compatibility - Add workarounds to disable compression on mesa drivers - Separate intel proprietary vs mesa into two enumerants --- rpcs3/Emu/RSX/VK/VKCompute.cpp | 1 + rpcs3/Emu/RSX/VK/VKGSRender.cpp | 2 +- rpcs3/Emu/RSX/VK/VKHelpers.cpp | 3 +++ rpcs3/Emu/RSX/VK/VKRenderTargets.h | 33 ++++++++++++++++++++++++-- rpcs3/Emu/RSX/VK/vkutils/chip_class.h | 3 ++- rpcs3/Emu/RSX/VK/vkutils/device.cpp | 9 +++++-- rpcs3/Emu/RSX/VK/vkutils/swapchain.hpp | 4 +--- 7 files changed, 46 insertions(+), 9 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/VKCompute.cpp b/rpcs3/Emu/RSX/VK/VKCompute.cpp index 48b0da9d7c..51e0fc1154 100644 --- a/rpcs3/Emu/RSX/VK/VKCompute.cpp +++ b/rpcs3/Emu/RSX/VK/VKCompute.cpp @@ -75,6 +75,7 @@ namespace vk { case vk::driver_vendor::unknown: case vk::driver_vendor::INTEL: + case vk::driver_vendor::ANV: // Intel hw has 8 threads, but LDS allocation behavior makes optimal group size between 64 and 256 // Based on intel's own OpenCL recommended settings unroll_loops = true; diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index 7677f28fce..3d71b51eec 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -583,7 +583,7 @@ VKGSRender::VKGSRender() : GSRender() case vk::driver_vendor::AMD: #if !defined(__linux__) // Intel chipsets would fail on BSD in most cases and DRM_IOCTL_i915_GEM_USERPTR unimplemented - case vk::driver_vendor::INTEL: + case vk::driver_vendor::ANV: #endif if (backend_config.supports_passthrough_dma) { diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index 5c87d420e3..e2bba0fd0e 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -121,6 +121,9 @@ namespace vk g_drv_sanitize_fp_values = true; break; case driver_vendor::INTEL: + case driver_vendor::ANV: + // INTEL vulkan drivers are mostly OK, workarounds are applied when creating the device + break; default: rsx_log.warning("Unsupported device: %s", gpu_name); } diff --git a/rpcs3/Emu/RSX/VK/VKRenderTargets.h b/rpcs3/Emu/RSX/VK/VKRenderTargets.h index 25a9d912cd..a6731725dc 100644 --- a/rpcs3/Emu/RSX/VK/VKRenderTargets.h +++ b/rpcs3/Emu/RSX/VK/VKRenderTargets.h @@ -89,6 +89,35 @@ namespace vk using download_buffer_object = void*; using barrier_descriptor_t = rsx::deferred_clipped_region; + static VkFlags get_attachment_compression_usage_flags() + { + if (g_cfg.video.strict_rendering_mode) + { + return 0; + } + + switch (vk::get_driver_vendor()) + { + case driver_vendor::NVIDIA: + case driver_vendor::INTEL: + case driver_vendor::AMD: // TODO + return 0; + + // Workaround to force transition to GENERAL to decompress. + // Fixes corruption in FBO loops for ANV and RADV. + case driver_vendor::ANV: + return VK_IMAGE_USAGE_STORAGE_BIT; + case driver_vendor::RADV: + // Only needed for GFX10+ + return (vk::get_chip_family() >= chip_class::AMD_navi1x) ? + VK_IMAGE_USAGE_STORAGE_BIT : 0; + + default: + rsx_log.error("Unknown driver vendor!"); + return 0; + } + } + static std::unique_ptr create_new_surface( u32 address, rsx::surface_color_format format, @@ -115,7 +144,7 @@ namespace vk VkImageUsageFlags usage_flags = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; if (samples == 1) [[likely]] { - usage_flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; + usage_flags |= get_attachment_compression_usage_flags() | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_SAMPLED_BIT; } else { @@ -180,7 +209,7 @@ namespace vk if (samples == 1) [[likely]] { - usage_flags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT; + usage_flags |= get_attachment_compression_usage_flags() | VK_IMAGE_USAGE_TRANSFER_SRC_BIT; } std::unique_ptr ds; diff --git a/rpcs3/Emu/RSX/VK/vkutils/chip_class.h b/rpcs3/Emu/RSX/VK/vkutils/chip_class.h index 0a4484f79b..2def2d58ac 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/chip_class.h +++ b/rpcs3/Emu/RSX/VK/vkutils/chip_class.h @@ -29,7 +29,8 @@ namespace vk AMD, NVIDIA, RADV, - INTEL + INTEL, + ANV }; driver_vendor get_driver_vendor(); diff --git a/rpcs3/Emu/RSX/VK/vkutils/device.cpp b/rpcs3/Emu/RSX/VK/vkutils/device.cpp index 62608f90de..ac40c2dcb8 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/device.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/device.cpp @@ -128,7 +128,11 @@ namespace vk if (gpu_name.find("Intel") != umax) { +#ifdef _WIN32 return driver_vendor::INTEL; +#else + return driver_vendor::ANV; +#endif } return driver_vendor::unknown; @@ -145,10 +149,11 @@ namespace vk case VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR: return driver_vendor::NVIDIA; case VK_DRIVER_ID_INTEL_PROPRIETARY_WINDOWS_KHR: - case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR: return driver_vendor::INTEL; + case VK_DRIVER_ID_INTEL_OPEN_SOURCE_MESA_KHR: + return driver_vendor::ANV; default: - // Mobile + // Mobile? return driver_vendor::unknown; } } diff --git a/rpcs3/Emu/RSX/VK/vkutils/swapchain.hpp b/rpcs3/Emu/RSX/VK/vkutils/swapchain.hpp index 0a8903f986..80be1a2b17 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/swapchain.hpp +++ b/rpcs3/Emu/RSX/VK/vkutils/swapchain.hpp @@ -520,11 +520,9 @@ namespace vk switch (gpu.get_driver_vendor()) { case driver_vendor::AMD: - break; case driver_vendor::INTEL: - #ifdef _WIN32 break; - #endif + case driver_vendor::ANV: case driver_vendor::NVIDIA: case driver_vendor::RADV: m_wm_reports_flag = true;