From 615f375e3bb83c9925bdec2677283775868776bd Mon Sep 17 00:00:00 2001 From: asuessenbach Date: Mon, 7 Jul 2025 17:25:33 +0200 Subject: [PATCH] Use of vk::StructureChain on device creation. --- attachments/03_physical_device_selection.cpp | 2 +- attachments/04_logical_device.cpp | 31 +++++++------ attachments/05_window_surface.cpp | 25 +++++----- attachments/06_swap_chain_creation.cpp | 29 ++++++------ attachments/07_image_views.cpp | 29 ++++++------ attachments/08_graphics_pipeline.cpp | 29 ++++++------ attachments/09_shader_modules.cpp | 29 ++++++------ attachments/10_fixed_functions.cpp | 29 ++++++------ attachments/12_graphics_pipeline_complete.cpp | 29 ++++++------ attachments/14_command_buffers.cpp | 29 ++++++------ attachments/15_hello_triangle.cpp | 30 ++++++------ attachments/16_frames_in_flight.cpp | 30 ++++++------ attachments/17_swap_chain_recreation.cpp | 30 ++++++------ attachments/18_vertex_input.cpp | 30 ++++++------ attachments/19_vertex_buffer.cpp | 30 ++++++------ attachments/20_staging_buffer.cpp | 30 ++++++------ attachments/21_index_buffer.cpp | 30 ++++++------ attachments/22_descriptor_layout.cpp | 30 ++++++------ attachments/23_descriptor_sets.cpp | 30 ++++++------ attachments/24_texture_image.cpp | 30 ++++++------ attachments/25_sampler.cpp | 33 ++++++------- attachments/26_texture_mapping.cpp | 33 ++++++------- attachments/27_depth_buffering.cpp | 33 ++++++------- attachments/28_model_loading.cpp | 33 ++++++------- attachments/29_mipmapping.cpp | 31 ++++++------- attachments/30_multisampling.cpp | 31 ++++++------- attachments/31_compute_shader.cpp | 46 ++++++++++--------- 27 files changed, 364 insertions(+), 437 deletions(-) diff --git a/attachments/03_physical_device_selection.cpp b/attachments/03_physical_device_selection.cpp index 5e1bed52..ff79a64b 100644 --- a/attachments/03_physical_device_selection.cpp +++ b/attachments/03_physical_device_selection.cpp @@ -166,7 +166,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); diff --git a/attachments/04_logical_device.cpp b/attachments/04_logical_device.cpp index 6fba2f6b..d4541515 100644 --- a/attachments/04_logical_device.cpp +++ b/attachments/04_logical_device.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -170,7 +171,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -191,25 +192,27 @@ class HelloTriangleApplication { // get the first index into queueFamilyProperties which supports graphics auto graphicsQueueFamilyProperty = std::ranges::find_if( queueFamilyProperties, []( auto const & qfp ) { return (qfp.queueFlags & vk::QueueFlagBits::eGraphics) != static_cast(0); } ); + assert(graphicsQueueFamilyProperty != queueFamilyProperties.end() && "No graphics queue family found!"); auto graphicsIndex = static_cast( std::distance( queueFamilyProperties.begin(), graphicsQueueFamilyProperty ) ); // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo }; - deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size(); - deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data(); - - device = vk::raii::Device( physicalDevice, deviceCreateInfo ); + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; + + device = vk::raii::Device(physicalDevice, deviceCreateInfo); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); } diff --git a/attachments/05_window_surface.cpp b/attachments/05_window_surface.cpp index 98c26ee7..66e2f1a3 100644 --- a/attachments/05_window_surface.cpp +++ b/attachments/05_window_surface.cpp @@ -181,7 +181,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -244,19 +244,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo }; - deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size(); - deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data(); + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/06_swap_chain_creation.cpp b/attachments/06_swap_chain_creation.cpp index 8883dfa2..2c08953d 100644 --- a/attachments/06_swap_chain_creation.cpp +++ b/attachments/06_swap_chain_creation.cpp @@ -189,7 +189,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -252,23 +252,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/07_image_views.cpp b/attachments/07_image_views.cpp index 1efb4e70..a53c7a31 100644 --- a/attachments/07_image_views.cpp +++ b/attachments/07_image_views.cpp @@ -190,7 +190,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -253,23 +253,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/08_graphics_pipeline.cpp b/attachments/08_graphics_pipeline.cpp index af9f2115..d12dfa4e 100644 --- a/attachments/08_graphics_pipeline.cpp +++ b/attachments/08_graphics_pipeline.cpp @@ -191,7 +191,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -254,23 +254,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/09_shader_modules.cpp b/attachments/09_shader_modules.cpp index d53cd386..3ecfa346 100644 --- a/attachments/09_shader_modules.cpp +++ b/attachments/09_shader_modules.cpp @@ -192,7 +192,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -255,23 +255,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/10_fixed_functions.cpp b/attachments/10_fixed_functions.cpp index 770a89a2..5e3d4199 100644 --- a/attachments/10_fixed_functions.cpp +++ b/attachments/10_fixed_functions.cpp @@ -194,7 +194,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -257,23 +257,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/12_graphics_pipeline_complete.cpp b/attachments/12_graphics_pipeline_complete.cpp index f1d52aca..fa170645 100644 --- a/attachments/12_graphics_pipeline_complete.cpp +++ b/attachments/12_graphics_pipeline_complete.cpp @@ -195,7 +195,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -258,23 +258,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/14_command_buffers.cpp b/attachments/14_command_buffers.cpp index bbb03030..c8e6f19b 100644 --- a/attachments/14_command_buffers.cpp +++ b/attachments/14_command_buffers.cpp @@ -200,7 +200,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -263,23 +263,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/15_hello_triangle.cpp b/attachments/15_hello_triangle.cpp index 1ed9e016..17d6d470 100644 --- a/attachments/15_hello_triangle.cpp +++ b/attachments/15_hello_triangle.cpp @@ -209,7 +209,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -272,24 +272,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/16_frames_in_flight.cpp b/attachments/16_frames_in_flight.cpp index 74fdfa31..6b9205ec 100644 --- a/attachments/16_frames_in_flight.cpp +++ b/attachments/16_frames_in_flight.cpp @@ -213,7 +213,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -276,24 +276,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/17_swap_chain_recreation.cpp b/attachments/17_swap_chain_recreation.cpp index 4173328d..6fc44e8c 100644 --- a/attachments/17_swap_chain_recreation.cpp +++ b/attachments/17_swap_chain_recreation.cpp @@ -239,7 +239,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -302,24 +302,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/18_vertex_input.cpp b/attachments/18_vertex_input.cpp index d98ec2d0..d95088b2 100644 --- a/attachments/18_vertex_input.cpp +++ b/attachments/18_vertex_input.cpp @@ -263,7 +263,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -326,24 +326,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/19_vertex_buffer.cpp b/attachments/19_vertex_buffer.cpp index 4db14738..f8d9dd30 100644 --- a/attachments/19_vertex_buffer.cpp +++ b/attachments/19_vertex_buffer.cpp @@ -267,7 +267,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -330,24 +330,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/20_staging_buffer.cpp b/attachments/20_staging_buffer.cpp index 18424153..e684acd8 100644 --- a/attachments/20_staging_buffer.cpp +++ b/attachments/20_staging_buffer.cpp @@ -267,7 +267,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -330,24 +330,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/21_index_buffer.cpp b/attachments/21_index_buffer.cpp index b1e2eee1..0f21c751 100644 --- a/attachments/21_index_buffer.cpp +++ b/attachments/21_index_buffer.cpp @@ -276,7 +276,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -339,24 +339,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/22_descriptor_layout.cpp b/attachments/22_descriptor_layout.cpp index 6c2a0bae..feae9fe2 100644 --- a/attachments/22_descriptor_layout.cpp +++ b/attachments/22_descriptor_layout.cpp @@ -292,7 +292,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -355,24 +355,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/23_descriptor_sets.cpp b/attachments/23_descriptor_sets.cpp index 5ed74fe4..68cc9521 100644 --- a/attachments/23_descriptor_sets.cpp +++ b/attachments/23_descriptor_sets.cpp @@ -297,7 +297,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -360,24 +360,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/24_texture_image.cpp b/attachments/24_texture_image.cpp index 4b3a9da9..5a839da8 100644 --- a/attachments/24_texture_image.cpp +++ b/attachments/24_texture_image.cpp @@ -304,7 +304,7 @@ class HelloTriangleApplication { auto features = device.template getFeatures2(); bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -367,24 +367,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {}, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/25_sampler.cpp b/attachments/25_sampler.cpp index 8b2941a8..0d6ac541 100644 --- a/attachments/25_sampler.cpp +++ b/attachments/25_sampler.cpp @@ -307,8 +307,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -371,24 +372,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/26_texture_mapping.cpp b/attachments/26_texture_mapping.cpp index d181a1c4..f6fde51f 100644 --- a/attachments/26_texture_mapping.cpp +++ b/attachments/26_texture_mapping.cpp @@ -309,8 +309,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -373,24 +374,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/27_depth_buffering.cpp b/attachments/27_depth_buffering.cpp index 6cadd0ac..6db0b0f4 100644 --- a/attachments/27_depth_buffering.cpp +++ b/attachments/27_depth_buffering.cpp @@ -322,8 +322,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -386,24 +387,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/28_model_loading.cpp b/attachments/28_model_loading.cpp index 337941a4..d67b9d37 100644 --- a/attachments/28_model_loading.cpp +++ b/attachments/28_model_loading.cpp @@ -326,8 +326,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; } ); @@ -390,24 +391,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; - vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/29_mipmapping.cpp b/attachments/29_mipmapping.cpp index a7c1d7cd..a5212957 100644 --- a/attachments/29_mipmapping.cpp +++ b/attachments/29_mipmapping.cpp @@ -326,8 +326,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; }); @@ -390,24 +391,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/30_multisampling.cpp b/attachments/30_multisampling.cpp index 9bd36d87..25c3a8b3 100644 --- a/attachments/30_multisampling.cpp +++ b/attachments/30_multisampling.cpp @@ -335,8 +335,9 @@ class HelloTriangleApplication { } ); auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; }); @@ -399,24 +400,20 @@ class HelloTriangleApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + }; + // create a Device float queuePriority = 0.0f; vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 ); diff --git a/attachments/31_compute_shader.cpp b/attachments/31_compute_shader.cpp index e00243d3..c52979e5 100644 --- a/attachments/31_compute_shader.cpp +++ b/attachments/31_compute_shader.cpp @@ -304,9 +304,14 @@ class ComputeShaderApplication { { return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } ); } ); - auto features = device.template getFeatures2(); - bool supportsRequiredFeatures = features.template get().dynamicRendering && - features.template get().extendedDynamicState; + auto features = device.template getFeatures2(); + bool supportsRequiredFeatures = features.template get().features.samplerAnisotropy && + features.template get().dynamicRendering && + features.template get().extendedDynamicState && + features.template get().timelineSemaphore; return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures; }); @@ -369,28 +374,25 @@ class ComputeShaderApplication { } // query for Vulkan 1.3 features - auto features = physicalDevice.getFeatures2(); - features.features.samplerAnisotropy = vk::True; - vk::PhysicalDeviceVulkan13Features vulkan13Features; - vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures; - vk::PhysicalDeviceTimelineSemaphoreFeaturesKHR timelineSemaphoreFeatures; - timelineSemaphoreFeatures.timelineSemaphore = vk::True; - vulkan13Features.dynamicRendering = vk::True; - vulkan13Features.synchronization2 = vk::True; - extendedDynamicStateFeatures.extendedDynamicState = vk::True; - extendedDynamicStateFeatures.pNext = &timelineSemaphoreFeatures; - vulkan13Features.pNext = &extendedDynamicStateFeatures; - features.pNext = &vulkan13Features; + vk::StructureChain + featureChain = { + {.features = {.samplerAnisotropy = true } }, // vk::PhysicalDeviceFeatures2 + {.synchronization2 = true, .dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features + {.extendedDynamicState = true }, // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT + {.timelineSemaphore = true } // vk::PhysicalDeviceTimelineSemaphoreFeaturesKHR + }; + // create a Device float queuePriority = 0.0f; vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsAndComputeIndex, .queueCount = 1, .pQueuePriorities = &queuePriority }; - vk::DeviceCreateInfo deviceCreateInfo{ - .pNext = &features, - .queueCreateInfoCount = 1, - .pQueueCreateInfos = &deviceQueueCreateInfo, - .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), - .ppEnabledExtensionNames = requiredDeviceExtension.data() - }; + vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get(), + .queueCreateInfoCount = 1, + .pQueueCreateInfos = &deviceQueueCreateInfo, + .enabledExtensionCount = static_cast(requiredDeviceExtension.size()), + .ppEnabledExtensionNames = requiredDeviceExtension.data() }; device = vk::raii::Device( physicalDevice, deviceCreateInfo ); graphicsQueue = vk::raii::Queue( device, graphicsAndComputeIndex, 0 );