Skip to content

Commit 615f375

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

27 files changed

+364
-437
lines changed

attachments/03_physical_device_selection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ class HelloTriangleApplication {
166166

167167
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
168168
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
169-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
169+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
170170

171171
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
172172
} );

attachments/04_logical_device.cpp

Lines changed: 17 additions & 14 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>
@@ -170,7 +171,7 @@ class HelloTriangleApplication {
170171

171172
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
172173
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
173-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
174+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
174175

175176
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
176177
} );
@@ -191,25 +192,27 @@ 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

197199
// 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;
200+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
201+
{}, // vk::PhysicalDeviceFeatures2
202+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
203+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
204+
};
205+
205206
// create a Device
206207
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();
211-
212-
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
208+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
209+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
210+
.queueCreateInfoCount = 1,
211+
.pQueueCreateInfos = &deviceQueueCreateInfo,
212+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
213+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
214+
215+
device = vk::raii::Device(physicalDevice, deviceCreateInfo);
213216
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );
214217
}
215218

attachments/05_window_surface.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ class HelloTriangleApplication {
181181

182182
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
183183
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
184-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
184+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
185185

186186
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
187187
} );
@@ -244,19 +244,20 @@ class HelloTriangleApplication {
244244
}
245245

246246
// query for Vulkan 1.3 features
247-
auto features = physicalDevice.getFeatures2();
248-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
249-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
250-
vulkan13Features.dynamicRendering = vk::True;
251-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
252-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
253-
features.pNext = &vulkan13Features;
247+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
248+
{}, // vk::PhysicalDeviceFeatures2
249+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
250+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
251+
};
252+
254253
// create a Device
255254
float queuePriority = 0.0f;
256-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
257-
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &features, .queueCreateInfoCount = 1, .pQueueCreateInfos = &deviceQueueCreateInfo };
258-
deviceCreateInfo.enabledExtensionCount = requiredDeviceExtension.size();
259-
deviceCreateInfo.ppEnabledExtensionNames = requiredDeviceExtension.data();
255+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
256+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
257+
.queueCreateInfoCount = 1,
258+
.pQueueCreateInfos = &deviceQueueCreateInfo,
259+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
260+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
260261

261262
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
262263
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );

attachments/06_swap_chain_creation.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ class HelloTriangleApplication {
189189

190190
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
191191
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
192-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
192+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
193193

194194
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
195195
} );
@@ -252,23 +252,20 @@ class HelloTriangleApplication {
252252
}
253253

254254
// query for Vulkan 1.3 features
255-
auto features = physicalDevice.getFeatures2();
256-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
257-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
258-
vulkan13Features.dynamicRendering = vk::True;
259-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
260-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
261-
features.pNext = &vulkan13Features;
255+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
256+
{}, // vk::PhysicalDeviceFeatures2
257+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
258+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
259+
};
260+
262261
// create a Device
263262
float queuePriority = 0.0f;
264-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
265-
vk::DeviceCreateInfo deviceCreateInfo{
266-
.pNext = &features,
267-
.queueCreateInfoCount = 1,
268-
.pQueueCreateInfos = &deviceQueueCreateInfo,
269-
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
270-
.ppEnabledExtensionNames = requiredDeviceExtension.data()
271-
};
263+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
264+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
265+
.queueCreateInfoCount = 1,
266+
.pQueueCreateInfos = &deviceQueueCreateInfo,
267+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
268+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
272269

273270
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
274271
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );

attachments/07_image_views.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ class HelloTriangleApplication {
190190

191191
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
192192
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
193-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
193+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
194194

195195
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
196196
} );
@@ -253,23 +253,20 @@ class HelloTriangleApplication {
253253
}
254254

255255
// query for Vulkan 1.3 features
256-
auto features = physicalDevice.getFeatures2();
257-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
258-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
259-
vulkan13Features.dynamicRendering = vk::True;
260-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
261-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
262-
features.pNext = &vulkan13Features;
256+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
257+
{}, // vk::PhysicalDeviceFeatures2
258+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
259+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
260+
};
261+
263262
// create a Device
264263
float queuePriority = 0.0f;
265-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
266-
vk::DeviceCreateInfo deviceCreateInfo{
267-
.pNext = &features,
268-
.queueCreateInfoCount = 1,
269-
.pQueueCreateInfos = &deviceQueueCreateInfo,
270-
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
271-
.ppEnabledExtensionNames = requiredDeviceExtension.data()
272-
};
264+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
265+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
266+
.queueCreateInfoCount = 1,
267+
.pQueueCreateInfos = &deviceQueueCreateInfo,
268+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
269+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
273270

274271
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
275272
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );

attachments/08_graphics_pipeline.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@ class HelloTriangleApplication {
191191

192192
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
193193
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
194-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
194+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
195195

196196
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
197197
} );
@@ -254,23 +254,20 @@ class HelloTriangleApplication {
254254
}
255255

256256
// query for Vulkan 1.3 features
257-
auto features = physicalDevice.getFeatures2();
258-
vk::PhysicalDeviceVulkan13Features vulkan13Features;
259-
vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT extendedDynamicStateFeatures;
260-
vulkan13Features.dynamicRendering = vk::True;
261-
extendedDynamicStateFeatures.extendedDynamicState = vk::True;
262-
vulkan13Features.pNext = &extendedDynamicStateFeatures;
263-
features.pNext = &vulkan13Features;
257+
vk::StructureChain<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT> featureChain = {
258+
{}, // vk::PhysicalDeviceFeatures2
259+
{.dynamicRendering = true }, // vk::PhysicalDeviceVulkan13Features
260+
{.extendedDynamicState = true } // vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT
261+
};
262+
264263
// create a Device
265264
float queuePriority = 0.0f;
266-
vk::DeviceQueueCreateInfo deviceQueueCreateInfo { .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
267-
vk::DeviceCreateInfo deviceCreateInfo{
268-
.pNext = &features,
269-
.queueCreateInfoCount = 1,
270-
.pQueueCreateInfos = &deviceQueueCreateInfo,
271-
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
272-
.ppEnabledExtensionNames = requiredDeviceExtension.data()
273-
};
265+
vk::DeviceQueueCreateInfo deviceQueueCreateInfo{ .queueFamilyIndex = graphicsIndex, .queueCount = 1, .pQueuePriorities = &queuePriority };
266+
vk::DeviceCreateInfo deviceCreateInfo{ .pNext = &featureChain.get<vk::PhysicalDeviceFeatures2>(),
267+
.queueCreateInfoCount = 1,
268+
.pQueueCreateInfos = &deviceQueueCreateInfo,
269+
.enabledExtensionCount = static_cast<uint32_t>(requiredDeviceExtension.size()),
270+
.ppEnabledExtensionNames = requiredDeviceExtension.data() };
274271

275272
device = vk::raii::Device( physicalDevice, deviceCreateInfo );
276273
graphicsQueue = vk::raii::Queue( device, graphicsIndex, 0 );

0 commit comments

Comments
 (0)