Skip to content

Commit d1a6f35

Browse files
committed
Use of vk::StructureChain on device creation.
1 parent e3e20c4 commit d1a6f35

File tree

1 file changed

+33
-12
lines changed

1 file changed

+33
-12
lines changed

attachments/04_logical_device.cpp

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#include <assert.h>
12
#include <iostream>
23
#include <stdexcept>
34
#include <vector>
@@ -191,25 +192,45 @@ class HelloTriangleApplication {
191192
// get the first index into queueFamilyProperties which supports graphics
192193
auto graphicsQueueFamilyProperty = std::ranges::find_if( queueFamilyProperties, []( auto const & qfp )
193194
{ return (qfp.queueFlags & vk::QueueFlagBits::eGraphics) != static_cast<vk::QueueFlags>(0); } );
195+
assert(graphicsQueueFamilyProperty != queueFamilyProperties.end() && "No graphics queue family found!");
194196

195197
auto graphicsIndex = static_cast<uint32_t>( std::distance( queueFamilyProperties.begin(), graphicsQueueFamilyProperty ) );
196198

199+
#if 1
197200
// query for Vulkan 1.3 features
198-
auto features = physicalDevice.getFeatures2();
199-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
200-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
201-
vulkan13Features.dynamicRendering = vk::True;
202-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
203-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
204-
features.pNext = &vulkan13Features;
201+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
202+
{}, // vk::PhysicalDeviceFeatures2
203+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
204+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
205+
};
206+
205207
// create a Device
206208
float queuePriority = 0.0f;
207-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
208-
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo };
209-
deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size();
210-
deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data();
209+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
210+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
211+
.queueCreateInfoCount = 1,
212+
.pQueueCreateInfos = &deviceQueueCreateInfo,
213+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
214+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
215+
216+
device = vk::raii::Device(physicalDevice, deviceCreateInfo);
217+
#else
218+
// create a Device, querying for Vulkan 1.3 features
219+
float queuePriority = 0.0f;
220+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
221+
vk::StructureChain<vk::DeviceCreateInfo, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>
222+
createInfoChain = {
223+
{.queueCreateInfoCount = 1,
224+
.pQueueCreateInfos = &deviceQueueCreateInfo,
225+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
226+
.ppEnabledExtensionNames = requiredDeviceExtension.data() }, // vk::DeviceCreateInfo
227+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
228+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
229+
};
230+
231+
device = vk::raii::Device(physicalDevice, createInfoChain.get<vk::DeviceCreateInfo>());
232+
#endif
211233

212-
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
213234
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );
214235
}
215236

0 commit comments

Comments
 (0)