Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qcocoavulkaninstance.mm
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5#include <AppKit/AppKit.h>
6#import <QuartzCore/CAMetalLayer.h>
7
9#include "qcocoawindow.h"
10
12
13QCocoaVulkanInstance::QCocoaVulkanInstance(QVulkanInstance *instance)
14 : m_instance(instance)
15{
16 loadVulkanLibrary(QStringLiteral("vulkan"));
17}
18
19QCocoaVulkanInstance::~QCocoaVulkanInstance()
20{
21}
22
23void QCocoaVulkanInstance::createOrAdoptInstance()
24{
25 initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_EXT_metal_surface") << QByteArrayLiteral("VK_MVK_macos_surface"));
26}
27
28VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window)
29{
30 QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
31 if (!cocoaWindow->m_vulkanSurface)
32 cocoaWindow->m_vulkanSurface = createSurface(cocoaWindow->contentLayer());
33 return &cocoaWindow->m_vulkanSurface;
34}
35
36VkSurfaceKHR QCocoaVulkanInstance::createSurface(CALayer *layer)
37{
38 VkSurfaceKHR surface = nullptr;
39 if (!m_createMetalSurface) {
40 m_createMetalSurface = reinterpret_cast<PFN_vkCreateMetalSurfaceEXT>(
41 m_vkGetInstanceProcAddr(m_vkInst, "vkCreateMetalSurfaceEXT"));
42 }
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)
49 return surface;
50 qWarning("Failed to create Vulkan surface from metal layer: %d", err);
51 }
52 if (!m_createSurface) {
53 m_createSurface = reinterpret_cast<PFN_vkCreateMacOSSurfaceMVK>(
54 m_vkGetInstanceProcAddr(m_vkInst, "vkCreateMacOSSurfaceMVK"));
55 }
56 if (!m_createSurface) {
57 qWarning("Failed to find vkCreateMacOSSurfaceMVK");
58 return m_nullSurface;
59 }
60
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;
66
67 VkResult err = m_createSurface(m_vkInst, &surfaceInfo, nullptr, &surface);
68 if (err != VK_SUCCESS)
69 qWarning("Failed to create Vulkan surface: %d", err);
70
71 return surface;
72}
73
74
75QT_END_NAMESPACE