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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user