Vulkan: Make Maintenance4 Extension Optional

`VK_KHR_maintenance4` extension is core in Vulkan 1.3. As Blender
should support Vulkan 1.2 we should not enable this extension when
it isn't available.This fixes issue to run Vulkan backend on some
platforms (Intel Iris Plus).

Maintenance4 is used to relax the interface matching rules to allow
a larger output vector to match with a smaller input vector, with
additional values being discarded.

When Maintenance4 isn't enabled a few shaders might run a tiny bit
slower as it triggers a performance notice. Users won't notice the
performance slowdown.

Pull Request: https://projects.blender.org/blender/blender/pulls/113239
This commit is contained in:
Jeroen Bakker 2023-10-05 13:40:28 +02:00
parent 8860dc9910
commit 6e18bb4e3e
1 changed files with 11 additions and 8 deletions

View File

@ -179,7 +179,7 @@ class GHOST_DeviceVK {
}
}
bool extensions_support(const vector<const char *> &required_extensions)
bool has_extensions(const vector<const char *> &required_extensions)
{
uint32_t ext_count;
vkEnumerateDeviceExtensionProperties(physical_device, nullptr, &ext_count, nullptr);
@ -238,18 +238,23 @@ class GHOST_DeviceVK {
VkPhysicalDeviceMaintenance4FeaturesKHR maintenance_4 = {};
maintenance_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR;
maintenance_4.pNext = &device_12_features;
maintenance_4.maintenance4 = VK_TRUE;
/* Mainenance4 is core in Vulkan 1.3 so we need to query for availability. */
if (has_extensions({VK_KHR_MAINTENANCE_4_EXTENSION_NAME})) {
maintenance_4.pNext = device_12_features.pNext;
device_12_features.pNext = &maintenance_4;
}
/* Enable shader draw parameters on logical device when supported on physical device. */
VkPhysicalDeviceShaderDrawParametersFeatures shader_draw_parameters = {};
shader_draw_parameters.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES;
shader_draw_parameters.shaderDrawParameters = features_11.shaderDrawParameters;
shader_draw_parameters.pNext = &maintenance_4;
shader_draw_parameters.pNext = device_12_features.pNext;
device_12_features.pNext = &shader_draw_parameters;
VkDeviceCreateInfo device_create_info = {};
device_create_info.pNext = &shader_draw_parameters;
device_create_info.pNext = &device_12_features;
device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_create_info.queueCreateInfoCount = uint32_t(queue_create_infos.size());
device_create_info.pQueueCreateInfos = queue_create_infos.data();
@ -320,7 +325,7 @@ static GHOST_TSuccess ensure_vulkan_device(VkInstance vk_instance,
for (const auto &physical_device : physical_devices) {
GHOST_DeviceVK device_vk(vk_instance, physical_device);
if (!device_vk.extensions_support(required_extensions)) {
if (!device_vk.has_extensions(required_extensions)) {
continue;
}
@ -950,8 +955,6 @@ GHOST_TSuccess GHOST_ContextVK::initializeDrawingContext()
}
extensions_device.push_back("VK_KHR_dedicated_allocation");
extensions_device.push_back("VK_KHR_get_memory_requirements2");
/* Allow relaxed interface matching between shader stages. */
extensions_device.push_back("VK_KHR_maintenance4");
/* Enable MoltenVK required instance extensions. */
#ifdef VK_MVK_MOLTENVK_EXTENSION_NAME
requireExtension(
@ -1042,7 +1045,7 @@ GHOST_TSuccess GHOST_ContextVK::initializeDrawingContext()
/* According to the Vulkan specs, when `VK_KHR_portability_subset` is available it should be
* enabled. See
* https://vulkan.lunarg.com/doc/view/1.2.198.1/mac/1.2-extensions/vkspec.html#VUID-VkDeviceCreateInfo-pProperties-04451*/
if (vulkan_device->extensions_support({VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME})) {
if (vulkan_device->has_extensions({VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME})) {
extensions_device.push_back(VK_KHR_PORTABILITY_SUBSET_EXTENSION_NAME);
}
#endif