From 4f7e0f451998db204004c14ecc283d1e92fb7e7b Mon Sep 17 00:00:00 2001 From: Wang Bin Date: Fri, 3 Jan 2025 19:57:41 +0800 Subject: [PATCH] macOS: prefer VK_EXT_metal_surface fix vkDebug: vkCreateMacOSSurfaceMVK() is deprecated. Use vkCreateMetalSurfaceEXT() from the VK_EXT_metal_surface extension. Change-Id: I8e2ef1acf9f9147b233c26bd3c550c44ffa149b1 Reviewed-by: Laszlo Agocs --- .../platforms/cocoa/qcocoavulkaninstance.h | 1 + .../platforms/cocoa/qcocoavulkaninstance.mm | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) 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);