diff options
Diffstat (limited to '')
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 13d938434..44afdc1cd 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -34,6 +34,12 @@ constexpr std::array DEPTH16_UNORM_STENCIL8_UINT{ | |||
| 34 | }; | 34 | }; |
| 35 | } // namespace Alternatives | 35 | } // namespace Alternatives |
| 36 | 36 | ||
| 37 | enum class NvidiaArchitecture { | ||
| 38 | AmpereOrNewer, | ||
| 39 | Turing, | ||
| 40 | VoltaOrOlder, | ||
| 41 | }; | ||
| 42 | |||
| 37 | constexpr std::array REQUIRED_EXTENSIONS{ | 43 | constexpr std::array REQUIRED_EXTENSIONS{ |
| 38 | VK_KHR_MAINTENANCE1_EXTENSION_NAME, | 44 | VK_KHR_MAINTENANCE1_EXTENSION_NAME, |
| 39 | VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, | 45 | VK_KHR_STORAGE_BUFFER_STORAGE_CLASS_EXTENSION_NAME, |
| @@ -198,13 +204,34 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica | |||
| 198 | 204 | ||
| 199 | std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) { | 205 | std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) { |
| 200 | const std::vector extensions = physical.EnumerateDeviceExtensionProperties(); | 206 | const std::vector extensions = physical.EnumerateDeviceExtensionProperties(); |
| 201 | std::vector<std::string> supported_extensions(std::size(extensions)); | 207 | std::vector<std::string> supported_extensions; |
| 208 | supported_extensions.reserve(extensions.size()); | ||
| 202 | for (const auto& extension : extensions) { | 209 | for (const auto& extension : extensions) { |
| 203 | supported_extensions.emplace_back(extension.extensionName); | 210 | supported_extensions.emplace_back(extension.extensionName); |
| 204 | } | 211 | } |
| 205 | return supported_extensions; | 212 | return supported_extensions; |
| 206 | } | 213 | } |
| 207 | 214 | ||
| 215 | NvidiaArchitecture GetNvidiaArchitecture(vk::PhysicalDevice physical, | ||
| 216 | std::span<const std::string> exts) { | ||
| 217 | if (std::ranges::find(exts, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME) != exts.end()) { | ||
| 218 | VkPhysicalDeviceFragmentShadingRatePropertiesKHR shading_rate_props{}; | ||
| 219 | shading_rate_props.sType = | ||
| 220 | VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_PROPERTIES_KHR; | ||
| 221 | VkPhysicalDeviceProperties2KHR physical_properties{}; | ||
| 222 | physical_properties.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2_KHR; | ||
| 223 | physical_properties.pNext = &shading_rate_props; | ||
| 224 | physical.GetProperties2KHR(physical_properties); | ||
| 225 | if (shading_rate_props.primitiveFragmentShadingRateWithMultipleViewports) { | ||
| 226 | // Only Ampere and newer support this feature | ||
| 227 | return NvidiaArchitecture::AmpereOrNewer; | ||
| 228 | } | ||
| 229 | } | ||
| 230 | if (std::ranges::find(exts, VK_NV_SHADING_RATE_IMAGE_EXTENSION_NAME) != exts.end()) { | ||
| 231 | return NvidiaArchitecture::Turing; | ||
| 232 | } | ||
| 233 | return NvidiaArchitecture::VoltaOrOlder; | ||
| 234 | } | ||
| 208 | } // Anonymous namespace | 235 | } // Anonymous namespace |
| 209 | 236 | ||
| 210 | Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR surface, | 237 | Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR surface, |
| @@ -522,11 +549,19 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR | |||
| 522 | CollectTelemetryParameters(); | 549 | CollectTelemetryParameters(); |
| 523 | CollectToolingInfo(); | 550 | CollectToolingInfo(); |
| 524 | 551 | ||
| 525 | if (driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR && is_float16_supported) { | 552 | if (driver_id == VK_DRIVER_ID_NVIDIA_PROPRIETARY_KHR) { |
| 526 | if (std::ranges::find(supported_extensions, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME) != | 553 | const auto arch = GetNvidiaArchitecture(physical, supported_extensions); |
| 527 | supported_extensions.end()) { | 554 | switch (arch) { |
| 555 | case NvidiaArchitecture::AmpereOrNewer: | ||
| 528 | LOG_WARNING(Render_Vulkan, "Blacklisting Ampere devices from float16 math"); | 556 | LOG_WARNING(Render_Vulkan, "Blacklisting Ampere devices from float16 math"); |
| 529 | is_float16_supported = false; | 557 | is_float16_supported = false; |
| 558 | break; | ||
| 559 | case NvidiaArchitecture::Turing: | ||
| 560 | break; | ||
| 561 | case NvidiaArchitecture::VoltaOrOlder: | ||
| 562 | LOG_WARNING(Render_Vulkan, "Blacklisting Volta and older from VK_KHR_push_descriptor"); | ||
| 563 | khr_push_descriptor = false; | ||
| 564 | break; | ||
| 530 | } | 565 | } |
| 531 | } | 566 | } |
| 532 | if (ext_extended_dynamic_state && driver_id == VK_DRIVER_ID_MESA_RADV) { | 567 | if (ext_extended_dynamic_state && driver_id == VK_DRIVER_ID_MESA_RADV) { |