[Xorg] Re: Damage/Composite + direct rendering clients

Andy Ritger aritger at nvidia.com
Mon May 17 13:03:55 PDT 2004



On Mon, 17 May 2004, Jim Gettys wrote:

> On Mon, 2004-05-17 at 11:41, Andy Ritger wrote:
> > I've given some thought to how best to integrate direct rendering
> > clients with Damage/Composite.  For the below discussion, I'll focus
> > on GLX as the direct rendering client but the same concepts should
> > apply to XvMC or any other direct rendering client.
> > 
> > For anyone not already familiar with the Damage and Composite
> > extensions, please see Keith Packard's description of how compositing
> > works in the modular X server:
> > 
> >     http://www.freedesktop.org/Software/TranslucentWindows
> > 
> > The relevant extensions are Damage and Composite (explanations
> > of both, as well as links to the specs are available in Keith's
> > above description).  Damage has already been integrated back into
> > the X.org X server; integration of Composite is in progress.
> > 
> > 
> > How should a direct rendering client interact with Damage/Composite?
> > There seem to be two pieces to this: damage notification, and
> > synchronization.
> > 
> > 
> > Damage Notification
> > 
> > Obviously, when rendering is performed by the X server, the X server
> > knows what regions of the X screen have been damaged so that it can
> > send notification to all Damage clients.  When a direct rendering
> > client performs the rendering, the X server does not know when the
> > rendering has been performed.  When a direct rendering client damages
> > the X screen, it needs to communicate that information to the X
> > server so that the X server can notify Damage clients of the damage.
> > 
> > Presumably, any direct rendering client today requires support from a
> > vendor-specific X module to negotiate things like window moves, etc.
> > Given that, it seems best to leave the details up to each vendor.
> > As long as the core X server exposes to X drivers some function
> > such that an X driver can inform the X server of damage, then each
> > vendor can solve the client -> server communication with whatever
> > mechanism works best with their architecture.
> > 
> > 
> > Synchronization
> > 
> > There are atleast two possible race conditions:
> > 
> >    1) client kicks off rendering, notifies X server of damage,
> >       X server sends Damage event to composite manager, composite
> >       manager sends compositing request back to server, server
> >       performs composite.  There needs to be some synchronization to
> >       guarantee that the composite is not performed until the client
> >       rendering is completed by the hardware.
> > 
> >    2) some damage occurs, composite manager sends composite request,
> >       additional rendering is performed, part of which the composite
> >       operation picks up, but the rest of the rendering is not
> >       composited until the next "frame" of the composite manager,
> >       and we see visible tearing.
> > 
> >       Consider this example: a translucent xterm partially overlaps
> >       glxgears.  If the xterm is damaged, and the composite manager
> >       requests a composite, and then glxgears is updated (between
> >       when the composite request is sent, and when the composite
> >       operation is performed), then the part of the glxgears beneath
> >       the xterm will be composited this frame of compositing.  Later,
> >       the composite manager will receive a damage event for glxgears,
> >       and will composite, causing the visible screen to be brought
> >       up to date.  But in the period of time between the first and
> >       second composites, glxgears will tear.
> > 
> >       The above xterm+glxgears scenario is not limited to direct
> >       rendering clients.  The same should be reproducible with any
> >       regular X rendering -- there is a race between when the
> >       composite manager retrieves the damage region(s), when it
> >       sends the composite requests, and any rendering protocol
> >       (or direct rendering) that is processed in between.
> > 
> >       It seems that the complete solution would be for the composite
> >       manager to perform an XGrabServer(3X11) before retrieving the
> >       damage regions, then send the compositing requests, and then
> >       XUngrabServer(3X11).  Unfortunately, that seems very heavy
> >       weight.  On the other hand, it may ensure faster compositing
> >       by effectively raising the priority of the composite manager's
> >       protocol while all other X clients are locked out.
> > 
> >       Some may be inclined to accept the tearing rather than pay
> >       the heavy weight operation of grabbing/ungrabbing around every
> >       compositing frame.  For X clients, that may be OK, but I expect
> >       the tearing will be much more pronounced with OpenGL clients,
> >       because by nature they are more often animating.
> > 
> > 
> > Perhaps the best solution is to introduce two new requests to the
> > Composite extension: a "BeginComposite" and an "EndComposite" that
> > composite managers would call, bracketing their compositing requests.
> > The X server would dispatch these requests into the X driver.
> > This would give vendors the flexibility to perform any necessary
> > synchronization to protect against the above race conditions.
> 
> My thoughts are coming at this from a different but related direction
> than yours: it is the case of an application updating the state of its
> window(s), to minimize flashing.
> 
> The thoughts I've had on this topic is to use an XSync counter: if the
> counter is even/odd, the contents of the window might be
> stable/unstable.  Incrementing a counter is very fast.
> 
> This might also fold into XSync counters for vertical retrace, as per
> the original XSync design/implementation (not implemented on Linux,
> though recently some work has been started).
> 
> A similar situation might be usable for DRI synchronization, giving
> us a common synhronization framework, both for DRI synchronization and
> for application update synchronization.
> 
> I suspect some tweaks to XSync may be necessary to get all this to work.

Thanks, Jim.  That sounds interesting.  So an app would increment
a counter for a window, indicating the window is in flux, and then
increment the counter again when it is done updating the window?
Is this meant as a hint to the X server to note send any damage
events for that window until the app indicates the window is in a
stable state?

I'm not sure I see how to apply that idea to the #2 synchronization
problem above... what did you have in mind?

Thanks,
- Andy


>                                          - Jim
> 
> -- 
> Jim Gettys <Jim.Gettys at hp.com>
> HP Labs, Cambridge Research Laboratory
> 
> 
> _______________________________________________
> xorg mailing list
> xorg at freedesktop.org
> http://freedesktop.org/mailman/listinfo/xorg
> 




More information about the xorg mailing list