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
99
bool
QWaylandEglClientBufferIntegration
::
isValid
()
const
100
{
101
return
m_eglDisplay
!=
EGL_NO_DISPLAY
;
102
}
103
104
bool
QWaylandEglClientBufferIntegration
::
supportsThreadedOpenGL
()
const
105
{
106
return
m_supportsThreading
;
107
}
108
109
bool
QWaylandEglClientBufferIntegration
::
supportsWindowDecoration
()
const
110
{
111
return
true
;
112
}
113
114
QWaylandWindow
*
QWaylandEglClientBufferIntegration
::
createEglWindow
(
QWindow
*
window
)
115
{
116
return
new
QWaylandEglWindow
(
window
,
m_display
);
117
}
118
119
QPlatformOpenGLContext
*
QWaylandEglClientBufferIntegration
::
createPlatformOpenGLContext
(
const
QSurfaceFormat
&
glFormat
,
QPlatformOpenGLContext
*
share
)
const
120
{
121
QSurfaceFormat
fmt
=
glFormat
;
122
if
(
m_display
->
supportsWindowDecoration
())
123
fmt
.
setAlphaBufferSize
(8);
124
return
new
QWaylandGLContext
(
m_eglDisplay
,
m_display
,
fmt
,
share
);
125
}
126
127
QOpenGLContext
*
QWaylandEglClientBufferIntegration
::
createOpenGLContext
(
EGLContext
context
,
EGLDisplay
contextDisplay
,
QOpenGLContext
*
shareContext
)
const
128
{
129
return
QEGLPlatformContext
::
createFrom
<
QWaylandGLContext
>(
context
,
contextDisplay
,
m_eglDisplay
,
shareContext
);
130
}
131
132
bool
QWaylandEglClientBufferIntegration
::
canCreatePlatformOffscreenSurface
()
const
133
{
134
return
true
;
135
}
136
137
QPlatformOffscreenSurface
*
QWaylandEglClientBufferIntegration
::
createPlatformOffscreenSurface
(
QOffscreenSurface
*
surface
)
const
138
{
139
return
new
QEGLPbuffer
(
m_eglDisplay
,
surface
->
requestedFormat
(),
surface
);
140
}
141
142
void
*
QWaylandEglClientBufferIntegration
::
nativeResource
(
NativeResource
resource
)
143
{
144
switch
(
resource
) {
145
case
EglDisplay
:
146
return
m_eglDisplay
;
147
default
:
148
break
;
149
}
150
return
nullptr
;
151
}
152
153
void
*
QWaylandEglClientBufferIntegration
::
nativeResourceForContext
(
NativeResource
resource
,
QPlatformOpenGLContext
*
context
)
154
{
155
Q_ASSERT
(
context
);
156
switch
(
resource
) {
157
case
EglConfig
:
158
return
static_cast
<
QWaylandGLContext
*>(
context
)->
eglConfig
();
159
case
EglContext
:
160
return
static_cast
<
QWaylandGLContext
*>(
context
)->
eglContext
();
161
case
EglDisplay
:
162
return
m_eglDisplay
;
163
default
:
164
break
;
165
}
166
return
nullptr
;
167
}
168
169
EGLDisplay
QWaylandEglClientBufferIntegration
::
eglDisplay
()
const
170
{
171
return
m_eglDisplay
;
172
}
173
174
}
175
176
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