summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/video_core/vulkan_common/vulkan_device.cpp43
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
37enum class NvidiaArchitecture {
38 AmpereOrNewer,
39 Turing,
40 VoltaOrOlder,
41};
42
37constexpr std::array REQUIRED_EXTENSIONS{ 43constexpr 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
199std::vector<std::string> GetSupportedExtensions(vk::PhysicalDevice physical) { 205std::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
215NvidiaArchitecture 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
210Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR surface, 237Device::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) {