@@ -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 {
0 commit comments