glxsync - explicit frame synchronization sample implementation

Eero Tamminen eero.t.tamminen at intel.com
Thu Dec 30 10:19:48 UTC 2021


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?


	- 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.
> 
> - 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