Cleanup: Vulkan: Feature chain

In stead of keeping track of a local variable this PR will keep a list
of all feature structs and at the end populate the pNext.

Pull Request: https://projects.blender.org/blender/blender/pulls/139092
This commit is contained in:
Jeroen Bakker
2025-05-19 15:45:50 +02:00
parent e87f744134
commit 808ba086f1

View File

@@ -257,14 +257,13 @@ class GHOST_DeviceVK {
device_create_info.ppEnabledExtensionNames = device_extensions.data();
device_create_info.pEnabledFeatures = &device_features;
void *device_create_info_p_next = nullptr;
std::vector<void *> feature_struct_ptr;
/* Enable vulkan 11 features when supported on physical device. */
VkPhysicalDeviceVulkan11Features vulkan_11_features = {};
vulkan_11_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
vulkan_11_features.pNext = device_create_info_p_next;
vulkan_11_features.shaderDrawParameters = features_11.shaderDrawParameters;
device_create_info_p_next = &vulkan_11_features;
feature_struct_ptr.push_back(&vulkan_11_features);
/* Enable optional vulkan 12 features when supported on physical device. */
VkPhysicalDeviceVulkan12Features vulkan_12_features = {};
@@ -272,24 +271,21 @@ class GHOST_DeviceVK {
vulkan_12_features.shaderOutputLayer = features_12.shaderOutputLayer;
vulkan_12_features.shaderOutputViewportIndex = features_12.shaderOutputViewportIndex;
vulkan_12_features.timelineSemaphore = VK_TRUE;
vulkan_12_features.pNext = device_create_info_p_next;
device_create_info_p_next = &vulkan_12_features;
feature_struct_ptr.push_back(&vulkan_12_features);
/* Enable provoking vertex. */
VkPhysicalDeviceProvokingVertexFeaturesEXT provoking_vertex_features = {};
provoking_vertex_features.sType =
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROVOKING_VERTEX_FEATURES_EXT;
provoking_vertex_features.provokingVertexLast = VK_TRUE;
provoking_vertex_features.pNext = device_create_info_p_next;
device_create_info_p_next = &provoking_vertex_features;
feature_struct_ptr.push_back(&provoking_vertex_features);
/* Enable dynamic rendering. */
VkPhysicalDeviceDynamicRenderingFeatures dynamic_rendering = {};
dynamic_rendering.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_FEATURES;
dynamic_rendering.dynamicRendering = VK_TRUE;
if (has_extensions({VK_KHR_DYNAMIC_RENDERING_EXTENSION_NAME})) {
dynamic_rendering.pNext = device_create_info_p_next;
device_create_info_p_next = &dynamic_rendering;
feature_struct_ptr.push_back(&dynamic_rendering);
}
VkPhysicalDeviceDynamicRenderingUnusedAttachmentsFeaturesEXT
@@ -298,8 +294,7 @@ class GHOST_DeviceVK {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_FEATURES_EXT;
dynamic_rendering_unused_attachments.dynamicRenderingUnusedAttachments = VK_TRUE;
if (has_extensions({VK_EXT_DYNAMIC_RENDERING_UNUSED_ATTACHMENTS_EXTENSION_NAME})) {
dynamic_rendering_unused_attachments.pNext = device_create_info_p_next;
device_create_info_p_next = &dynamic_rendering_unused_attachments;
feature_struct_ptr.push_back(&dynamic_rendering_unused_attachments);
}
VkPhysicalDeviceDynamicRenderingLocalReadFeaturesKHR dynamic_rendering_local_read = {};
@@ -307,8 +302,7 @@ class GHOST_DeviceVK {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DYNAMIC_RENDERING_LOCAL_READ_FEATURES_KHR;
dynamic_rendering_local_read.dynamicRenderingLocalRead = VK_TRUE;
if (has_extensions({VK_KHR_DYNAMIC_RENDERING_LOCAL_READ_EXTENSION_NAME})) {
dynamic_rendering_local_read.pNext = device_create_info_p_next;
device_create_info_p_next = &dynamic_rendering_local_read;
feature_struct_ptr.push_back(&dynamic_rendering_local_read);
}
/* VK_EXT_robustness2 */
@@ -316,8 +310,7 @@ class GHOST_DeviceVK {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT};
if (has_extensions({VK_EXT_ROBUSTNESS_2_EXTENSION_NAME})) {
robustness_2_features.nullDescriptor = features_robustness2.nullDescriptor;
robustness_2_features.pNext = device_create_info_p_next;
device_create_info_p_next = &robustness_2_features;
feature_struct_ptr.push_back(&robustness_2_features);
}
/* Query for Mainenance4 (core in Vulkan 1.3). */
@@ -325,16 +318,14 @@ class GHOST_DeviceVK {
maintenance_4.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR;
maintenance_4.maintenance4 = VK_TRUE;
if (has_extensions({VK_KHR_MAINTENANCE_4_EXTENSION_NAME})) {
maintenance_4.pNext = device_create_info_p_next;
device_create_info_p_next = &maintenance_4;
feature_struct_ptr.push_back(&maintenance_4);
}
/* Swap-chain maintenance 1 is optional. */
VkPhysicalDeviceSwapchainMaintenance1FeaturesEXT swapchain_maintenance_1 = {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SWAPCHAIN_MAINTENANCE_1_FEATURES_EXT, nullptr, VK_TRUE};
if (extension_requested(VK_EXT_SWAPCHAIN_MAINTENANCE_1_EXTENSION_NAME)) {
swapchain_maintenance_1.pNext = device_create_info_p_next;
device_create_info_p_next = &swapchain_maintenance_1;
feature_struct_ptr.push_back(&swapchain_maintenance_1);
use_vk_ext_swapchain_maintenance_1 = true;
}
@@ -344,11 +335,16 @@ class GHOST_DeviceVK {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR;
fragment_shader_barycentric.fragmentShaderBarycentric = VK_TRUE;
if (has_extensions({VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME})) {
fragment_shader_barycentric.pNext = device_create_info_p_next;
device_create_info_p_next = &fragment_shader_barycentric;
feature_struct_ptr.push_back(&fragment_shader_barycentric);
}
device_create_info.pNext = device_create_info_p_next;
/* Link all registered feature structs. */
for (int i = 1; i < feature_struct_ptr.size(); i++) {
((VkBaseInStructure *)(feature_struct_ptr[i - 1]))->pNext =
(VkBaseInStructure *)(feature_struct_ptr[i]);
}
device_create_info.pNext = feature_struct_ptr[0];
vkCreateDevice(physical_device, &device_create_info, nullptr, &device);
}