Skip to content

Commit 41e6312

Browse files
committed
Adjust docu and source of 03_physical_device_selection
1 parent e9054a2 commit 41e6312

34 files changed

Lines changed: 1466 additions & 1359 deletions

attachments/03_physical_device_selection.cpp

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -151,42 +151,45 @@ class HelloTriangleApplication
151151

152152
void pickPhysicalDevice()
153153
{
154-
std::vector<vk::raii::PhysicalDevice> devices = instance.enumeratePhysicalDevices();
155-
const auto devIter = std::ranges::find_if(
156-
devices,
157-
[&](auto const &device) {
158-
// Check if the device supports the Vulkan 1.3 API version
159-
bool supportsVulkan1_3 = device.getProperties().apiVersion >= VK_API_VERSION_1_3;
160-
161-
// Check if any of the queue families support graphics operations
162-
auto queueFamilies = device.getQueueFamilyProperties();
163-
bool supportsGraphics =
164-
std::ranges::any_of(queueFamilies, [](auto const &qfp) { return !!(qfp.queueFlags & vk::QueueFlagBits::eGraphics); });
165-
166-
// Check if all required device extensions are available
167-
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
168-
bool supportsAllRequiredExtensions =
169-
std::ranges::all_of(requiredDeviceExtension,
170-
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
171-
return std::ranges::any_of(availableDeviceExtensions,
172-
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
173-
});
174-
175-
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
176-
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
177-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
178-
179-
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
180-
});
181-
if (devIter != devices.end())
182-
{
183-
physicalDevice = *devIter;
184-
}
185-
else
186-
{
187-
throw std::runtime_error("failed to find a suitable GPU!");
188-
}
189-
}
154+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
155+
auto const devIter = std::ranges::find_if(
156+
physicalDevices,
157+
[&]( auto const & physicalDevice )
158+
{
159+
// Check if the physicalDevice supports the Vulkan 1.3 API version
160+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
161+
162+
// Check if any of the queue families support graphics operations
163+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
164+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
165+
166+
// Check if all required physicalDevice extensions are available
167+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
168+
bool supportsAllRequiredExtensions =
169+
std::ranges::all_of( requiredDeviceExtension,
170+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
171+
{
172+
return std::ranges::any_of( availableDeviceExtensions,
173+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
174+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
175+
} );
176+
177+
// Check if the physicalDevice supports the required features (dynamic rendering and extended dynamic state)
178+
auto features =
179+
physicalDevice
180+
.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
181+
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
182+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
183+
184+
// Return true if the physicalDevice meets all the criteria
185+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
186+
} );
187+
if ( devIter == physicalDevices.end() )
188+
{
189+
throw std::runtime_error( "failed to find a suitable GPU!" );
190+
}
191+
physicalDevice = *devIter;
192+
}
190193

191194
std::vector<const char *> getRequiredInstanceExtensions()
192195
{

attachments/04_logical_device.cpp

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -156,41 +156,41 @@ class HelloTriangleApplication
156156

157157
void pickPhysicalDevice()
158158
{
159-
std::vector<vk::raii::PhysicalDevice> devices = instance.enumeratePhysicalDevices();
160-
const auto devIter = std::ranges::find_if(
161-
devices,
162-
[&](auto const &device) {
163-
// Check if the device supports the Vulkan 1.3 API version
164-
bool supportsVulkan1_3 = device.getProperties().apiVersion >= VK_API_VERSION_1_3;
159+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
160+
auto const devIter = std::ranges::find_if(
161+
physicalDevices,
162+
[&](auto const &physicalDevice) {
163+
// Check if the physicalDevice supports the Vulkan 1.3 API version
164+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
165165

166166
// Check if any of the queue families support graphics operations
167-
auto queueFamilies = device.getQueueFamilyProperties();
168-
bool supportsGraphics =
169-
std::ranges::any_of(queueFamilies, [](auto const &qfp) { return !!(qfp.queueFlags & vk::QueueFlagBits::eGraphics); });
167+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
168+
bool supportsGraphics = std::ranges::any_of(queueFamilies, [](auto const &qfp) { return !!(qfp.queueFlags & vk::QueueFlagBits::eGraphics); });
170169

171-
// Check if all required device extensions are available
172-
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
170+
// Check if all required physicalDevice extensions are available
171+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
173172
bool supportsAllRequiredExtensions =
174173
std::ranges::all_of(requiredDeviceExtension,
175-
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
174+
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
176175
return std::ranges::any_of(availableDeviceExtensions,
177-
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
176+
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
178177
});
179178

180-
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
179+
// Check if the physicalDevice supports the required features (dynamic rendering and extended dynamic state)
180+
auto features =
181+
physicalDevice
182+
.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
181183
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
182184
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
183185

186+
// Return true if the physicalDevice meets all the criteria
184187
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
185188
});
186-
if (devIter != devices.end())
187-
{
188-
physicalDevice = *devIter;
189-
}
190-
else
189+
if (devIter == physicalDevices.end())
191190
{
192191
throw std::runtime_error("failed to find a suitable GPU!");
193192
}
193+
physicalDevice = *devIter;
194194
}
195195

196196
void createLogicalDevice()

attachments/05_window_surface.cpp

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -164,42 +164,45 @@ class HelloTriangleApplication
164164

165165
void pickPhysicalDevice()
166166
{
167-
std::vector<vk::raii::PhysicalDevice> devices = instance.enumeratePhysicalDevices();
168-
const auto devIter = std::ranges::find_if(
169-
devices,
170-
[&](auto const &device) {
171-
// Check if the device supports the Vulkan 1.3 API version
172-
bool supportsVulkan1_3 = device.getProperties().apiVersion >= VK_API_VERSION_1_3;
173-
174-
// Check if any of the queue families support graphics operations
175-
auto queueFamilies = device.getQueueFamilyProperties();
176-
bool supportsGraphics =
177-
std::ranges::any_of(queueFamilies, [](auto const &qfp) { return !!(qfp.queueFlags & vk::QueueFlagBits::eGraphics); });
178-
179-
// Check if all required device extensions are available
180-
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
181-
bool supportsAllRequiredExtensions =
182-
std::ranges::all_of(requiredDeviceExtension,
183-
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
184-
return std::ranges::any_of(availableDeviceExtensions,
185-
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
186-
});
187-
188-
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
189-
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
190-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
191-
192-
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
193-
});
194-
if (devIter != devices.end())
195-
{
196-
physicalDevice = *devIter;
197-
}
198-
else
199-
{
200-
throw std::runtime_error("failed to find a suitable GPU!");
201-
}
202-
}
167+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
168+
auto const devIter = std::ranges::find_if(
169+
physicalDevices,
170+
[&]( auto const & physicalDevice )
171+
{
172+
// Check if the physicalDevice supports the Vulkan 1.3 API version
173+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
174+
175+
// Check if any of the queue families support graphics operations
176+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
177+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
178+
179+
// Check if all required physicalDevice extensions are available
180+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
181+
bool supportsAllRequiredExtensions =
182+
std::ranges::all_of( requiredDeviceExtension,
183+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
184+
{
185+
return std::ranges::any_of( availableDeviceExtensions,
186+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
187+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
188+
} );
189+
190+
// Check if the physicalDevice supports the required features (dynamic rendering and extended dynamic state)
191+
auto features =
192+
physicalDevice
193+
.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
194+
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
195+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
196+
197+
// Return true if the physicalDevice meets all the criteria
198+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
199+
} );
200+
if ( devIter == physicalDevices.end() )
201+
{
202+
throw std::runtime_error( "failed to find a suitable GPU!" );
203+
}
204+
physicalDevice = *devIter;
205+
}
203206

204207
void createLogicalDevice()
205208
{

attachments/06_swap_chain_creation.cpp

Lines changed: 39 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -172,42 +172,45 @@ class HelloTriangleApplication
172172

173173
void pickPhysicalDevice()
174174
{
175-
std::vector<vk::raii::PhysicalDevice> devices = instance.enumeratePhysicalDevices();
176-
const auto devIter = std::ranges::find_if(
177-
devices,
178-
[&](auto const &device) {
179-
// Check if the device supports the Vulkan 1.3 API version
180-
bool supportsVulkan1_3 = device.getProperties().apiVersion >= VK_API_VERSION_1_3;
181-
182-
// Check if any of the queue families support graphics operations
183-
auto queueFamilies = device.getQueueFamilyProperties();
184-
bool supportsGraphics =
185-
std::ranges::any_of(queueFamilies, [](auto const &qfp) { return !!(qfp.queueFlags & vk::QueueFlagBits::eGraphics); });
186-
187-
// Check if all required device extensions are available
188-
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
189-
bool supportsAllRequiredExtensions =
190-
std::ranges::all_of(requiredDeviceExtension,
191-
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
192-
return std::ranges::any_of(availableDeviceExtensions,
193-
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
194-
});
195-
196-
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
197-
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
198-
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
199-
200-
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
201-
});
202-
if (devIter != devices.end())
203-
{
204-
physicalDevice = *devIter;
205-
}
206-
else
207-
{
208-
throw std::runtime_error("failed to find a suitable GPU!");
209-
}
210-
}
175+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
176+
auto const devIter = std::ranges::find_if(
177+
physicalDevices,
178+
[&]( auto const & physicalDevice )
179+
{
180+
// Check if the physicalDevice supports the Vulkan 1.3 API version
181+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
182+
183+
// Check if any of the queue families support graphics operations
184+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
185+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
186+
187+
// Check if all required physicalDevice extensions are available
188+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
189+
bool supportsAllRequiredExtensions =
190+
std::ranges::all_of( requiredDeviceExtension,
191+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
192+
{
193+
return std::ranges::any_of( availableDeviceExtensions,
194+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
195+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
196+
} );
197+
198+
// Check if the physicalDevice supports the required features (dynamic rendering and extended dynamic state)
199+
auto features =
200+
physicalDevice
201+
.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
202+
bool supportsRequiredFeatures = features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering &&
203+
features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState;
204+
205+
// Return true if the physicalDevice meets all the criteria
206+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
207+
} );
208+
if ( devIter == physicalDevices.end() )
209+
{
210+
throw std::runtime_error( "failed to find a suitable GPU!" );
211+
}
212+
physicalDevice = *devIter;
213+
}
211214

212215
void createLogicalDevice()
213216
{

0 commit comments

Comments
 (0)