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
qqnxvulkaninstance.cpp
Go to the documentation of this file.
1
// Copyright (C) 2026 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
"qqnxvulkaninstance.h"
6
#
include
"qqnxwindow.h"
7
#
include
"qqnxintegration.h"
8
9
QT_BEGIN_NAMESPACE
10
11
Q_LOGGING_CATEGORY(lcQpaQnxVulkan,
"qt.qpa.qnx.vulkan"
)
12
13
QQnxVulkanInstance::QQnxVulkanInstance(QVulkanInstance *instance)
14
: m_instance(instance),
15
m_createSurface(
nullptr
),
16
m_getPhysDevScreenPresSupport(
nullptr
)
17
{
18
loadVulkanLibrary(QStringLiteral(
"vulkan"
), 1);
19
}
20
21
QQnxVulkanInstance
::~
QQnxVulkanInstance
()
22
{
23
}
24
25
void
QQnxVulkanInstance
::
createOrAdoptInstance
()
26
{
27
initInstance(m_instance, QByteArrayList() << QByteArrayLiteral(
"VK_QNX_screen_surface"
));
28
29
if
(!m_vkInst)
30
return
;
31
32
m_getPhysDevScreenPresSupport =
33
reinterpret_cast
<PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX>(
34
m_vkGetInstanceProcAddr(m_vkInst,
35
"vkGetPhysicalDeviceScreenPresentationSupportQNX"
));
36
if
(!m_getPhysDevScreenPresSupport)
37
qCWarning(lcQpaQnxVulkan,
"Failed to find vkGetPhysicalDeviceScreenPresentationSupportQNX"
);
38
}
39
40
bool
QQnxVulkanInstance
::supportsPresent(VkPhysicalDevice physicalDevice,
41
uint32_t queueFamilyIndex,
42
QWindow *window)
43
{
44
if
(window->surfaceType() != QSurface::VulkanSurface) {
45
qCWarning(lcQpaQnxVulkan,
"supportsPresent: called on non-Vulkan window"
);
46
return
false
;
47
}
48
49
// Prefer the QNX-specific check: it doesn't require a VkSurfaceKHR to exist yet,
50
// avoiding premature surface creation in the Vulkan driver.
51
if
(m_getPhysDevScreenPresSupport) {
52
QQnxWindow
*w =
static_cast
<
QQnxWindow
*>(window->handle());
53
if
(!w) {
54
qCWarning(lcQpaQnxVulkan,
"supportsPresent: window has no platform handle"
);
55
return
false
;
56
}
57
return
m_getPhysDevScreenPresSupport(physicalDevice, queueFamilyIndex, w->nativeHandle());
58
}
59
60
// Fallback: generic surface support check (requires the surface to already exist).
61
if
(m_getPhysDevSurfaceSupport) {
62
VkSurfaceKHR surface = QVulkanInstance::surfaceForWindow(window);
63
if
(surface) {
64
VkBool32 supported =
false
;
65
VkResult err = m_getPhysDevSurfaceSupport(physicalDevice, queueFamilyIndex, surface, &supported);
66
if
(err != VK_SUCCESS) {
67
qCWarning(lcQpaQnxVulkan,
"vkGetPhysicalDeviceSurfaceSupportKHR failed: %d"
, err);
68
return
true
;
69
}
70
return
bool
(supported);
71
}
72
}
73
74
return
true
;
75
}
76
77
void
QQnxVulkanInstance
::
presentAboutToBeQueued
(QWindow *window)
78
{
79
auto
*w =
static_cast
<
QQnxWindow
*>(window->handle());
80
if
(!w) {
81
qWarning(
"QQnxVulkanInstance: presentAboutToBeQueued() called without a valid platform window"
);
82
return
;
83
}
84
w->windowPosted();
85
}
86
87
VkSurfaceKHR
QQnxVulkanInstance
::
createSurface
(
QQnxWindow
*window)
88
{
89
VkSurfaceKHR surface = VK_NULL_HANDLE;
90
91
if
(!m_vkInst) {
92
qCWarning(lcQpaQnxVulkan,
"createSurface: Vulkan instance not available"
);
93
return
VK_NULL_HANDLE;
94
}
95
96
if
(!m_createSurface) {
97
m_createSurface =
reinterpret_cast
<PFN_vkCreateScreenSurfaceQNX>(
98
m_vkGetInstanceProcAddr(m_vkInst,
"vkCreateScreenSurfaceQNX"
));
99
}
100
if
(!m_createSurface) {
101
qCWarning(lcQpaQnxVulkan,
"Failed to find vkCreateScreenSurfaceQNX"
);
102
return
surface;
103
}
104
105
if
(!window->nativeHandle()) {
106
qCWarning(lcQpaQnxVulkan,
"Window has no native screen_window_t handle"
);
107
return
surface;
108
}
109
110
VkScreenSurfaceCreateInfoQNX surfaceInfo;
111
memset(&surfaceInfo, 0,
sizeof
(surfaceInfo));
112
surfaceInfo.sType = VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX;
113
surfaceInfo.context = window->screenContext();
114
surfaceInfo.window = window->nativeHandle();
115
116
VkResult err = m_createSurface(m_vkInst, &surfaceInfo,
nullptr
, &surface);
117
118
if
(err != VK_SUCCESS) {
119
qCWarning(lcQpaQnxVulkan,
"Failed to create Vulkan screen surface: %d"
, err);
120
}
else
{
121
qCDebug(lcQpaQnxVulkan,
"Created Vulkan surface %p for window %p"
, surface, window->nativeHandle());
122
}
123
124
return
surface;
125
}
126
127
QT_END_NAMESPACE
QQnxVulkanInstance
Definition
qqnxvulkaninstance.h:23
QQnxVulkanInstance::presentAboutToBeQueued
void presentAboutToBeQueued(QWindow *window) override
Definition
qqnxvulkaninstance.cpp:77
QQnxVulkanInstance::~QQnxVulkanInstance
~QQnxVulkanInstance() override
Definition
qqnxvulkaninstance.cpp:21
QQnxVulkanInstance::createOrAdoptInstance
void createOrAdoptInstance() override
Definition
qqnxvulkaninstance.cpp:25
QQnxVulkanInstance::createSurface
VkSurfaceKHR createSurface(QQnxWindow *window)
Definition
qqnxvulkaninstance.cpp:87
QQnxWindow
The QQnxWindow is the base class of the various classes used as instances of QPlatformWindow in the Q...
Definition
qqnxwindow.h:32
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
qtbase
src
plugins
platforms
qnx
qqnxvulkaninstance.cpp
Generated on
for Qt by
1.18.0