wayland/protocol
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
..
.gitignore Update .gitignore for protocol/ 2013-11-19 13:26:04 -08:00
generate-shm-formats.py Add an automated script to update wl_shm.format 2019-09-06 12:09:22 +00:00
tests.xml Replace initial 8 spaces with a tab for all xml files 2020-04-29 12:21:33 +00:00
wayland.dtd Add support for the deprecated-since XML attribute 2024-04-24 16:18:28 +00:00
wayland.xml protocol: add wl_surface.discard_constraints request 2025-10-26 01:06:10 +02:00