diff --git a/intern/ghost/intern/GHOST_ContextVK.cc b/intern/ghost/intern/GHOST_ContextVK.cc index ec404493adc..4def990fed0 100644 --- a/intern/ghost/intern/GHOST_ContextVK.cc +++ b/intern/ghost/intern/GHOST_ContextVK.cc @@ -179,7 +179,7 @@ class GHOST_DeviceVK { } } - bool extensions_support(const vector &required_extensions) + bool has_extensions(const vector &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