Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
5
#
include
"qwaylandwindow_p.h"
6
#
include
"qwaylandvulkaninstance_p.h"
7
#
include
"qwaylandscreen_p.h"
8
#
include
"qwaylanddisplay_p.h"
9
10
QT_BEGIN_NAMESPACE
11
12
namespace
QtWaylandClient
{
13
14
QWaylandVulkanInstance
::
QWaylandVulkanInstance
(QVulkanInstance *instance)
15
:
m_instance
(
instance
)
16
{
17
loadVulkanLibrary(QStringLiteral(
"vulkan"
), 1);
18
}
19
20
QWaylandVulkanInstance
::~
QWaylandVulkanInstance
() =
default
;
21
22
void
QWaylandVulkanInstance
::
createOrAdoptInstance
()
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
37
bool
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
60
VkSurfaceKHR
QWaylandVulkanInstance
::
createSurface
(QWaylandWindow *window)
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
85
void
QWaylandVulkanInstance
::
presentAboutToBeQueued
(QWindow *window)
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
105
void
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
115
void
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
127
QT_END_NAMESPACE
QtWaylandClient::QWaylandVulkanInstance
Definition
qwaylandvulkaninstance_p.h:35
QtWaylandClient::QWaylandVulkanInstance::createOrAdoptInstance
void createOrAdoptInstance() override
Definition
qwaylandvulkaninstance.cpp:22
QtWaylandClient::QWaylandVulkanInstance::createSurface
VkSurfaceKHR createSurface(QWaylandWindow *window)
Definition
qwaylandvulkaninstance.cpp:60
QtWaylandClient::QWaylandVulkanInstance::beginFrame
void beginFrame(QWindow *window) override
Definition
qwaylandvulkaninstance.cpp:105
QtWaylandClient::QWaylandVulkanInstance::QWaylandVulkanInstance
QWaylandVulkanInstance(QVulkanInstance *instance)
Definition
qwaylandvulkaninstance.cpp:14
QtWaylandClient::QWaylandVulkanInstance::presentAboutToBeQueued
void presentAboutToBeQueued(QWindow *window) override
Definition
qwaylandvulkaninstance.cpp:85
QtWaylandClient::QWaylandVulkanInstance::endFrame
void endFrame(QWindow *window) override
Definition
qwaylandvulkaninstance.cpp:115
QtWaylandClient::QWaylandVulkanInstance::~QWaylandVulkanInstance
~QWaylandVulkanInstance() override
QtWaylandClient::QWaylandVulkanInstance::supportsPresent
bool supportsPresent(VkPhysicalDevice physicalDevice, uint32_t queueFamilyIndex, QWindow *window) override
Definition
qwaylandvulkaninstance.cpp:37
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QtWaylandClient
Definition
qwaylandclientextension.h:16
qtbase
src
plugins
platforms
wayland
qwaylandvulkaninstance.cpp
Generated on
for Qt by
1.18.0