From 5ad8b496b7502db4232e68bc4ff002537aa3c6ab Mon Sep 17 00:00:00 2001 From: dpjudas Date: Fri, 26 Jan 2024 03:51:52 +0100 Subject: [PATCH] Sort drivers that emulate vulkan via a different graphics API last --- include/zvulkan/vulkaninstance.h | 1 + src/vulkanbuilders.cpp | 6 ++++++ src/vulkaninstance.cpp | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/include/zvulkan/vulkaninstance.h b/include/zvulkan/vulkaninstance.h index 8522a8a..1074ce4 100644 --- a/include/zvulkan/vulkaninstance.h +++ b/include/zvulkan/vulkaninstance.h @@ -38,6 +38,7 @@ class VulkanDeviceProperties VkPhysicalDeviceMemoryProperties Memory = {}; VkPhysicalDeviceAccelerationStructurePropertiesKHR AccelerationStructure = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ACCELERATION_STRUCTURE_PROPERTIES_KHR }; VkPhysicalDeviceDescriptorIndexingProperties DescriptorIndexing = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT }; + VkPhysicalDeviceLayeredDriverPropertiesMSFT LayeredDriver = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LAYERED_DRIVER_PROPERTIES_MSFT }; }; class VulkanPhysicalDevice diff --git a/src/vulkanbuilders.cpp b/src/vulkanbuilders.cpp index 58c425f..be18a86 100644 --- a/src/vulkanbuilders.cpp +++ b/src/vulkanbuilders.cpp @@ -1915,6 +1915,12 @@ std::vector VulkanDeviceBuilder::FindDevices(const std:: if (sortA != sortB) return sortA < sortB; + // Any driver that is emulating vulkan (i.e. via Direct3D 12) should only be chosen as the last option within each GPU type + sortA = a.Device->Properties.LayeredDriver.underlyingAPI; + sortB = b.Device->Properties.LayeredDriver.underlyingAPI; + if (sortA != sortB) + return sortA < sortB; + // Then sort by the device's unique ID so that vk_device uses a consistent order int sortUUID = memcmp(a.Device->Properties.Properties.pipelineCacheUUID, b.Device->Properties.Properties.pipelineCacheUUID, VK_UUID_SIZE); return sortUUID < 0; diff --git a/src/vulkaninstance.cpp b/src/vulkaninstance.cpp index 939dc73..0641d39 100644 --- a/src/vulkaninstance.cpp +++ b/src/vulkaninstance.cpp @@ -200,11 +200,17 @@ std::vector VulkanInstance::GetPhysicalDevices(VkInstance *next = &dev.Properties.DescriptorIndexing; next = &dev.Properties.DescriptorIndexing.pNext; } + if (checkForExtension(VK_MSFT_LAYERED_DRIVER_EXTENSION_NAME)) + { + *next = &dev.Properties.LayeredDriver; + next = &dev.Properties.LayeredDriver.pNext; + } vkGetPhysicalDeviceProperties2(dev.Device, &deviceProperties2); dev.Properties.Properties = deviceProperties2.properties; dev.Properties.AccelerationStructure.pNext = nullptr; dev.Properties.DescriptorIndexing.pNext = nullptr; + dev.Properties.LayeredDriver.pNext = nullptr; VkPhysicalDeviceFeatures2 deviceFeatures2 = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2 };