xserver-multidpi/include
Lyude Paul 54ac09717c xwayland: Add glamor egl_backend for EGLStreams
This adds initial support for displaying Xwayland applications through
the use of EGLStreams and nvidia's custom wayland protocol by adding
another egl_backend driver. This also adds some additional egl_backend
hooks that are required to make things work properly.

EGLStreams work a lot differently then the traditional way of handling
buffers with wayland. Unfortunately, there are also a LOT of various
pitfalls baked into it's design that need to be explained.

This has a very large and unfortunate implication: direct rendering is,
for the time being at least, impossible to do through EGLStreams. The
main reason being that the EGLStream spec mandates that we lose the
entire color buffer contents with each eglSwapBuffers(), which goes
against X's requirement of not losing data with pixmaps.  no way to use
an allocated EGLSurface as the storage for glamor rendering like we do
with GBM, we have to rely on blitting each pixmap to it's respective
EGLSurface producer each frame. In order to pull this off, we add two
different additional egl_backend hooks that GBM opts out of
implementing:

- egl_backend.allow_commits for holding off displaying any EGLStream
  backed pixmaps until the point where it's stream is completely
  initialized and ready for use
- egl_backend.post_damage for blitting the content of the EGLStream
  surface producer before Xwayland actually damages and commits the
  wl_surface to the screen.

The other big pitfall here is that using nvidia's wayland-eglstreams
helper library is also not possible for the most part. All of it's API
for creating and destroying streams rely on being able to perform a
roundtrip in order to bring each stream to completion since the wayland
compositor must perform it's job of connecting a consumer to each
EGLstream. Because Xwayland has to potentially handle both responding to
the wayland compositor and it's own X clients, the situation of the
wayland compositor being one of our X clients must be considered. If we
perform a roundtrip with the Wayland compositor, it's possible that the
wayland compositor might currently be connected to us as an X client and
thus hang while both Xwayland and the wayland compositor await responses
from eachother. To avoid this, we work directly with the wayland
protocol and use wl_display_sync() events along with release() events to
set up and destroy EGLStreams asynchronously alongside handling X
clients.

Additionally, since setting up EGLStreams is not an atomic operation we
have to take into consideration the fact that an EGLStream can
potentially be created in response to a window resize, then immediately
deleted due to another pending window resize in the same X client's
pending reqests before Xwayland hits the part of it's event loop where
we read from the wayland compositor. To make this even more painful, we
also have to take into consideration that since EGLStreams are not
atomic that it's possible we could delete wayland resources for an
EGLStream before the compositor even finishes using them and thus run
into errors. So, we use quite a bit of tracking logic to keep EGLStream
objects alive until we know the compositor isn't using them (even if
this means the stream outlives the pixmap it backed).

While the default backend for glamor remains GBM, this patch exists for
users who have had to deal with the reprecussion of their GPU
manufacturers ignoring the advice of upstream and the standardization of
GBM across most major GPU manufacturers. It is not intended to be a
final solution to the GBM debate, but merely a baindaid so our users
don't have to suffer from the consequences of companies avoiding working
upstream. New drivers are strongly encouraged not to use this as a
backend, and use GBM like everyone else. We even spit this out as an
error from Xwayland when using the eglstream backend.

Signed-off-by: Lyude Paul <lyude@redhat.com>
Acked-by: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
2018-04-24 16:51:18 -04:00
..
.gitignore .gitignore: use common defaults with custom section #24239 2009-11-11 21:40:20 -08:00
busfault.h Trap SIGBUS to handle truncated shared memory segments 2013-11-11 15:16:07 -08:00
callback.h Avoid starting a comment with */* 2014-07-17 10:19:52 -07:00
client.h Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
closestr.h Replace 'pointer' type with 'void *' 2014-01-12 10:24:11 -08:00
closure.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
colormap.h dix: Unexport various implementation details 2015-07-08 16:40:57 -04:00
colormapst.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
cursor.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
cursorstr.h cursor: drop ARGB_CURSOR 2015-06-30 12:17:51 +10:00
dbus-core.h xfree86: drop double-typedef of DBusConnection 2014-11-12 10:25:00 +10:00
displaymode.h vidmode: move display mode definitions 2016-02-29 16:28:57 -05:00
dix-config-apple-verbatim.h Move the apple fat binary hacks back to a header file, and make it apple-only. 2009-01-30 16:36:45 -08:00
dix-config.h.in dix: Remove unused definitions from dix-config.h.in 2018-03-28 09:54:18 -04:00
dix.h dix: Remove ffs.c 2017-11-06 17:22:46 -05:00
dixaccess.h Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
dixevents.h dix: Remove redundant declarations. 2012-05-14 13:31:00 +01:00
dixfont.h dix: Switch to the libXfont2 API (v2) 2016-07-18 15:25:59 -04:00
dixfontstr.h dix: Switch to the libXfont2 API (v2) 2016-07-18 15:25:59 -04:00
dixgrabs.h Avoid starting a comment with */* 2014-07-17 10:19:52 -07:00
dixstruct.h os: Define {ReadFdFrom,WriteFdTo}Client unconditionally 2018-03-08 14:12:36 -05:00
eventconvert.h input: drop FP1616 macro 2012-11-19 12:12:23 +10:00
events.h dga: #if XFreeXDGA → #ifdef XFreeXDGA 2018-02-19 13:14:43 -05:00
eventstr.h dga: #if XFreeXDGA → #ifdef XFreeXDGA 2018-02-19 13:14:43 -05:00
exevents.h dix: Move DeviceFocusEvent from Xi into enterleave.c 2012-05-17 08:50:44 +10:00
extension.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
extinit.h miinitext: Load GLX on the mi path 2018-02-14 17:04:48 -05:00
extnsionst.h dix: Remove extension aliases 2017-06-20 16:37:24 -04:00
gc.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
gcstruct.h fb: Remove 24bpp support (v3) 2017-03-17 15:14:42 -04:00
globals.h miinitext: General cleanup (v2) 2018-01-22 17:28:12 -05:00
glx_extinit.h miinitext: Load GLX on the mi path 2018-02-14 17:04:48 -05:00
glxvndabi.h glx: Import glxvnd server module (v2) 2018-02-14 17:04:35 -05:00
hotplug.h config: Replace OdevAttributes linked list with struct 2014-07-17 17:10:48 -07:00
input.h os: log a bug whenever WriteToClient is called from the input thread 2017-02-27 09:25:08 +10:00
inputstr.h miinitext: General cleanup (v2) 2018-01-22 17:28:12 -05:00
inpututils.h Input: Add DeviceEventSource enum 2015-11-24 11:36:32 +10:00
list.h Correct xorg_list_is_empty return value description 2018-02-12 08:09:53 +10:00
Makefile.am meson: Generate xorg-server.h 2018-03-28 09:54:22 -04:00
meson.build xwayland: Add glamor egl_backend for EGLStreams 2018-04-24 16:51:18 -04:00
misc.h modesetting: Fix potential buffer overflow 2017-10-30 13:44:34 -04:00
miscstruct.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
nonsdk_extinit.h Make PseudoramiXExtensionInit() prototype more generally available 2015-03-16 16:56:17 +00:00
opaque.h configurable maximum number of clients 2015-08-24 00:00:18 -07:00
optionstr.h Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
os.h os: move xf86PrivsElevated here 2018-03-21 10:58:39 -04:00
pixmap.h Make PixmapDirtyUpdateRec::src a DrawablePtr 2017-08-15 17:01:39 +09:00
pixmapstr.h Make PixmapDirtyUpdateRec::src a DrawablePtr 2017-08-15 17:01:39 +09:00
privates.h dix: Remove PRIVATE_DAMAGE 2017-03-21 11:20:26 -04:00
probes.h Get rid of const warnings in XSERVER_INPUT_EVENT dtrace probe calls 2015-02-10 18:14:44 -08:00
property.h dix: Add a callback chain for window property state change 2017-02-23 13:30:11 -05:00
propertyst.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
protocol-versions.h present: Advertise protocol version 1.2 2018-03-19 15:44:46 -04:00
ptrveloc.h dix: indentation fixes for pointer acceleration 2012-05-16 10:59:35 +10:00
region.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
regionstr.h dix: make RegionInit legal C++ 2015-01-23 10:35:49 -08:00
registry.h XSERVER_DTRACE needs request names from registry too 2014-09-22 12:00:46 -07:00
resource.h dix: export ResourceClientBits() 2015-09-01 20:11:26 -07:00
rgb.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
screenint.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
scrnintstr.h Make PixmapDirtyUpdateRec::src a DrawablePtr 2017-08-15 17:01:39 +09:00
selection.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
servermd.h dix: Fix image byte order on big endian hardware 2015-05-07 14:03:50 -04:00
site.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
swaprep.h dix: Unexport various implementation details 2015-07-08 16:40:57 -04:00
swapreq.h dix: Unexport various implementation details 2015-07-08 16:40:57 -04:00
systemd-logind.h systemd-logind: let the logind code decided whether to close an fd 2014-05-05 07:26:33 +10:00
validate.h Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
version-config.h.in Move VENDOR_* defines from AC_SUBST to a header to avoid angering shave. 2009-04-14 10:35:44 -04:00
vidmodestr.h vidmode: build without xf86vidmodeproto 2016-03-01 11:25:59 -05:00
window.h dix: Add hybrid full-size/empty-clip mode to SetRootClip 2016-02-22 13:26:31 -05:00
windowstr.h dix: unifdef pWin->rootlessUnhittable 2015-07-08 16:41:28 -04:00
XIstubs.h Introduce a consistent coding style 2012-03-21 13:54:42 -07:00
xkb-config.h.in Move to autoconf standard function name checks & defines 2011-12-05 14:32:45 -08:00
xkbfile.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
xkbrules.h xkb: add a call to init an XkbRMLVOSet from const chars 2014-02-04 10:53:59 +10:00
xkbsrv.h dix: Don't track the XKB client versions in the ClientRec 2017-10-24 15:53:28 -04:00
xkbstr.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
xorg-config.h.in xfree86: Silence a new glibc warning 2017-05-03 15:44:06 -04:00
xorg-config.h.meson.in Add a Meson build system alongside autotools. 2017-04-26 15:25:27 -07:00
xorg-server.h.in xorg: Remove unused definitions from xorg-server.h.in 2018-03-28 09:54:17 -04:00
xorg-server.h.meson.in meson: Generate xorg-server.h 2018-03-28 09:54:22 -04:00
Xprintf.h os/xprintf: add Xvscnprintf and Xscnprintf 2012-05-03 14:59:23 +10:00
xserver_poll.h Use #ifdef instead of #if for features to make Meson easier. 2017-04-26 17:30:12 -04:00
xserver-properties.h Add missing labels for multitouch valuators 2012-10-30 15:11:10 +10:00
xsha1.h Drop trailing whitespaces 2014-11-12 10:25:00 +10:00
xwayland-config.h.in xwayland: Add glamor egl_backend for EGLStreams 2018-04-24 16:51:18 -04:00
xwayland-config.h.meson.in xwayland: Add glamor egl_backend for EGLStreams 2018-04-24 16:51:18 -04:00
xwin-config.h.in configure: Restore DEFAULT_LOGDIR to xwin-config.h, it is used 2014-06-02 13:07:46 +01:00
xwin-config.h.meson.in Add meson.build for XWin server (v2) 2017-06-02 09:32:35 -07:00