blob: d2986ea5e69af85849e9601959ef932b9c00d34b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
// Copyright (C) 2018 The Qt Company Ltd.
// 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>
#include "qcocoavulkaninstance.h"
#include "qcocoawindow.h"
QT_BEGIN_NAMESPACE
QCocoaVulkanInstance::QCocoaVulkanInstance(QVulkanInstance *instance)
: m_instance(instance)
{
loadVulkanLibrary(QStringLiteral("vulkan"));
}
QCocoaVulkanInstance::~QCocoaVulkanInstance()
{
}
void QCocoaVulkanInstance::createOrAdoptInstance()
{
initInstance(m_instance, QByteArrayList() << QByteArrayLiteral("VK_MVK_macos_surface"));
}
VkSurfaceKHR *QCocoaVulkanInstance::surface(QWindow *window)
{
QCocoaWindow *cocoaWindow = static_cast<QCocoaWindow *>(window->handle());
if (!cocoaWindow->m_vulkanSurface)
cocoaWindow->m_vulkanSurface = createSurface(cocoaWindow->m_view);
return &cocoaWindow->m_vulkanSurface;
}
VkSurfaceKHR QCocoaVulkanInstance::createSurface(NSView *view)
{
if (!m_createSurface) {
m_createSurface = reinterpret_cast<PFN_vkCreateMacOSSurfaceMVK>(
m_vkGetInstanceProcAddr(m_vkInst, "vkCreateMacOSSurfaceMVK"));
}
if (!m_createSurface) {
qWarning("Failed to find vkCreateMacOSSurfaceMVK");
return m_nullSurface;
}
VkMacOSSurfaceCreateInfoMVK surfaceInfo;
surfaceInfo.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
surfaceInfo.pNext = nullptr;
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);
return surface;
}
QT_END_NAMESPACE
|