bool check_robustness2_support(vk::raii::PhysicalDevice& physical_device) {
// Check if the extension is supported
auto available_extensions = physical_device.enumerateDeviceExtensionProperties();
for (const auto& extension : available_extensions) {
if (strcmp(extension.extensionName, VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) == 0) {
return true;
}
}
return false;
}
void enable_robustness2(vk::DeviceCreateInfo& device_create_info,
std::vector<const char*>& enabled_extensions) {
// Add the extension to the list of enabled extensions
enabled_extensions.push_back(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME);
device_create_info.setPEnabledExtensionNames(enabled_extensions);
// Set up the robustness2 features
vk::PhysicalDeviceRobustness2FeaturesEXT robustness2_features{};
robustness2_features.setRobustBufferAccess2(VK_TRUE);
robustness2_features.setRobustImageAccess2(VK_TRUE);
robustness2_features.setNullDescriptor(VK_TRUE);
// Add to the pNext chain
robustness2_features.pNext = device_create_info.pNext;
device_create_info.pNext = &robustness2_features;
}
vk::raii::Device create_robust_device(vk::raii::PhysicalDevice& physical_device,
vk::raii::Instance& instance) {
// Check for support
if (!check_robustness2_support(physical_device)) {
std::cerr << "VK_EXT_robustness2 is not supported on this device" << std::endl;
// Fall back to less robust behavior or abort
}
// Set up device creation
std::vector<const char*> enabled_extensions;
// Add your other required extensions here
vk::DeviceCreateInfo create_info{};
// Set up your queues, features, etc.
// Enable robustness2
enable_robustness2(create_info, enabled_extensions);
// Create the device
return vk::raii::Device(physical_device, create_info);
}