summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2022-02-26 01:19:13 -0800
committerGravatar GitHub2022-02-26 01:19:13 -0800
commit56d9052b73a400a406de062ee797d0a96c18d42c (patch)
treeda67c6de114790c6218c651a18c50fd0ea5289d5
parentMerge pull request #7948 from Morph1984/11-11-10-float (diff)
parentvulkan_device: Blacklist RADV on RDNA2 from VK_EXT_vertex_input_dynamic_state (diff)
downloadyuzu-56d9052b73a400a406de062ee797d0a96c18d42c.tar.gz
yuzu-56d9052b73a400a406de062ee797d0a96c18d42c.tar.xz
yuzu-56d9052b73a400a406de062ee797d0a96c18d42c.zip
Merge pull request #7953 from ameerj/radv-rdna2-crash
vulkan_device: Blacklist RADV on RDNA2 from VK_EXT_vertex_input_dynamic_state
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp
index d0c84215f..effde73c9 100644
--- a/src/video_core/vulkan_common/vulkan_device.cpp
+++ b/src/video_core/vulkan_common/vulkan_device.cpp
@@ -231,9 +231,14 @@ std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) {
231 return supported_extensions; 231 return supported_extensions;
232} 232}
233 233
234bool IsExtensionSupported(std::span<const std::string> supported_extensions,
235 std::string_view extension) {
236 return std::ranges::find(supported_extensions, extension) != supported_extensions.end();
237}
238
234NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical, 239NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical,
235 std::span<const std::string> exts) { 240 std::span<const std::string> exts) {
236 if (std::ranges::find(exts, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME) != exts.end()) { 241 if (IsExtensionSupported(exts, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME)) {
237 VkPhysicalDeviceFragmentShadingRatePropertiesKHR shading_rate_props{}; 242 VkPhysicalDeviceFragmentShadingRatePropertiesKHR shading_rate_props{};
238 shading_rate_props.sType = 243 shading_rate_props.sType =
239 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR; 244 VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR;
@@ -246,7 +251,7 @@ NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical,
246 return NvidiaArchitecture::AmpereOrNewer; 251 return NvidiaArchitecture::AmpereOrNewer;
247 } 252 }
248 } 253 }
249 if (std::ranges::find(exts, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME) != exts.end()) { 254 if (IsExtensionSupported(exts, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME)) {
250 return NvidiaArchitecture::Turing; 255 return NvidiaArchitecture::Turing;
251 } 256 }
252 return NvidiaArchitecture::VoltaOrOlder; 257 return NvidiaArchitecture::VoltaOrOlder;
@@ -611,7 +616,8 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
611 break; 616 break;
612 } 617 }
613 } 618 }
614 if (ext_extended_dynamic_state && driver_id == VK_DRIVER_ID_MESA_RADV) { 619 const bool is_radv = driver_id == VK_DRIVER_ID_MESA_RADV;
620 if (ext_extended_dynamic_state && is_radv) {
615 // Mask driver version variant 621 // Mask driver version variant
616 const u32 version = (properties.driverVersion << 3) >> 3; 622 const u32 version = (properties.driverVersion << 3) >> 3;
617 if (version < VK_MAKE_API_VERSION(0, 21, 2, 0)) { 623 if (version < VK_MAKE_API_VERSION(0, 21, 2, 0)) {
@@ -620,6 +626,17 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
620 ext_extended_dynamic_state = false; 626 ext_extended_dynamic_state = false;
621 } 627 }
622 } 628 }
629 if (ext_vertex_input_dynamic_state && is_radv) {
630 // TODO(ameerj): Blacklist only offending driver versions
631 // TODO(ameerj): Confirm if RDNA1 is affected
632 const bool is_rdna2 =
633 IsExtensionSupported(supported_extensions, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
634 if (is_rdna2) {
635 LOG_WARNING(Render_Vulkan,
636 "RADV has broken VK_EXT_vertex_input_dynamic_state on RDNA2 hardware");
637 ext_vertex_input_dynamic_state = false;
638 }
639 }
623 sets_per_pool = 64; 640 sets_per_pool = 64;
624 641
625 const bool is_amd = 642 const bool is_amd =
@@ -635,7 +652,7 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
635 has_broken_cube_compatibility = true; 652 has_broken_cube_compatibility = true;
636 } 653 }
637 } 654 }
638 const bool is_amd_or_radv = is_amd || driver_id == VK_DRIVER_ID_MESA_RADV; 655 const bool is_amd_or_radv = is_amd || is_radv;
639 if (ext_sampler_filter_minmax && is_amd_or_radv) { 656 if (ext_sampler_filter_minmax && is_amd_or_radv) {
640 // Disable ext_sampler_filter_minmax on AMD GCN4 and lower as it is broken. 657 // Disable ext_sampler_filter_minmax on AMD GCN4 and lower as it is broken.
641 if (!is_float16_supported) { 658 if (!is_float16_supported) {