glxsync - explicit frame synchronization sample implementation
Michael Clark
michaeljclark at mac.com
Thu Dec 30 11:19:05 UTC 2021
On 12/30/21 11:19 PM, Eero Tamminen wrote:
> Hi,
>
> Different window managers do resizes differently. See for example:
> https://gitlab.gnome.org/GNOME/mutter/-/issues/60
>
> On which window managers did you test this?
I did mention that. I tested with the mutter compositor inside
gnome-shell, along with whichever decorator extensions are loaded from
the toolkits present in GNOME on Ubuntu 20.04 LTS and Ubuntu 21.10.
; ( for i in $(pgrep gnome-shell); do sudo lsof -p $i ; done ) | grep
mutter | awk '{ print $9; }'
/usr/lib/x86_64-linux-gnu/mutter-6/Meta-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/ClutterX11-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/Cogl-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/Clutter-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/Cally-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/CoglPango-6.typelib
/usr/lib/x86_64-linux-gnu/mutter-6/libmutter-cogl-path-6.so.0.0.0
/usr/lib/x86_64-linux-gnu/mutter-6/libmutter-cogl-6.so.0.0.0
/usr/lib/x86_64-linux-gnu/libmutter-6.so.0.0.0
One would hope folks implement standards in such a way that clients
using the documented window manager sync protocols are interoperable.
This is in fact the reasoning that spurred this email. Is there a
reference implementation for frame synchronization for X11 GLX apps?
I guess I am primarily satisfied if I can solve the artifacts on the
window manager that I use but if I am distributing an app more widely
then I might like something well-tested and a little more robust.
Does KDE implement _NET_WM_SYNC_REQUEST et al?
> - Eero
>
> On 30.12.2021 7.20, Michael Clark wrote:
>> Dear Mesa Developers,
>>
>> I have been using GLFW for tiny cross-platform OpenGL demos for some
>> time but something that has really been bothering me are the visual
>> artifacts when resizing windows. Over the last year or so I have made
>> multiple attempts at solving this issue, digging progressively deeper
>> each time, until spending the last month researching compositor
>> synchronization protocols, reading compositor code, and writing this
>> demo as a prelude to figuring out how one might fix this issue in GLFW
>> or even Chrome.
>>
>> I decided that first it might be a good idea to come up with the
>> simplest possible isolated example comprising of a near complete
>> solution without the unnecessary complexity of layering for all of the
>> cross-platform abstractions. It seems to me despite the ease this can
>> be solved with Wayland EGL, it is still useful, primarily for wider
>> compatibility, to be able to package X11 GLX applications, which is
>> the window system that I typically use when targeting Linux with GLFW.
>>
>> That brings me to _glxsync_ which is an attempt at creating a
>> minimally correct implementation of explicit frame synchronization
>> using X11, GLX, XSync and the latest compositor synchronization
>> protocols [1,2], tested to work with mutter and GNOME on Xorg or
>> Xwayland.
^^ here
>> - https://github.com/michaeljclark/glxsync/
>>
>> _glxsync_ is an X Windows OpenGL demo app using GLX and XSync extended
>> frame synchronization responding to synchronization requests from the
>> compositor in response to configuration changes for window resizes.
>> The demo updates extended synchronization counters before and after
>> frames to signal to the compositor that rendering is in progress so
>> that buffers read by the compositor are complete and matches the size
>> in configuration change events. It also has rudimentary congestion
>> control.
>>
>> _glxsync_ depends on the following X11 window system atoms:
>>
>> - _NET_WM_SYNC_REQUEST
>> - _NET_WM_SYNC_REQUEST_COUNTER
>> - _NET_WM_FRAME_DRAWN
>> - _NET_WM_FRAME_TIMINGS
>> - _NET_WM_PING
>>
>> _glxsync_ *does not* yet implement the following extensions:
>>
>> - _NET_WM_SYNC_FENCES
>> - _NET_WM_MOVERESIZE
>>
>> _glxsync_ depends on the following libraries: _X11, Xext, GLX, GL_.
>>
>> I have to say there were numerous subtle issues that I found while
>> testing this code on Ubuntu 21.10 XWayland with an Intel Mesa graphics
>> stack and Ubuntu 20.04 LTS Xorg with the NVIDIA proprietary graphics
>> stack, so I have no idea how it will fly with other drivers and am
>> very interested in feedback. There really is not much sample code that
>> I could find that addresses this issue.
>>
>> I found the Intel driver particularly finicky and there are some very
>> carefully placed XFlush calls *before* frame renders, and XSync calls
>> during congestion. There are also the beginnings of adaptive frame
>> rate using frame times and render timings stored in a circular buffer.
>> That said, there is no advanced adaptive frame rate logic beyond
>> detecting circumstances that can lead to tears with a back-off to the
>> measured short term average frame rate from statistics, and some logic
>> to delay frames when there are collisions with Expose events.
>>
>> There is also some rudimentary tracing infrastructure and some
>> carefully placed calls to poll, XEventsQueued(d, QueuedAlready),
>> XEventsQueued(d, QueuedAfterReading) to avoid blocking in XNextEvent
>> at all costs. I found it necessary to add a heuristic to avoid frame
>> submission until receiving frame timings from the compositor.
>> Intuitively one might think this makes the loop synchronous, but with
>> the NVIDIA driver, it appears the heuristic still allows multiple
>> frames to be submitted in advance. It is certainly finicky to debug.
>> There is a --no-sync option to simulate the absence of compositor
>> synchronization as a testing aid.
>>
>> There is very little back-pressure signaling to the client beyond the
>> ability to observe timings and serial numbers in frame drawn and frame
>> timing messages. It worries me that I need very careful placement of
>> XFlush and XSync to make the demo work so I would really appreciate
>> feedback if I am doing it wrong. There is some interesting potential
>> for control loops when using stats for adaptive frame rate, so I have
>> not yet attempted any sophisticated congestion control algorithm.
>>
>> In any case I am sharing this code with the hopes that folk can help
>> with testing. I was thinking to make a patch for GLFW but this was a
>> first step. I would really appreciate if folks could help test on
>> different drivers such as nouveau and amdgpu as I don't have access to
>> them. The code is currently released under the PLEASE LICENSE which is
>> practically public domain with one exception, but I am not disinclined
>> towards releasing it under an MIT license if it were found to be a
>> useful sample to add to the mesa demos.
>>
>> Is there a place in mesa-demos for a frame synchronization demo? I see
>> glsync. Is there a compositor sync example that I may have missed? I
>> can imagine with the addition of WM_MOVERESIZE it could be used for
>> tests. This is pretty much version 0.0.1. i.e. is clean enough to
>> release.
>>
>> Regards,
>> Michael Clark
>>
>> [1] https://fishsoup.net/misc/wm-spec-synchronization.html
>> [2] https://lwn.net/Articles/814587/
More information about the mesa-dev
mailing list