diff options
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 25 |
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 | ||
| 234 | bool 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 | |||
| 234 | NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical, | 239 | NvidiaArchitecture 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) { |