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 <laszlo.agocs@qt.io>
This commit is contained in:
Wang Bin 2025-01-03 19:57:41 +08:00
parent 6397dac979
commit 4f7e0f4519
2 changed files with 17 additions and 2 deletions

View File

@ -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

View File

@ -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 <AppKit/AppKit.h>
#import <QuartzCore/CAMetalLayer.h>
#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<PFN_vkCreateMetalSurfaceEXT>(
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<CAMetalLayer*>(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<PFN_vkCreateMacOSSurfaceMVK>(
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);