5#include <AppKit/AppKit.h>
6#import <QuartzCore/CAMetalLayer.h>
13QCocoaVulkanInstance::QCocoaVulkanInstance(QVulkanInstance *instance)
14 : m_instance(instance)
16 loadVulkanLibrary(QStringLiteral(
"vulkan"));
19QCocoaVulkanInstance::~QCocoaVulkanInstance()
23void QCocoaVulkanInstance::createOrAdoptInstance()
25 initInstance(m_instance, QByteArrayList() << QByteArrayLiteral(
"VK_EXT_metal_surface") << QByteArrayLiteral(
"VK_MVK_macos_surface"));
28VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window)
31 if (!cocoaWindow->m_vulkanSurface)
32 cocoaWindow->m_vulkanSurface = createSurface(cocoaWindow->contentLayer());
33 return &cocoaWindow->m_vulkanSurface;
36VkSurfaceKHR QCocoaVulkanInstance::createSurface(CALayer *layer)
38 VkSurfaceKHR surface =
nullptr;
39 if (!m_createMetalSurface) {
40 m_createMetalSurface =
reinterpret_cast<PFN_vkCreateMetalSurfaceEXT>(
41 m_vkGetInstanceProcAddr(m_vkInst,
"vkCreateMetalSurfaceEXT"));
43 if (m_createMetalSurface) {
44 VkMetalSurfaceCreateInfoEXT info = {};
45 info.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT;
46 info.pLayer = qt_objc_cast<CAMetalLayer*>(layer);
47 VkResult err = m_createMetalSurface(m_vkInst, &info,
nullptr, &surface);
48 if (err == VK_SUCCESS)
50 qWarning(
"Failed to create Vulkan surface from metal layer: %d", err);
52 if (!m_createSurface) {
53 m_createSurface =
reinterpret_cast<PFN_vkCreateMacOSSurfaceMVK>(
54 m_vkGetInstanceProcAddr(m_vkInst,
"vkCreateMacOSSurfaceMVK"));
56 if (!m_createSurface) {
57 qWarning(
"Failed to find vkCreateMacOSSurfaceMVK");
61 VkMacOSSurfaceCreateInfoMVK surfaceInfo;
62 surfaceInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
63 surfaceInfo.pNext =
nullptr;
64 surfaceInfo.flags = 0;
65 surfaceInfo.pView = layer;
67 VkResult err = m_createSurface(m_vkInst, &surfaceInfo,
nullptr, &surface);
68 if (err != VK_SUCCESS)
69 qWarning(
"Failed to create Vulkan surface: %d", err);