Skip to content

Commit 9814185

Browse files
committed
vulkan: Expand cases where can_get_driver_info is true
VK_KHR_driver_properties requires VK_KHR_get_physical_device_properties2 extension. For Vulkan 1.2 both extensions are core, so nothing to do, for Vulkan 1.1, the latter is core, so only need the former. For Vulkan 1.0 both extensions are required. This fixes `vulkan_driver` option in applications that ask for Vulkan 1.0 (e.g. vkcube) but that the driver does support the extra extensions. Commit 8450291 ("vulkan: Do not modify pCreateInfo in CreateDevice") previously removed this, however Vulkan spec requires those to be enabled -- even if sometimes drivers work fine with just using extensions without enabling. Vulkan Validation layers use this same approach of modifying the CreateInfo structure to ask for extra extensions.
1 parent eb7fe42 commit 9814185

1 file changed

Lines changed: 32 additions & 20 deletions

File tree

src/vulkan.cpp

Lines changed: 32 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1819,37 +1819,49 @@ static VkResult overlay_CreateDevice(
18191819
chain_info->u.pLayerInfo = chain_info->u.pLayerInfo->pNext;
18201820

18211821

1822-
std::vector<const char*> enabled_extensions(pCreateInfo->ppEnabledExtensionNames,
1823-
pCreateInfo->ppEnabledExtensionNames +
1824-
pCreateInfo->enabledExtensionCount);
1822+
VkDeviceCreateInfo modified_create_info = {};
1823+
std::vector<const char *> modified_enabled_extensions;
1824+
bool can_get_driver_info = false;
18251825

1826-
uint32_t extension_count;
1827-
1828-
instance_data->vtable.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extension_count, nullptr);
1826+
// VK_KHR_driver_properties became core in 1.2
1827+
if (instance_data->api_version >= VK_API_VERSION_1_2) {
1828+
can_get_driver_info = true;
18291829

1830-
std::vector<VkExtensionProperties> available_extensions(extension_count);
1831-
instance_data->vtable.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extension_count, available_extensions.data());
1830+
} else {
1831+
std::set<const char *> enabled_extensions(pCreateInfo->ppEnabledExtensionNames,
1832+
pCreateInfo->ppEnabledExtensionNames +
1833+
pCreateInfo->enabledExtensionCount);
18321834

1835+
uint32_t extension_count;
1836+
instance_data->vtable.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extension_count, nullptr);
18331837

1834-
bool can_get_driver_info = instance_data->api_version < VK_API_VERSION_1_1 ? false : true;
1838+
std::vector<VkExtensionProperties> available_extensions(extension_count);
1839+
instance_data->vtable.EnumerateDeviceExtensionProperties(physicalDevice, nullptr, &extension_count, available_extensions.data());
18351840

1836-
// VK_KHR_driver_properties became core in 1.2
1837-
if (instance_data->api_version < VK_API_VERSION_1_2 && can_get_driver_info) {
18381841
for (auto& extension : available_extensions) {
18391842
if (extension.extensionName == std::string(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME)) {
1840-
for (auto& enabled : enabled_extensions) {
1841-
if (enabled == std::string(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME))
1842-
goto DONT;
1843-
}
1844-
enabled_extensions.push_back(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME);
1845-
DONT:
1846-
goto FOUND;
1843+
// VK_KHR_get_physical_device_properties2 became core in 1.1
1844+
if (instance_data->api_version < VK_API_VERSION_1_1)
1845+
enabled_extensions.insert(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1846+
enabled_extensions.insert(VK_KHR_DRIVER_PROPERTIES_EXTENSION_NAME);
18471847
}
1848+
1849+
can_get_driver_info = true;
1850+
break;
1851+
}
1852+
1853+
if (can_get_driver_info && enabled_extensions.size() > pCreateInfo->enabledExtensionCount) {
1854+
modified_create_info = *pCreateInfo;
1855+
modified_enabled_extensions.assign(enabled_extensions.begin(), enabled_extensions.end());
1856+
modified_create_info.ppEnabledExtensionNames = modified_enabled_extensions.data();
1857+
modified_create_info.enabledExtensionCount = modified_enabled_extensions.size();
18481858
}
1849-
can_get_driver_info = false;
1850-
FOUND:;
18511859
}
18521860

1861+
1862+
if (modified_create_info.sType)
1863+
pCreateInfo = &modified_create_info;
1864+
18531865
VkResult result = fpCreateDevice(physicalDevice, pCreateInfo, pAllocator, pDevice);
18541866
if (result != VK_SUCCESS) return result;
18551867

0 commit comments

Comments
 (0)