diff --git a/vulkan/vulkan_application.cc b/vulkan/vulkan_application.cc index f89c6d49b8bcf0156e8f07cecd3fae07819b9fa4..eaba000274ca44bb8fcd9da73ec6684d5820a356 100644 --- a/vulkan/vulkan_application.cc +++ b/vulkan/vulkan_application.cc @@ -21,15 +21,25 @@ VulkanApplication::VulkanApplication( uint32_t api_version) : vk(p_vk), api_version_(api_version), valid_(false) { // Check if we want to enable debugging. - + std::vector supported_extensions = + GetSupportedInstanceExtensions(vk); bool enable_instance_debugging = - IsDebuggingEnabled() && VulkanDebugReport::DebugExtensionSupported(vk); + IsDebuggingEnabled() && + ExtensionSupported(supported_extensions, + VulkanDebugReport::DebugExtensionName()); // Configure extensions. if (enable_instance_debugging) { enabled_extensions.emplace_back(VulkanDebugReport::DebugExtensionName()); } +#if OS_FUCHSIA + if (ExtensionSupported(supported_extensions, + VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) { + enabled_extensions.emplace_back( + VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME); + } +#endif const char* extensions[enabled_extensions.size()]; @@ -166,4 +176,45 @@ VulkanApplication::AcquireFirstCompatibleLogicalDevice() const { return nullptr; } +std::vector +VulkanApplication::GetSupportedInstanceExtensions( + const VulkanProcTable& vk) const { + if (!vk.EnumerateInstanceExtensionProperties) { + return std::vector(); + } + + uint32_t count = 0; + if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties( + nullptr, &count, nullptr)) != VK_SUCCESS) { + return std::vector(); + } + + if (count == 0) { + return std::vector(); + } + + std::vector properties; + properties.resize(count); + if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties( + nullptr, &count, properties.data())) != VK_SUCCESS) { + return std::vector(); + } + + return properties; +} + +bool VulkanApplication::ExtensionSupported( + const std::vector& supported_instance_extensions, + std::string extension_name) { + uint32_t count = supported_instance_extensions.size(); + for (size_t i = 0; i < count; i++) { + if (strncmp(supported_instance_extensions[i].extensionName, + extension_name.c_str(), extension_name.size()) == 0) { + return true; + } + } + + return false; +} + } // namespace vulkan diff --git a/vulkan/vulkan_application.h b/vulkan/vulkan_application.h index 6d284803d9ebbc854efcc00c12c8954d38179100..a5f20c07f63ec003f083b6354c911b3b5a35ff75 100644 --- a/vulkan/vulkan_application.h +++ b/vulkan/vulkan_application.h @@ -50,6 +50,11 @@ class VulkanApplication { bool valid_; std::vector GetPhysicalDevices() const; + std::vector GetSupportedInstanceExtensions( + const VulkanProcTable& vk) const; + bool ExtensionSupported( + const std::vector& supported_extensions, + std::string extension_name); FXL_DISALLOW_COPY_AND_ASSIGN(VulkanApplication); }; diff --git a/vulkan/vulkan_debug_report.cc b/vulkan/vulkan_debug_report.cc index 5fca3a93e7473bd969af40312f88457dbefc0467..a7e7a10888235f9b1d13daedcb410a7738893a42 100644 --- a/vulkan/vulkan_debug_report.cc +++ b/vulkan/vulkan_debug_report.cc @@ -22,44 +22,6 @@ std::string VulkanDebugReport::DebugExtensionName() { return VK_EXT_DEBUG_REPORT_EXTENSION_NAME; } -bool VulkanDebugReport::DebugExtensionSupported(const VulkanProcTable& vk) { - if (!IsDebuggingEnabled()) { - return false; - } - - if (!vk.EnumerateInstanceExtensionProperties) { - return false; - } - - uint32_t count = 0; - if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties( - nullptr, &count, nullptr)) != VK_SUCCESS) { - return false; - } - - if (count == 0) { - return false; - } - - std::vector properties; - properties.resize(count); - if (VK_CALL_LOG_ERROR(vk.EnumerateInstanceExtensionProperties( - nullptr, &count, properties.data())) != VK_SUCCESS) { - return false; - } - - auto debug_extension_name = DebugExtensionName(); - - for (size_t i = 0; i < count; i++) { - if (strncmp(properties[i].extensionName, debug_extension_name.c_str(), - debug_extension_name.size()) == 0) { - return true; - } - } - - return false; -} - static const char* VkDebugReportFlagsEXTToString(VkDebugReportFlagsEXT flags) { if (flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { return "Information"; diff --git a/vulkan/vulkan_debug_report.h b/vulkan/vulkan_debug_report.h index e675f55312c0004e20afc5599f98ade56c0d4f1e..80f886e2e94aae89817597339b2a34cce47d6747 100644 --- a/vulkan/vulkan_debug_report.h +++ b/vulkan/vulkan_debug_report.h @@ -14,8 +14,6 @@ namespace vulkan { class VulkanDebugReport { public: - static bool DebugExtensionSupported(const VulkanProcTable& vk); - static std::string DebugExtensionName(); VulkanDebugReport(const VulkanProcTable& vk, diff --git a/vulkan/vulkan_device.cc b/vulkan/vulkan_device.cc index 8ac4c8b19f14b3deba3b17d8273c4dc6175ff40b..c989f4f09dc8506c83bf5576dc9421897349437f 100644 --- a/vulkan/vulkan_device.cc +++ b/vulkan/vulkan_device.cc @@ -61,6 +61,8 @@ VulkanDevice::VulkanDevice(VulkanProcTable& p_vk, const char* extensions[] = { VK_KHR_SWAPCHAIN_EXTENSION_NAME, #if OS_FUCHSIA + VK_KHR_EXTERNAL_MEMORY_EXTENSION_NAME, + VK_KHR_EXTERNAL_MEMORY_FUCHSIA_EXTENSION_NAME, VK_KHR_EXTERNAL_SEMAPHORE_EXTENSION_NAME, VK_KHR_EXTERNAL_SEMAPHORE_FUCHSIA_EXTENSION_NAME, #endif