Core Wayland window system code and protocol
Find a file
Julian Orth b60b57c407 protocol: add wl_surface.discard_constraints request
This commit defines a new discard_constraints request. This request is
intended to be used by clients that use the wp-fifo and wp-commit-timing
protocols for frame pacing but want to be able to respond immediately to
resize requests.

Consider a client using wp-fifo presenting to a display with refresh
rate 1 (unitless). The client has allocated 3 buffers O1, O2, and O3.
The client receives a resize request at time T+2. The client allocates
new buffers N1, N2, and N3 with the new size.

The following sequence of requests and events can be observed in
WAYLAND_DEBUG output:

    T+0: release(O1)
    T+0: -> attach(O1)
    T+1: release(O2)
    T+1: -> attach(O2)
    T+2: release(O3)
    T+2: -> attach(O3)
    T+2: resize request
    T+2: -> attach(N1)
    T+2: -> attach(N2)
    T+2: -> attach(N3)
    T+3: release(O1)
    T+4: release(O2)
    T+5: release(O3)
    T+6: release(N1)
    T+6: -> attach(N1)

Due to the lack of backpressure, all newly created buffers are attached
immediately at T+2. Since O1, O2, and O3 are still equeued, the content
update containing N1 will only be applied at T+5 and therefore cannot be
released any earlier than T+6, creating a presentation bubble between
T+3 and T+6.

Furthermore, even if the client did not attach N2 immediately at T+2, N1
would not become visible until T+5, which means that the client
effectively does not respond to the resize request until T+5.

This effect can be observed with the following command:

    vkcube --present_mode 2

Resizing the application window causes easily visible stutters on
displays with low refresh rates.

Note that the queue can grow unbounded if the client receives an
unbounded number of resize requests between refresh cycles.

To remedy this, this commit allows the client to hint to the compositor
that it should discard all existing constraints, if able. Since
compositor architectures might impose limitations on which constraints
the compositor is able to discard, this is left to compositor policy. It
is expected that most compositors should be able to discard wp-fifo and
wp-commit-timing constraints. Some compositors might be able to discard
buffer constraints if the buffer in question is superseded by another
buffer in a later content update.

I had considered creating per-interface requests, such as
wp_fifo_v1.discard_constraints, however, such constraints are often
created by WSI layers and an update of the WSI layer could introduce new
constraints that the client would not be aware of. To discard all
constraints, the WSI layer would have to invoke these requests and there
are no APIs for the client to communicate to the WSI layer which
behavior is desired.

Signed-off-by: Julian Orth <ju.orth@gmail.com>
2025-10-26 01:06:10 +02:00
.gitlab/issue_templates gitlab: make issue template the default 2023-11-21 15:44:31 +00:00
cursor cursor: Free theme when size check fails to avoid memory leak 2025-08-03 11:36:34 +00:00
doc doc: add a section on color management 2025-06-12 14:37:32 +03:00
egl egl: Make wayland-egl symbols check depend on wayland_egl 2025-06-08 17:30:55 +00:00
protocol protocol: add wl_surface.discard_constraints request 2025-10-26 01:06:10 +02:00
src client: add wl_display_dispatch_pending_single 2025-09-16 11:48:33 +03:00
tests client: add wl_display_dispatch_pending_single 2025-09-16 11:48:33 +03:00
.editorconfig editorconfig: add settings for the .gitlab-ci.yml file 2020-06-05 08:22:34 +10:00
.gitignore build: drop autotools 2021-03-05 09:15:04 +00:00
.gitlab-ci.yml ci: upgrade FreeBSD to 14.3 2025-07-20 02:09:35 +00:00
.mailmap Add a .mailmap file 2023-03-25 11:17:32 -05:00
.triage-policies.yml Add a triage-policies file for bugbot 2023-07-07 21:18:08 +10:00
CONTRIBUTING.md CONTRIBUTING: fix typo "excercising" 2020-12-17 16:03:14 -05:00
COPYING COPYING: Update to MIT Expat License rather than MIT X License 2015-06-12 15:31:21 -07:00
meson.build connection: Add a thread ID to WAYLAND_DEBUG output. 2025-09-15 14:45:53 +01:00
meson_options.txt meson: Use proper type for bools 2022-04-02 17:04:08 +03:00
README.md readme: convert to Markdown 2023-02-13 19:57:15 +01:00
release.sh release.sh: Don't push *all* tags 2023-01-16 10:03:54 +00:00
releasing.txt Add release.sh 2022-07-14 08:04:43 +00:00
wayland-scanner.m4 build: check wayland-scanner version 2020-01-16 17:25:06 +01:00
wayland-scanner.mk Pass input/output files as arguments to wayland-scanner 2017-08-18 15:20:24 +03:00

Wayland

Wayland is a project to define a protocol for a compositor to talk to its clients as well as a library implementation of the protocol. The compositor can be a standalone display server running on Linux kernel modesetting and evdev input devices, an X application, or a wayland client itself. The clients can be traditional applications, X servers (rootless or fullscreen) or other display servers.

The wayland protocol is essentially only about input handling and buffer management. The compositor receives input events and forwards them to the relevant client. The clients creates buffers and renders into them and notifies the compositor when it needs to redraw. The protocol also handles drag and drop, selections, window management and other interactions that must go through the compositor. However, the protocol does not handle rendering, which is one of the features that makes wayland so simple. All clients are expected to handle rendering themselves, typically through cairo or OpenGL.

Building the wayland libraries is fairly simple, aside from libffi, they don't have many dependencies:

$ git clone https://gitlab.freedesktop.org/wayland/wayland
$ cd wayland
$ meson build/ --prefix=PREFIX
$ ninja -C build/ install

where PREFIX is where you want to install the libraries.

See https://wayland.freedesktop.org for documentation.