diff --git a/src/plugins/platforms/cocoa/qcocoavulkaninstance.h b/src/plugins/platforms/cocoa/qcocoavulkaninstance.h index fd6b7c6452f..d820badc507 100644 --- a/src/plugins/platforms/cocoa/qcocoavulkaninstance.h +++ b/src/plugins/platforms/cocoa/qcocoavulkaninstance.h @@ -32,6 +32,7 @@ private: QLibrary m_lib; VkSurfaceKHR m_nullSurface = nullptr; PFN_vkCreateMacOSSurfaceMVK m_createSurface = nullptr; + PFN_vkCreateMetalSurfaceEXT m_createMetalSurface = nullptr; }; QT_END_NAMESPACE diff --git a/src/plugins/platforms/cocoa/qcocoavulkaninstance.mm b/src/plugins/platforms/cocoa/qcocoavulkaninstance.mm index d2986ea5e69..8bb0617d364 100644 --- a/src/plugins/platforms/cocoa/qcocoavulkaninstance.mm +++ b/src/plugins/platforms/cocoa/qcocoavulkaninstance.mm @@ -2,6 +2,7 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include +#import #include "qcocoavulkaninstance.h" #include "qcocoawindow.h" @@ -20,7 +21,7 @@ QCocoaVulkanInstance::~QCocoaVulkanInstance() void QCocoaVulkanInstance::createOrAdoptInstance() { - initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_MVK_macos_surface")); + initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_EXT_metal_surface") << QByteArrayLiteral("VK_MVK_macos_surface")); } VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window) @@ -33,6 +34,20 @@ VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window) VkSurfaceKHR QCocoaVulkanInstance::createSurface(NSView *view) { + VkSurfaceKHR surface = nullptr; + if (!m_createMetalSurface) { + m_createMetalSurface = reinterpret_cast( + m_vkGetInstanceProcAddr(m_vkInst, "vkCreateMetalSurfaceEXT")); + } + if (m_createMetalSurface) { + VkMetalSurfaceCreateInfoEXT info = {}; + info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT; + info.pLayer = qt_objc_cast(view.layer); + VkResult err = m_createMetalSurface(m_vkInst, &info, nullptr, &surface); + if (err == VK_SUCCESS) + return surface; + qWarning("Failed to create Vulkan surface from metal layer: %d", err); + } if (!m_createSurface) { m_createSurface = reinterpret_cast( m_vkGetInstanceProcAddr(m_vkInst, "vkCreateMacOSSurfaceMVK")); @@ -48,7 +63,6 @@ VkSurfaceKHR QCocoaVulkanInstance::createSurface(NSView *view) surfaceInfo.flags = 0; surfaceInfo.pView = view.layer; - VkSurfaceKHR surface = nullptr; VkResult err = m_createSurface(m_vkInst, &surfaceInfo, nullptr, &surface); if (err != VK_SUCCESS) qWarning("Failed to create Vulkan surface: %d", err);