improve device selection logic
This commit is contained in:
@@ -47,10 +47,60 @@ uint32_t Device::evaluatePhysicalDevice(vk::raii::PhysicalDevice& device) {
|
|||||||
|
|
||||||
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Physical device found: " << deviceProperties.deviceName << std::endl;
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Physical device found: " << deviceProperties.deviceName << std::endl;
|
||||||
|
|
||||||
if(deviceProperties.deviceType == vk::PhysicalDeviceType::eDiscreteGpu) {
|
uint32_t score = 0;
|
||||||
return 2;
|
|
||||||
} else {
|
|
||||||
return 1;
|
|
||||||
} // i.e. a descrete gpu is preferable to an integrated gpu
|
|
||||||
|
|
||||||
|
// TODO: this is very basic and can be improved
|
||||||
|
|
||||||
|
// prefer discrete graphics to integrated graphics
|
||||||
|
if(deviceProperties.deviceType == vk::PhysicalDeviceType::eDiscreteGpu) {
|
||||||
|
score += 2;
|
||||||
|
} else {
|
||||||
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Warning: physical device " << deviceProperties.deviceName << " is not a discrete device!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer devices that support vulkan 1.3
|
||||||
|
if(deviceProperties.apiVersion >= vk::ApiVersion14) {
|
||||||
|
score++;
|
||||||
|
} else {
|
||||||
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Warning: physical device " << deviceProperties.deviceName << " does not support Vulkan 1.3! (" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer devices that support graphics queues
|
||||||
|
auto queueFamilies = device.getQueueFamilyProperties();
|
||||||
|
if(std::ranges::any_of( queueFamilies, []( auto const & qfp ) { return !!( qfp.queueFlags & vk::QueueFlagBits::eGraphics ); } )) {
|
||||||
|
score++;
|
||||||
|
} else {
|
||||||
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Warning: physical device " << deviceProperties.deviceName << " does not support graphics queue families!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer devices that support all required extensions
|
||||||
|
auto availableDeviceExtensions = device.enumerateDeviceExtensionProperties();
|
||||||
|
bool found = false;
|
||||||
|
uint32_t missingExtensions = 0;
|
||||||
|
for(auto& requiredExtension : requiredDeviceExtensions_) {
|
||||||
|
for(auto& availableExtension: availableDeviceExtensions) {
|
||||||
|
if(strcmp(availableExtension.extensionName, requiredExtension) == 0) {
|
||||||
|
found = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(found == false) {
|
||||||
|
missingExtensions++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(missingExtensions == 0) {
|
||||||
|
score++;
|
||||||
|
} else {
|
||||||
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Warning: physical device " << deviceProperties.deviceName << " is missing extensions!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// prefer devices that support all required features
|
||||||
|
auto features = device.template getFeatures2<vk::PhysicalDeviceFeatures2, vk::PhysicalDeviceVulkan13Features, vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>();
|
||||||
|
if(features.template get<vk::PhysicalDeviceVulkan13Features>().dynamicRendering && features.template get<vk::PhysicalDeviceExtendedDynamicStateFeaturesEXT>().extendedDynamicState) {
|
||||||
|
score++;
|
||||||
|
} else {
|
||||||
|
std::cout << "[" << __FUNCTION__ << ": " << __LINE__ << "] Warning: physical device " << deviceProperties.deviceName << " is missing features!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return score;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,4 +21,7 @@ class Device {
|
|||||||
vk::raii::Instance* instance_ = nullptr;
|
vk::raii::Instance* instance_ = nullptr;
|
||||||
vk::raii::PhysicalDevice physicalDevice_ = nullptr;
|
vk::raii::PhysicalDevice physicalDevice_ = nullptr;
|
||||||
|
|
||||||
|
// required extensions for the physical device
|
||||||
|
std::vector<const char*> requiredDeviceExtensions_ = { vk::KHRSwapchainExtensionName };
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user