Commit graph

18073 commits

Author SHA1 Message Date
Olivier Fourdan
070f6a99f5 xwayland: Recycle buffers when dmabuf feedback changes
Whenever the linux-dmabuf v4 feedback changes, we need to recreate the
existing buffers so they use the current linux-dmabuf v4 feedback.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 81458a86bf)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
1cb6417f74 xwayland: Try the Xwayland glamor hook to create pixmaps
When creating the window buffer's backing pixmap, try the Xwayland
glamor hook first and fallback to the regular CreatePixmap() code path
otherwise.

That allows to enable direct scanout if possible, either through the
regular dmabuf v4 code path, or from the implicit fallback code path.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 684580d06f)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
c69a0527cb xwayland: Create scanout capable BO with the fallback path
Before linux_dmabuf v4 support was added, the BO were created using
gbm_bo_create_with_modifiers() which incidentally creates scanout
capable buffers.

We now need to replicate that explicitly when using the fallback path,
with buffers window, otherwise direct scanout will not be possible in
that case.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1535
Suggested-by: Michel Dänzer <mdaenzer@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 111d318fc2)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
6aa9981825 xwayland: Add create_pixmap_for_window() to GBM backend
Add the implementation for create_pixmap_for_window() in the GBM glamor
backend.

To do so, we just rename the existing xwl_glamor_gbm_create_pixmap() as
internal and add an optional drawable parameter, so that it can be used
either from the regular CreatePixmap code path, or from the new direct
Xwayland glamor's hook.

v2: Fallback to xwl_glamor_get_modifiers() if
    xwl_glamor_get_drawable_modifiers() returned 0 modifiers. (Michel)

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 9730fb64ea)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
6af05c71de xwayland: Add a direct hook to create pixmaps with glamor
With linux dmabuf v4 support, for direct scanout support, we need more
context that just what CreatePixmap() provides, as we need the actual
drawable to invoke xwl_glamor_get_drawable_modifiers().

Add a specific hook in Xwayland's glamor implementation that we can use
for that purpose.

This is preparation work for the direct scanout fixes.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 1ac3dd77d5)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
2f7624ef2d xwayland: Check for implicit scanout availability
With implicit modifiers, DRM_FORMAT_MOD_INVALID is an allowed modifier,
to indicate that the server can support the format.

When looking for a scanout capable tranche with implicit modifiers, we
ought to check for the availability of a tranche with an invalid
modifier for the given format.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit a4c700231d)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
5340f14fa2 xwayland: Check for scanout support in tranches
The helper function xwl_feedback_is_modifier_supported() walks all the
formats of a feeedback tranche and checks for format/modifier support
availability.

Add scanout support to that so that a caller can easily restrict the
tranches to those which support scanout.

This is preparation work for the implicit scanout support, no functional
change.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 79ab129fdf)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
1a32a8c2af xwayland: Use a dedicated feedback callback for windows
Separate the callbacks for the default's feedback from the one for
regular windows.

This is preparation work to recreate the window buffer of feedback
updates, no functional change.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit 1a0cc25d48)
2023-06-01 10:22:07 +02:00
Olivier Fourdan
f03dd41290 Bump version to 23.1.1
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
2023-03-29 14:26:36 +02:00
Olivier Fourdan
5789e30d9d composite: Fix use-after-free of the COW
ZDI-CAN-19866/CVE-2023-1393

If a client explicitly destroys the compositor overlay window (aka COW),
we would leave a dangling pointer to that window in the CompScreen
structure, which will trigger a use-after-free later.

Make sure to clear the CompScreen pointer to the COW when the latter gets
destroyed explicitly by the client.

This vulnerability was discovered by:
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
(cherry picked from commit 26ef545b35)
2023-03-29 14:26:36 +02:00
Benno Schulenberg
77d77c8b44 xkbUtils: use existing symbol names instead of deleted deprecated ones
Symbols `XK_Cyrillic_DZHE` and `XK_Serbian_DZE` were pure synonyms.

(cherry picked from commit 6153c71cfb)
2023-03-29 08:17:04 +00:00
Michel Dänzer
468e2d90b4 xwayland: Prevent nested xwl_present_for_each_frame_callback calls
It could happen with the following call path:

frame_callback
 xwl_present_frame_callback
  xwl_present_msc_bump
   xwl_present_execute
    xwl_present_flip
     xwl_window_create_frame_callback

The nested loop called xwl_present_reset_timer, which may end up calling
xorg_list_del for the entry after the one frame_callback started the
chain for. This resulted in the outer loop never terminating, because
its next element wasn't hooked up to the list anymore.

We avoid this by calling xwl_present_reset_timer as needed in
frame_callback, and bailing from xwl_window_create_frame_callback if it
was called from the former.

We also catch nested calls and FatalError if they ever happen again due
to another bug.

v2:
* Leave xwl_present_reset_timer call in xwl_present_frame_callback,
  needed if xwl_present_msc_bump didn't hook up the window to the frame
  callback list again.

Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1442
(cherry picked from commit 754d6b6dd0)
2023-03-27 13:34:44 +02:00
Michel Dänzer
95119c9c60 xwayland: Refactor xwl_present_for_each_frame_callback helper
Preparation for following changes, no functional change intended.

(cherry picked from commit 4d1cd7cdc2)
2023-03-27 13:34:38 +02:00
Joshua Ashton
f217a68d59 glamor: Don't glFlush/ctx switch unless any work has been performed
`glamor_make_current` is always called before any calls to GL.

Apply some dirty-tracking to whenever we call `glamor_make_current` so
that we can avoid a decent amount of redundant GL work on each
Dispatch cycle.

Gamescope previously was waking up an empty Xwayland server with an
XQueryPointer and I noticed a significant amount of churn doing
redundant GL work.

This has been addressed on the Gamescope side as well, but avoiding any
useless GL context switches and flushes when glamor is doing nothing
is still beneficial for CPU and power usage on portable devices.

Signed-off-by: Joshua Ashton <joshua@froggi.es>
Reviewed-by: Emma Anholt <emma@anholt.net>
Acked-by: Olivier Fourdan <ofourdan@redhat.com
(cherry picked from commit 89163917e1)
2023-03-27 08:58:34 +02:00
Olivier Fourdan
603c14b96f Bump version to 23.1.0
Xwayland 23.1.0 final release

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
2023-03-22 13:53:57 +00:00
Olivier Fourdan
20170b7e10 test: Use either wayland-info or weston-info
weston-info has been deprecated for quite some time, whereas wayland-info
may not be available yet.

So we use either, depending on what's actually available.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
(cherry picked from commit fc625fe172)
2023-03-22 14:43:39 +01:00
Olivier Fourdan
7f2181bcce Bump version to 23.0.99.902
Xwayland 23.1.0 release candidate 2.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
2023-03-09 10:33:27 +01:00
Olivier Fourdan
d11237f11a xwayland: Fix uninitialised value created by a stack allocation
Commit 3c07a01c4 (xwayland: Use xdg-output name for XRandR) changed the
logic to use a fixed sized buffer allocated on the stack to pass to
RROutputCreate() which would then copy it.

Valgrind complains about this:

  == Conditional jump or move depends on uninitialised value(s)
  ==    at 0x49954B: MakeAtom (atom.c:87)
  ==    by 0x5108B3: RRMonitorCrtcName (rrmonitor.c:33)
  ==    by 0x510BBB: RRMonitorSetFromServer (rrmonitor.c:92)
  ==    by 0x511882: RRMonitorMakeList (rrmonitor.c:373)
  ==    by 0x512175: ProcRRGetMonitors (rrmonitor.c:634)
  ==    by 0x508091: ProcRRDispatch (randr.c:748)
  ==    by 0x4A860E: Dispatch (dispatch.c:546)
  ==    by 0x4B692F: dix_main (main.c:271)
  ==    by 0x431C90: main (stubmain.c:34)
  ==  Uninitialised value was created by a stack allocation
  ==    at 0x42122C: xwl_output_create (xwayland-output.c:816)

This is actually harmless, but also simple to avoid by just initializing
the content of the array with zeros, so let's just fix that.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Fixes: commit 3c07a01c4 - xwayland: Use xdg-output name for XRandR
(cherry picked from commit 1209a1bb57)
2023-03-08 18:18:28 +01:00
Jonas Ådahl
d06f270784 xwayland/glamor: Track if a xwl_pixmap uses explicit modifiers
If we allocated with implicit modifiers, then we shouldn't use the
modifier returned by gbm_bo when checking whether the modifier is
supported or not, since it won't be if the compositor only advertises
implicit modifiers, nor should we use the modifier when creating the
Wayland buffer object, as it wasn't explicitly advertised.

Fixes: c6f2598a4 ("xwayland: don't fall back to wl_drm with explicit modifier")
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit 4e20d96e8d)
2023-03-08 17:25:54 +01:00
Jonas Ådahl
8c1cad5b75 xwayland/glamor/gbm: Use helper for implicit buffer params too
Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit 9bd83c02a8)
2023-03-08 17:25:51 +01:00
Jonas Ådahl
7d05c05367 xwayland/glamor/gbm: Initialize explicit buffer params in helper
This is preparing for cleaning up the macro mess.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit af255b1651)
2023-03-08 17:25:48 +01:00
Jonas Ådahl
8e7a131e80 xwayland/glamor/gbm: Only use modifier gbm API if explicit
If we're using implicit modifiers, we'll pass NULL and zero modifiers.
Lets just use the legacy API directly instead.

Signed-off-by: Jonas Ådahl <jadahl@gmail.com>
(cherry picked from commit 08b0ea09de)
2023-03-08 17:25:45 +01:00
Simon Ser
8ff3832763 Allow disabling the SHAPE extension at runtime
To correctly render a window making use of SHAPE, a compositor
must query the shape rectangles. This may not be a desirable
feature for a Wayland compositor. Allow SHAPE to be turned off at
runtime, so that the compositor can opt-out.

Signed-off-by: Simon Ser <contact@emersion.fr>
(cherry picked from commit 21b3dad238)
2023-03-03 19:36:22 +01:00
Simon Ser
97233c9858 xwayland: use drmDevice to compare DRM devices
The linux_dmabuf_v1 protocol doesn't guarantee any DRM node type:
the compositor may send a primary node or a render node. Use
drmDevice so that device comparisons are node-type-insensitive.

Signed-off-by: Simon Ser <contact@emersion.fr>
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1447
(cherry picked from commit 6f0b9deed6)
2023-03-03 19:19:18 +01:00
Austin Shafer
bdb023b34a Add libdrm 2.4.109 requirement
Reviewed-by: Olivier Fourdan <ofourdan@redhat.com>
(cherry picked from commit 5a742ab876)
2023-03-03 19:19:02 +01:00
Olivier Fourdan
2b441cea76 xwayland: Use MAP_PRIVATE for keymaps
With wl_pointer.axis_v120 support, the wl_seat supported version has
been bumped to 8, but Xwayland is still using MAP_SHARED which is
prohibited, wl_seat version 7 and above enforces the use of MAP_PRIVATE
for keymaps.

Use MAP_PRIVATE for the keymaps mmap().

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1512
Fixes: 3a02f56b4 - hook up wl_pointer.axis_v120 events
(cherry picked from commit d5dd3f3cee)
2023-03-03 19:17:44 +01:00
Simon Ser
e1133bcd52 xwayland: don't fall back to wl_drm with explicit modifier
It's incorrect to strip an explicit modifier. Daniels' docs [1]
states:

> when importing a buffer, the user may supply `DRM_FORMAT_MOD_INVALID` as the
> buffer modifier (or not supply a modifier) to indicate that the modifier is
> unknown for whatever reason; this is only acceptable when the buffer has
> not been allocated with an explicit modifier

[1]: https://lore.kernel.org/dri-devel/20210905122742.86029-1-daniels@collabora.com/

Signed-off-by: Simon Ser <contact@emersion.fr>
(cherry picked from commit c6f2598a4e)
2023-03-03 19:17:40 +01:00
Simon Ser
fd27fc3f22 xwayland: fix error path when modifier is not supported
When the modifier is not supported by the compositor, and the
DMA-BUF contains multiple planes, xwl_pixmap->buffer is NULL.
Avoid crashing when calling wl_buffer_add_listener().

Signed-off-by: Simon Ser <contact@emersion.fr>
(cherry picked from commit 76a329e55c)
2023-03-03 19:17:35 +01:00
Olivier Fourdan
29d75b092b xwayland: Include <sys/type.h> where needed
With the addition of linux_dmabuf v4, the code adds dev_t in various
places but did not include <sys/types.h>.

While that works on glibc, it may fail to build on other libc
implementations such as musl libc.

Make sure to explicitly include <sys/types.h> where we use dev_t.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1445
Fixes: bddfe190de - Implement linux_dmabuf_feedback event handlers
(cherry picked from commit 24171bb710)
2023-03-03 19:17:30 +01:00
Olivier Fourdan
c41ff45028 Bump version to 23.0.99.901
Xwayland 23.1.0 release candidate 1.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
2023-02-22 10:20:15 +01:00
Peter Hutterer
92c54bea28 dix: fix wheel emulation lockup when a negative increment is set
The increment sign wasn't taking into account when checking if the next
value is past our current value. The result was that for negative
increments, we kept looping indefinitely, locking up the server.

Easiest to reproduce with the evdev driver which has a negative
increment on the y axis.

Fixes 0a22502c34
  dix: switch scroll button emulation to multiples of increment

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit d2158d4063)
2023-02-20 12:48:27 +00:00
Olivier Fourdan
30069ced5d Bump version to 23.0.99.1
In preparation for a 23.1 release.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
2023-02-17 10:13:34 +00:00
Michel Dänzer
987e88b2c3 meson: Change project name to xwayland
(cherry picked from commit 001f0c8938)
2023-02-17 10:13:34 +00:00
Michel Dänzer
4091776201 Don't install Xvfb
We're keeping it for unit tests, but we don't want to ship it from this
branch.

Also disable Xvfb in CI for ninja test. It's still built and used for
unit tests as part of ninja dist, but we don't want to run XTS on Xvfb.

(cherry picked from commit 0408fcb329)
2023-02-17 10:13:34 +00:00
Michel Dänzer
cfba10c7c4 meson: Build Xwayland unconditionally
And simplify build_glamor logic, we don't need the separate
glamor_option variable anymore.

(cherry picked from commit fdc61c5a3c)
(cherry picked from commit 274d54d1c3)
2023-02-17 10:13:34 +00:00
Michel Dänzer
93fde076e0 Drop miext/shadow directory
Not used on this branch.

(cherry picked from commit be7257c5d1)
2023-02-17 10:13:34 +00:00
Michel Dänzer
fae259c82f Drop EXA code
Not used on this branch.

(cherry picked from commit aa49cd5ab7)
2023-02-17 10:13:34 +00:00
Michel Dänzer
321ef5400c Drop config directory
Not used anymore on this branch.

(cherry picked from commit 23296633bb)
(cherry picked from commit d07af46a67bc8e68fa050c605bb556bc25886f16)
2023-02-17 10:13:34 +00:00
Michel Dänzer
5e992036be Drop Xephyr / kdrive DDX
(cherry picked from commit 9335ee7994)
2023-02-17 10:13:34 +00:00
Michel Dänzer
14e8b26fa8 Drop Xorg DDX
(cherry picked from commit 4f4b8e00fc)
2023-02-17 10:13:34 +00:00
Michel Dänzer
162f91ec83 Drop Xwin DDX and x86 MinGW-w64 cross build
(cherry picked from commit 8f480147f6)

This partly reverts commit d3933a24d1.
2023-02-17 10:13:34 +00:00
Michel Dänzer
b52f412f1c Drop Xnest DDX
(cherry picked from commit 69cc6a6caa)
2023-02-17 10:13:34 +00:00
Michel Dänzer
14ee43536c Drop Xquartz DDX
(cherry picked from commit 6cae4b397d)
2023-02-17 10:13:34 +00:00
Peter Hutterer
0a22502c34 dix: switch scroll button emulation to multiples of increment
The current algorithm triggers a bug in Xwayland when two devices have
different granularity of scrolling. In Xwayland, the scroll increment is
1 and all physical devices scroll through the same (x)wayland pointer
device.

This may cause events to get lost when changing devices:
- mouse scrolls by full increment, current value is 1.0
  last scroll button was sent for valuator value 0.0,
  delta is 1.0 and we emulate a button event.
- touchpad scrolls by partial increment, current value is 1.3
  last scroll button was sent for valuator value 1.0, delta is 0.3
  and no button event is emulated
- mouse scrolls by full increment, current value is -0.7,
  last scroll button was sent for valuator value 1.0, delta is -0.7
  and no button event is emulated

Thus the wheel event appears to get lost. Xwayland cannot reliably
detect this case because we don't see the physical devices.

We can work around this by instead emulating buttons whenever we cross
a multiple of increment. However, this has a drawback:
high-resolution scroll devices can now trigger a button event storm by
jittering across the multiple of increment. e.g. in the example above
the touchpad moving from 1.3 to 1.0 would cause a click, despite this
being a third of an increment.

Fixes #1339

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Acked-by: Olivier Fourdan <ofourdan@redhat.com>
2023-02-16 10:25:16 +00:00
Peter Hutterer
6f0cd15155 dix: remove pointless "flexible" x/y axis mapping
storeLastValuators() takes the index in the mask for the x and y axis.
Completely pointless because any device that doesn't have x/y on 0 and
1, respectively, is going to break in fun ways anyway. And we only have
two callers two this function, both of which hardcode 0 and 1.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
2023-02-16 10:25:16 +00:00
Adam Jackson
462b06033e present: Send a PresentConfigureNotify event for destroyed windows
This enables fixing a deadlock case on the client side, where the client
ends up blocked waiting for a Present event that will never come because
the window was destroyed. The new PresentWindowDestroyed flag allows the
client to avoid blocking indefinitely.

Signed-off-by: Adam Jackson <ajax@redhat.com>
See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/116
See-also: https://gitlab.freedesktop.org/mesa/mesa/-/issues/6685
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
2023-02-15 15:22:45 +01:00
Simon Ser
098fcedf57 xwayland: override Meson dependency
This allows developers to setup Xwayland as a subproject of a
Wayland compositor, and have it correctly pick up the features
advertised in the dependency variables.

Signed-off-by: Simon Ser <contact@emersion.fr>
2023-02-13 16:14:19 +00:00
Simon Ser
c06ba33280 xwayland: generate pkg-config file from Meson
Remove the xwayland.pc.in file:

- This avoids writing down each pkg-config variable twice: once in
  the Meson files to set the configuration data, once in the .pc.in
  file to print it.
- We'll be able to re-use the same variables for use as a
  subproject.

Signed-off-by: Simon Ser <contact@emersion.fr>
2023-02-13 16:14:19 +00:00
Olivier Fourdan
0c93394d72 xwayland: Use wl_output.name for XRandR
If wl_output provides us with an output name, use that as well.

If we have both xdg_output.name and wl_output.name (from version >= 4),
prefer the latter.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>#
See-also: https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/189
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
2023-02-13 14:41:05 +01:00
Olivier Fourdan
b63ef10f18 xwayland: Pass the wl_output version
With the wl_output protocol, the actual bind to the interface is done in
xwl_output_create().

Pass the version number from the registry so we can bind to the minimum
version.

Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Michel Dänzer <mdaenzer@redhat.com>
2023-02-13 14:41:05 +01:00