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
qwaylandvulkaninstance.cpp
Go to the documentation of this file.
1// Copyright (C) 2019 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
9
11
12namespace QtWaylandClient {
13
16{
17 loadVulkanLibrary(QStringLiteral("vulkan"), 1);
18}
19
21
23{
24 QByteArrayList extraExtensions;
25 extraExtensions << QByteArrayLiteral("VK_KHR_wayland_surface");
26 initInstance(m_instance, extraExtensions);
27
28 if (!m_vkInst)
29 return;
30
31 m_getPhysDevPresSupport = reinterpret_cast<PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR>(
32 m_vkGetInstanceProcAddr(m_vkInst, "vkGetPhysicalDeviceWaylandPresentationSupportKHR"));
33 if (!m_getPhysDevPresSupport)
34 qWarning() << "Failed to find vkGetPhysicalDeviceWaylandPresentationSupportKHR";
35}
36
37bool QWaylandVulkanInstance::supportsPresent(VkPhysicalDevice physicalDevice,
38 uint32_t queueFamilyIndex,
39 QWindow *window)
40{
41 if (!m_getPhysDevPresSupport || !m_getPhysDevSurfaceSupport)
42 return true;
43
44 auto *w = static_cast<QWaylandWindow *>(window->handle());
45 if (!w) {
46 qWarning() << "Attempted to call supportsPresent() without a valid platform window";
47 return false;
48 }
49 wl_display *display = w->display()->wl_display();
50 bool ok = m_getPhysDevPresSupport(physicalDevice, queueFamilyIndex, display);
51
52 VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
53 VkBool32 supported = false;
54 m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
55 ok &= bool(supported);
56
57 return ok;
58}
59
61{
62 VkSurfaceKHR surface = VK_NULL_HANDLE;
63
64 if (!m_createSurface) {
65 m_createSurface = reinterpret_cast<PFN_vkCreateWaylandSurfaceKHR>(
66 m_vkGetInstanceProcAddr(m_vkInst, "vkCreateWaylandSurfaceKHR"));
67 }
68 if (!m_createSurface) {
69 qWarning() << "Failed to find vkCreateWaylandSurfaceKHR";
70 return surface;
71 }
72
73 VkWaylandSurfaceCreateInfoKHR surfaceInfo;
74 memset(&surfaceInfo, 0, sizeof(surfaceInfo));
75 surfaceInfo.sType = VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR;
76 surfaceInfo.display = window->display()->wl_display();
77 surfaceInfo.surface = window->wlSurface();
78 VkResult err = m_createSurface(m_vkInst, &surfaceInfo, nullptr, &surface);
79 if (err != VK_SUCCESS)
80 qWarning("Failed to create Vulkan surface: %d", err);
81
82 return surface;
83}
84
86{
87 auto *w = static_cast<QWaylandWindow *>(window->handle());
88 if (!w) {
89 qWarning() << "Attempted to call presentAboutToBeQueued() without a valid platform window";
90 return;
91 }
92
93 bool ok;
94 int frameCallbackTimeout = qEnvironmentVariableIntValue("QT_WAYLAND_FRAME_CALLBACK_TIMEOUT", &ok);
95
96 if (ok)
97 mFrameCallbackTimeout = frameCallbackTimeout;
98
99 if (w->format().swapInterval() > 0)
100 w->waitForFrameSync(mFrameCallbackTimeout);
101
102 w->handleUpdate();
103}
104
105void QWaylandVulkanInstance::beginFrame(QWindow *window)
106{
107 auto *w = static_cast<QWaylandWindow *>(window->handle());
108 if (!w) {
109 qWarning() << "Attempted to call beginFrame() without a valid platform window";
110 return;
111 }
112 w->beginFrame();
113}
114
115void QWaylandVulkanInstance::endFrame(QWindow *window)
116{
117 auto *w = static_cast<QWaylandWindow *>(window->handle());
118 if (!w) {
119 qWarning() << "Attempted to call endFrame() without a valid platform window";
120 return;
121 }
122 w->endFrame();
123}
124
125} // namespace QtWaylandClient
126
127QT_END_NAMESPACE
VkSurfaceKHR createSurface(QWaylandWindow *window)
void presentAboutToBeQueued(QWindow *window) override
bool supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) override
Combined button and popup list for selecting options.