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
qwaylandeglclientbufferintegration.cpp
Go to the documentation of this file.
1
// Copyright (C) 2016 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
"qwaylandeglclientbufferintegration_p.h"
6
7
#
include
"qwaylandeglwindow_p.h"
8
#
include
"qwaylandglcontext_p.h"
9
10
#
include
<
wayland
-
client
-
core
.
h
>
11
12
#
include
<
QtCore
/
QDebug
>
13
#
include
<
private
/
qeglconvenience_p
.
h
>
14
#
include
<
private
/
qeglpbuffer_p
.
h
>
15
16
#
ifndef
EGL_EXT_platform_base
17
typedef
EGLDisplay
(*
PFNEGLGETPLATFORMDISPLAYEXTPROC
) (EGLenum platform,
void
*native_display,
const
EGLint *attrib_list);
18
#
endif
19
20
#
ifndef
EGL_PLATFORM_WAYLAND_KHR
21
#
define
EGL_PLATFORM_WAYLAND_KHR
0x31D8
22
#
endif
23
24
QT_BEGIN_NAMESPACE
25
26
namespace
QtWaylandClient
{
27
28
static
const
char
*
qwaylandegl_threadedgl_blacklist_vendor
[] = {
29
0
30
};
31
32
QWaylandEglClientBufferIntegration
::
QWaylandEglClientBufferIntegration
()
33
{
34
qCDebug
(
lcQpaWayland
) <<
"Using Wayland-EGL"
;
35
}
36
37
38
QWaylandEglClientBufferIntegration
::~
QWaylandEglClientBufferIntegration
()
39
{
40
eglTerminate
(
m_eglDisplay
);
41
}
42
43
void
QWaylandEglClientBufferIntegration
::
initialize
(
QWaylandDisplay
*
display
)
44
{
45
#
if
QT_CONFIG
(
egl_extension_platform_wayland
)
46
m_eglDisplay
=
eglGetPlatformDisplay
(
EGL_PLATFORM_WAYLAND_EXT
,
display
->
wl_display
(),
nullptr
);
47
#
else
48
if
(
q_hasEglExtension
(
EGL_NO_DISPLAY
,
"EGL_EXT_platform_base"
)) {
49
if
(
q_hasEglExtension
(
EGL_NO_DISPLAY
,
"EGL_KHR_platform_wayland"
) ||
50
q_hasEglExtension
(
EGL_NO_DISPLAY
,
"EGL_EXT_platform_wayland"
) ||
51
q_hasEglExtension
(
EGL_NO_DISPLAY
,
"EGL_MESA_platform_wayland"
)) {
52
53
static
PFNEGLGETPLATFORMDISPLAYEXTPROC
eglGetPlatformDisplay
=
nullptr
;
54
if
(!
eglGetPlatformDisplay
)
55
eglGetPlatformDisplay
= (
PFNEGLGETPLATFORMDISPLAYEXTPROC
)
eglGetProcAddress
(
"eglGetPlatformDisplayEXT"
);
56
57
m_eglDisplay
=
eglGetPlatformDisplay
(
EGL_PLATFORM_WAYLAND_KHR
,
display
->
wl_display
(),
nullptr
);
58
}
else
{
59
qCWarning
(
lcQpaWayland
) <<
"The EGL implementation does not support the Wayland platform"
;
60
return
;
61
}
62
}
else
{
63
QByteArray
eglPlatform
=
qgetenv
(
"EGL_PLATFORM"
);
64
if
(
eglPlatform
.
isEmpty
()) {
65
setenv
(
"EGL_PLATFORM"
,
"wayland"
,
true
);
66
}
67
68
m_eglDisplay
=
eglGetDisplay
((
EGLNativeDisplayType
)
display
->
wl_display
());
69
}
70
#
endif
71
72
m_display
=
display
;
73
74
if
(
m_eglDisplay
==
EGL_NO_DISPLAY
) {
75
qCWarning
(
lcQpaWayland
) <<
"EGL not available"
;
76
return
;
77
}
78
79
EGLint
major
,
minor
;
80
if
(!
eglInitialize
(
m_eglDisplay
, &
major
, &
minor
)) {
81
qCWarning
(
lcQpaWayland
) <<
"Failed to initialize EGL display"
<<
Qt
::
hex
<<
eglGetError
();
82
m_eglDisplay
=
EGL_NO_DISPLAY
;
83
return
;
84
}
85
86
m_supportsThreading
=
true
;
87
if
(
qEnvironmentVariableIsSet
(
"QT_OPENGL_NO_SANITY_CHECK"
))
88
return
;
89
90
const
char
*
vendor
=
eglQueryString
(
m_eglDisplay
,
EGL_VENDOR
);
91
for
(
int
i
= 0;
qwaylandegl_threadedgl_blacklist_vendor
[
i
]; ++
i
) {
92
if
(
strstr
(
vendor
,
qwaylandegl_threadedgl_blacklist_vendor
[
i
]) != 0) {
93
m_supportsThreading
=
false
;
94
break
;
95
}
96
}
97
98
// On desktop NVIDIA resizing QtQuick freezes them when using threaded rendering QTBUG-95817
99
// In order to support threaded rendering on embedded platforms where resizing is not needed
100
// we check if XDG_CURRENT_DESKTOP is set which desktop environments should set
101
if
(
qstrcmp
(
vendor
,
"NVIDIA"
) == 0 &&
qEnvironmentVariableIsSet
(
"XDG_CURRENT_DESKTOP"
)) {
102
m_supportsThreading
=
false
;
103
}
104
}
105
106
bool
QWaylandEglClientBufferIntegration
::
isValid
()
const
107
{
108
return
m_eglDisplay
!=
EGL_NO_DISPLAY
;
109
}
110
111
bool
QWaylandEglClientBufferIntegration
::
supportsThreadedOpenGL
()
const
112
{
113
return
m_supportsThreading
;
114
}
115
116
bool
QWaylandEglClientBufferIntegration
::
supportsWindowDecoration
()
const
117
{
118
return
true
;
119
}
120
121
QWaylandWindow
*
QWaylandEglClientBufferIntegration
::
createEglWindow
(
QWindow
*
window
)
122
{
123
return
new
QWaylandEglWindow
(
window
,
m_display
);
124
}
125
126
QPlatformOpenGLContext
*
QWaylandEglClientBufferIntegration
::
createPlatformOpenGLContext
(
const
QSurfaceFormat
&
glFormat
,
QPlatformOpenGLContext
*
share
)
const
127
{
128
QSurfaceFormat
fmt
=
glFormat
;
129
if
(
m_display
->
supportsWindowDecoration
())
130
fmt
.
setAlphaBufferSize
(8);
131
return
new
QWaylandGLContext
(
m_eglDisplay
,
m_display
,
fmt
,
share
);
132
}
133
134
QOpenGLContext
*
QWaylandEglClientBufferIntegration
::
createOpenGLContext
(
EGLContext
context
,
EGLDisplay
contextDisplay
,
QOpenGLContext
*
shareContext
)
const
135
{
136
return
QEGLPlatformContext
::
createFrom
<
QWaylandGLContext
>(
context
,
contextDisplay
,
m_eglDisplay
,
shareContext
);
137
}
138
139
bool
QWaylandEglClientBufferIntegration
::
canCreatePlatformOffscreenSurface
()
const
140
{
141
return
true
;
142
}
143
144
QPlatformOffscreenSurface
*
QWaylandEglClientBufferIntegration
::
createPlatformOffscreenSurface
(
QOffscreenSurface
*
surface
)
const
145
{
146
return
new
QEGLPbuffer
(
m_eglDisplay
,
surface
->
requestedFormat
(),
surface
);
147
}
148
149
void
*
QWaylandEglClientBufferIntegration
::
nativeResource
(
NativeResource
resource
)
150
{
151
switch
(
resource
) {
152
case
EglDisplay
:
153
return
m_eglDisplay
;
154
default
:
155
break
;
156
}
157
return
nullptr
;
158
}
159
160
void
*
QWaylandEglClientBufferIntegration
::
nativeResourceForContext
(
NativeResource
resource
,
QPlatformOpenGLContext
*
context
)
161
{
162
Q_ASSERT
(
context
);
163
switch
(
resource
) {
164
case
EglConfig
:
165
return
static_cast
<
QWaylandGLContext
*>(
context
)->
eglConfig
();
166
case
EglContext
:
167
return
static_cast
<
QWaylandGLContext
*>(
context
)->
eglContext
();
168
case
EglDisplay
:
169
return
m_eglDisplay
;
170
default
:
171
break
;
172
}
173
return
nullptr
;
174
}
175
176
EGLDisplay
QWaylandEglClientBufferIntegration
::
eglDisplay
()
const
177
{
178
return
m_eglDisplay
;
179
}
180
181
}
182
183
QT_END_NAMESPACE
QtWaylandClient
Definition
qwaylandclientextension.h:16
QtWaylandClient::qwaylandegl_threadedgl_blacklist_vendor
static const char * qwaylandegl_threadedgl_blacklist_vendor[]
Definition
qwaylandeglclientbufferintegration.cpp:28
PFNEGLGETPLATFORMDISPLAYEXTPROC
EGLDisplay(* PFNEGLGETPLATFORMDISPLAYEXTPROC)(EGLenum platform, void *native_display, const EGLint *attrib_list)
Definition
qwaylandeglclientbufferintegration.cpp:17
EGL_PLATFORM_WAYLAND_KHR
#define EGL_PLATFORM_WAYLAND_KHR
Definition
qwaylandeglclientbufferintegration.cpp:21
qtbase
src
plugins
platforms
wayland
plugins
hardwareintegration
wayland-egl
qwaylandeglclientbufferintegration.cpp
Generated on
for Qt by
1.16.1