bool VulkanContext::SelectDeviceExtensions(ExtensionList* extension_list, bool enable_surface, bool enable_validation_layer) { u32 extension_count = 0; VkResult res = vkEnumerateDeviceExtensionProperties(m_physical_device, nullptr, &extension_count, nullptr); if (res != VK_SUCCESS) { LOG_VULKAN_ERROR(res, "vkEnumerateDeviceExtensionProperties failed: "); return false; } if (extension_count == 0) { ERROR_LOG(VIDEO, "Vulkan: No extensions supported by device."); return false; } std::vector<VkExtensionProperties> available_extension_list(extension_count); res = vkEnumerateDeviceExtensionProperties(m_physical_device, nullptr, &extension_count, available_extension_list.data()); _assert_(res == VK_SUCCESS); for (const auto& extension_properties : available_extension_list) INFO_LOG(VIDEO, "Available extension: %s", extension_properties.extensionName); auto CheckForExtension = [&](const char* name, bool required) -> bool { if (std::find_if(available_extension_list.begin(), available_extension_list.end(), [&](const VkExtensionProperties& properties) { return !strcmp(name, properties.extensionName); }) != available_extension_list.end()) { INFO_LOG(VIDEO, "Enabling extension: %s", name); extension_list->push_back(name); return true; } if (required) { ERROR_LOG(VIDEO, "Vulkan: Missing required extension %s.", name); return false; } return true; }; if (enable_surface && !CheckForExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME, true)) { return false; } return true; }
bool VulkanContext::SelectInstanceExtensions(ExtensionList* extension_list, WindowSystemType wstype, bool enable_debug_report) { u32 extension_count = 0; VkResult res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr); if (res != VK_SUCCESS) { LOG_VULKAN_ERROR(res, "vkEnumerateInstanceExtensionProperties failed: "); return false; } if (extension_count == 0) { ERROR_LOG(VIDEO, "Vulkan: No extensions supported by instance."); return false; } std::vector<VkExtensionProperties> available_extension_list(extension_count); res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, available_extension_list.data()); ASSERT(res == VK_SUCCESS); for (const auto& extension_properties : available_extension_list) INFO_LOG(VIDEO, "Available extension: %s", extension_properties.extensionName); auto SupportsExtension = [&](const char* name, bool required) { if (std::find_if(available_extension_list.begin(), available_extension_list.end(), [&](const VkExtensionProperties& properties) { return !strcmp(name, properties.extensionName); }) != available_extension_list.end()) { INFO_LOG(VIDEO, "Enabling extension: %s", name); extension_list->push_back(name); return true; } if (required) ERROR_LOG(VIDEO, "Vulkan: Missing required extension %s.", name); return false; }; // Common extensions if (wstype != WindowSystemType::Headless && !SupportsExtension(VK_KHR_SURFACE_EXTENSION_NAME, true)) { return false; } #if defined(VK_USE_PLATFORM_WIN32_KHR) if (wstype == WindowSystemType::Windows && !SupportsExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true)) { return false; } #endif #if defined(VK_USE_PLATFORM_XLIB_KHR) if (wstype == WindowSystemType::X11 && !SupportsExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, true)) { return false; } #endif #if defined(VK_USE_PLATFORM_ANDROID_KHR) if (wstype == WindowSystemType::Android && !SupportsExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) { return false; } #endif #if defined(VK_USE_PLATFORM_MACOS_MVK) if (wstype == WindowSystemType::MacOS && !SupportsExtension(VK_MVK_MACOS_SURFACE_EXTENSION_NAME, true)) { return false; } #endif // VK_EXT_debug_report if (enable_debug_report && !SupportsExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, false)) WARN_LOG(VIDEO, "Vulkan: Debug report requested, but extension is not available."); return true; }
bool VulkanContext::SelectInstanceExtensions(ExtensionList* extension_list, bool enable_surface, bool enable_validation_layer) { u32 extension_count = 0; VkResult res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, nullptr); if (res != VK_SUCCESS) { LOG_VULKAN_ERROR(res, "vkEnumerateInstanceExtensionProperties failed: "); return false; } if (extension_count == 0) { ERROR_LOG(VIDEO, "Vulkan: No extensions supported by instance."); return false; } std::vector<VkExtensionProperties> available_extension_list(extension_count); res = vkEnumerateInstanceExtensionProperties(nullptr, &extension_count, available_extension_list.data()); _assert_(res == VK_SUCCESS); for (const auto& extension_properties : available_extension_list) INFO_LOG(VIDEO, "Available extension: %s", extension_properties.extensionName); auto CheckForExtension = [&](const char* name, bool required) -> bool { if (std::find_if(available_extension_list.begin(), available_extension_list.end(), [&](const VkExtensionProperties& properties) { return !strcmp(name, properties.extensionName); }) != available_extension_list.end()) { INFO_LOG(VIDEO, "Enabling extension: %s", name); extension_list->push_back(name); return true; } if (required) { ERROR_LOG(VIDEO, "Vulkan: Missing required extension %s.", name); return false; } return true; }; // Common extensions if (enable_surface && !CheckForExtension(VK_KHR_SURFACE_EXTENSION_NAME, true)) { return false; } #if defined(VK_USE_PLATFORM_WIN32_KHR) if (enable_surface && !CheckForExtension(VK_KHR_WIN32_SURFACE_EXTENSION_NAME, true)) return false; #elif defined(VK_USE_PLATFORM_XLIB_KHR) if (enable_surface && !CheckForExtension(VK_KHR_XLIB_SURFACE_EXTENSION_NAME, true)) return false; #elif defined(VK_USE_PLATFORM_XCB_KHR) if (enable_surface && !CheckForExtension(VK_KHR_XCB_SURFACE_EXTENSION_NAME, true)) return false; #elif defined(VK_USE_PLATFORM_ANDROID_KHR) if (enable_surface && !CheckForExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) return false; #endif // VK_EXT_debug_report if (enable_validation_layer && !CheckForExtension(VK_EXT_DEBUG_REPORT_EXTENSION_NAME, true)) return false; return true; }