Quellcode durchsuchen

gpu: Check for MSFT_layered_driver, skip layered drivers during enumeration

Ethan Lee vor 4 Monaten
Ursprung
Commit
0cc2b026e7
1 geänderte Dateien mit 27 neuen und 1 gelöschten Zeilen
  1. 27 1
      src/gpu/vulkan/SDL_gpu_vulkan.c

+ 27 - 1
src/gpu/vulkan/SDL_gpu_vulkan.c

@@ -56,6 +56,8 @@ typedef struct VulkanExtensions
     Uint8 KHR_driver_properties;
     Uint8 KHR_driver_properties;
     // Only required for special implementations (i.e. MoltenVK)
     // Only required for special implementations (i.e. MoltenVK)
     Uint8 KHR_portability_subset;
     Uint8 KHR_portability_subset;
+    // Only required to detect devices using Dozen D3D12 driver
+    Uint8 MSFT_layered_driver;
     // Only required for decoding HDR ASTC textures
     // Only required for decoding HDR ASTC textures
     Uint8 EXT_texture_compression_astc_hdr;
     Uint8 EXT_texture_compression_astc_hdr;
 } VulkanExtensions;
 } VulkanExtensions;
@@ -11024,7 +11026,7 @@ static inline Uint8 CheckDeviceExtensions(
         supports->ext = 1;                   \
         supports->ext = 1;                   \
     }
     }
         CHECK(KHR_swapchain)
         CHECK(KHR_swapchain)
-        else CHECK(KHR_maintenance1) else CHECK(KHR_driver_properties) else CHECK(KHR_portability_subset) else CHECK(EXT_texture_compression_astc_hdr)
+        else CHECK(KHR_maintenance1) else CHECK(KHR_driver_properties) else CHECK(KHR_portability_subset) else CHECK(MSFT_layered_driver) else CHECK(EXT_texture_compression_astc_hdr)
 #undef CHECK
 #undef CHECK
     }
     }
 
 
@@ -11039,6 +11041,7 @@ static inline Uint32 GetDeviceExtensionCount(VulkanExtensions *supports)
         supports->KHR_maintenance1 +
         supports->KHR_maintenance1 +
         supports->KHR_driver_properties +
         supports->KHR_driver_properties +
         supports->KHR_portability_subset +
         supports->KHR_portability_subset +
+        supports->MSFT_layered_driver +
         supports->EXT_texture_compression_astc_hdr);
         supports->EXT_texture_compression_astc_hdr);
 }
 }
 
 
@@ -11055,6 +11058,7 @@ static inline void CreateDeviceExtensionArray(
     CHECK(KHR_maintenance1)
     CHECK(KHR_maintenance1)
     CHECK(KHR_driver_properties)
     CHECK(KHR_driver_properties)
     CHECK(KHR_portability_subset)
     CHECK(KHR_portability_subset)
+    CHECK(MSFT_layered_driver)
     CHECK(EXT_texture_compression_astc_hdr)
     CHECK(EXT_texture_compression_astc_hdr)
 #undef CHECK
 #undef CHECK
 }
 }
@@ -11369,6 +11373,28 @@ static Uint8 VULKAN_INTERNAL_IsDeviceSuitable(
         return 0;
         return 0;
     }
     }
 
 
+    // Ignore Dozen, for now
+    if (renderer->supports.MSFT_layered_driver) {
+        VkPhysicalDeviceProperties2KHR physicalDeviceProperties;
+        VkPhysicalDeviceLayeredDriverPropertiesMSFT physicalDeviceLayeredDriverProperties;
+
+        physicalDeviceProperties.sType =
+            VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2;
+        physicalDeviceProperties.pNext = &physicalDeviceLayeredDriverProperties;
+
+        physicalDeviceLayeredDriverProperties.sType =
+            VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT;
+        physicalDeviceLayeredDriverProperties.pNext = NULL;
+
+        renderer->vkGetPhysicalDeviceProperties2KHR(
+            renderer->physicalDevice,
+            &physicalDeviceProperties);
+
+        if (physicalDeviceLayeredDriverProperties.underlyingAPI != VK_LAYERED_DRIVER_UNDERLYING_API_NONE_MSFT) {
+            return 0;
+        }
+    }
+
     renderer->vkGetPhysicalDeviceQueueFamilyProperties(
     renderer->vkGetPhysicalDeviceQueueFamilyProperties(
         physicalDevice,
         physicalDevice,
         &queueFamilyCount,
         &queueFamilyCount,