Skip to content

Commit 4d94ef6

Browse files
authored
Align docu and source of 03_physical_device_selection (#308)
* Adjust docu and source of 03_physical_device_selection * change from VK_API_VERSION_1_3 to vk::ApiVersion13
1 parent e9054a2 commit 4d94ef6

34 files changed

Lines changed: 1594 additions & 1466 deletions

attachments/03_physical_device_selection.cpp

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -149,44 +149,47 @@ class HelloTriangleApplication
149149
debugMessenger = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCreateInfoEXT);
150150
}
151151

152-
void pickPhysicalDevice()
153-
{
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-
}
152+
bool isDeviceSuitable( vk::raii::PhysicalDevice const & physicalDevice )
153+
{
154+
// Check if the physicalDevice supports the Vulkan 1.3 API version
155+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= vk::ApiVersion13;
156+
157+
// Check if any of the queue families support graphics operations
158+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
159+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
160+
161+
// Check if all required physicalDevice extensions are available
162+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
163+
bool supportsAllRequiredExtensions =
164+
std::ranges::all_of( requiredDeviceExtension,
165+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
166+
{
167+
return std::ranges::any_of( availableDeviceExtensions,
168+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
169+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
170+
} );
171+
172+
// Check if the physicalDevice supports the required features
173+
auto features =
174+
physicalDevice
175+
.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 true if the physicalDevice meets all the criteria
180+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
181+
}
182+
183+
void pickPhysicalDevice()
184+
{
185+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
186+
auto const devIter = std::ranges::find_if( physicalDevices, [&]( auto const & physicalDevice ) { return isDeviceSuitable( physicalDevice ); } );
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: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -154,44 +154,47 @@ class HelloTriangleApplication
154154
debugMessenger = instance.createDebugUtilsMessengerEXT(debugUtilsMessengerCreateInfoEXT);
155155
}
156156

157-
void pickPhysicalDevice()
158-
{
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;
165-
166-
// 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); });
170-
171-
// Check if all required device extensions are available
172-
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
173-
bool supportsAllRequiredExtensions =
174-
std::ranges::all_of(requiredDeviceExtension,
175-
[&availableDeviceExtensions](auto const &requiredDeviceExtension) {
176-
return std::ranges::any_of(availableDeviceExtensions,
177-
[requiredDeviceExtension](auto const &availableDeviceExtension) { return strcmp(availableDeviceExtension.extensionName, requiredDeviceExtension) == 0; });
178-
});
179-
180-
auto features = device.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 supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
185-
});
186-
if (devIter != devices.end())
187-
{
188-
physicalDevice = *devIter;
189-
}
190-
else
191-
{
192-
throw std::runtime_error("failed to find a suitable GPU!");
193-
}
194-
}
157+
bool isDeviceSuitable( vk::raii::PhysicalDevice 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
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+
188+
void pickPhysicalDevice()
189+
{
190+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
191+
auto const devIter = std::ranges::find_if( physicalDevices, [&]( auto const & physicalDevice ) { return isDeviceSuitable( physicalDevice ); } );
192+
if ( devIter == physicalDevices.end() )
193+
{
194+
throw std::runtime_error( "failed to find a suitable GPU!" );
195+
}
196+
physicalDevice = *devIter;
197+
}
195198

196199
void createLogicalDevice()
197200
{

attachments/05_window_surface.cpp

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -162,44 +162,47 @@ class HelloTriangleApplication
162162
surface = vk::raii::SurfaceKHR(instance, _surface);
163163
}
164164

165-
void pickPhysicalDevice()
166-
{
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-
}
165+
bool isDeviceSuitable( vk::raii::PhysicalDevice const & physicalDevice )
166+
{
167+
// Check if the physicalDevice supports the Vulkan 1.3 API version
168+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
169+
170+
// Check if any of the queue families support graphics operations
171+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
172+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
173+
174+
// Check if all required physicalDevice extensions are available
175+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
176+
bool supportsAllRequiredExtensions =
177+
std::ranges::all_of( requiredDeviceExtension,
178+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
179+
{
180+
return std::ranges::any_of( availableDeviceExtensions,
181+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
182+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
183+
} );
184+
185+
// Check if the physicalDevice supports the required features
186+
auto features =
187+
physicalDevice
188+
.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 true if the physicalDevice meets all the criteria
193+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
194+
}
195+
196+
void pickPhysicalDevice()
197+
{
198+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
199+
auto const devIter = std::ranges::find_if( physicalDevices, [&]( auto const & physicalDevice ) { return isDeviceSuitable( physicalDevice ); } );
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: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -170,44 +170,47 @@ class HelloTriangleApplication
170170
surface = vk::raii::SurfaceKHR(instance, _surface);
171171
}
172172

173-
void pickPhysicalDevice()
174-
{
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-
}
173+
bool isDeviceSuitable( vk::raii::PhysicalDevice const & physicalDevice )
174+
{
175+
// Check if the physicalDevice supports the Vulkan 1.3 API version
176+
bool supportsVulkan1_3 = physicalDevice.getProperties().apiVersion >= VK_API_VERSION_1_3;
177+
178+
// Check if any of the queue families support graphics operations
179+
auto queueFamilies = physicalDevice.getQueueFamilyProperties();
180+
bool supportsGraphics = std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } );
181+
182+
// Check if all required physicalDevice extensions are available
183+
auto availableDeviceExtensions = physicalDevice.enumerateDeviceExtensionProperties();
184+
bool supportsAllRequiredExtensions =
185+
std::ranges::all_of( requiredDeviceExtension,
186+
[&availableDeviceExtensions]( auto const & requiredDeviceExtension )
187+
{
188+
return std::ranges::any_of( availableDeviceExtensions,
189+
[requiredDeviceExtension]( auto const & availableDeviceExtension )
190+
{ return strcmp( availableDeviceExtension.extensionName, requiredDeviceExtension ) == 0; } );
191+
} );
192+
193+
// Check if the physicalDevice supports the required features
194+
auto features =
195+
physicalDevice
196+
.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 true if the physicalDevice meets all the criteria
201+
return supportsVulkan1_3 && supportsGraphics && supportsAllRequiredExtensions && supportsRequiredFeatures;
202+
}
203+
204+
void pickPhysicalDevice()
205+
{
206+
std::vector<vk::raii::PhysicalDevice> physicalDevices = instance.enumeratePhysicalDevices();
207+
auto const devIter = std::ranges::find_if( physicalDevices, [&]( auto const & physicalDevice ) { return isDeviceSuitable( physicalDevice ); } );
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)