Re: Adding synchronization to the WM spec
James Jones <[email protected]> Tue, 1 Nov 2011 22:43:55 -0700
| Newsgroups | gmane.comp.gnome.wm-spec |
|---|---|
| Message-ID | <[email protected]> |
I'm trying to make time to read through your proposals/code in more detail, but my record in the "making time for things" area is pretty abysmal, so some brief initial comments on the un-implemented fence-sync portion of the spec below: On 10/29/11 9:29 AM, Owen Taylor wrote: > There are quite a few outstanding issues related to synchronization > between applications and the compositor. We want the compositor > to avoid drawing a window when it is only half done with an update, > we want to throttle the drawing rate in the application, and we > need to incorporate NVIDIA's fence sync objects if we want to get > composited drawing correct with their driver. > > This update to the window manager specification attempts to address > these needs in a unified way. What I'm basically proposing here is: > > * A new form of _NET_WM_SYNC_REQUEST where a client can update > the counter to an odd value saying "I'm starting the frame" > and to an even value to end the frame. I don't consider this messy. Fence syncs were always meant to be used as companions to counters. My sample compiz code bundles them together as well to optimize their usage (I know, I'm nearly a year late on publishing this now. I'll get it out soon*). > * A message _NET_WM_SYNC_DRAWN that is sent when the compositor > has drawn the frame. > > * A property _NET_WM_SYNC_FENCES that can be combined with the > counter value to find an appropriate fence to wait on. > > I did implementations of the first two for Mutter a while ago to > validate the ideas; the third portion is, so far, just speculative. > > The details are found in the attached patch to the WM Spec. > (I've filed a bug against freedesktop sysadmin to get the wm-spec > moved over to git.) > > What the patch is about is basically "frames", but I've avoided > the term in the spec, because of confusion with window decoration > frames. > > Potential issues: > > * The bundling of the a legacy counter and a new counter into > _NET_WM_SYNC_REQUEST counter could be considered messy > It does save fetching another property at startup, and the behavior > described here tightly couples the two counters to avoid excessive > duplication and unclear interactions. > > * I'm not really sure how the fence synchronization is supposed > to work for the case of a direct rendering GL client. Is the combination > of glXSwapBuffers() and XSyncTriggerFence() sufficient? Good point. This is messy specification-wise, but in practice, I think this is indeed sufficient. Our implementation always sends damage events for GL rendering only after the rendering that generates the damage has been completed on the GPU, and from what I understand, open source implementations order their accesses to the surfaces implicitly and/or do the swap operation in the GLX server anyway, so the XSyncTriggerFence() isn't strictly necessary, but it isn't particularly harmful if you want to leave it to keep the design clean. The composite manager will wait for both the fence sync and the damage event I assume, so even though the fence trigger doesn't execute in the right GPU thread, it will work out right. At some point I would like to add a second GL extension that allows triggering the X Sync Fence objects from GL so this could be done properly, but it's low priority given the above. I omitted it from the initial spec because it's much harder to implement efficiently. One problem I see with your spec: When are the fence sync objects reset? In the current form, it will only run properly for "L" iterations. I've found this non-trivial to solve efficiently in my code (but very doable). The solution you'll need is slightly different, since the consumer and producer of fence sync triggers are separate applications. Thanks, -James > * It's unclear to me exactly what timing information (if any) it's > useful to include in _NET_WM_SYNC_DRAWN. I've just omitted all > information in this draft, I'll try to work through the various > use cases and come up with a proposal later. > > Some references: > > I originally brought up the need to be able to do an atomic frame: > http://mail.gnome.org/archives/wm-spec-list/2009-June/msg00002.html > > The idea of using two counters in the _NET_WM_SYNC_REQUEST comes from > Denis Dzyubenko: > http://mail.gnome.org/archives/wm-spec-list/2009-July/msg00005.html > > Information about how the sync fence objects are used for GPU-level > synchronization can be found in: > http://lists.x.org/archives/xorg-devel/2010-December/016510.html > > The relevant additions to the Sync extension for fences are found in: > http://cgit.freedesktop.org/xorg/proto/xextproto/commit/?id=9ba2065b63ea0e61a17b8221ad454c02a1755373 > > And are used with: > http://www.opengl.org/registry/specs/ARB/sync.txt > http://www.opengl.org/registry/specs/EXT/x11_sync_object.txt > nv-public ----------------------------------------------------------------------------------- This email message is for the sole use of the intended recipient(s) and may contain confidential information. Any unauthorized review, use, disclosure or distribution is prohibited. If you are not the intended recipient, please contact the sender by reply email and destroy all copies of the original message. -----------------------------------------------------------------------------------