glXSwapBuffers fix for moving between crtcs is not following the OML_sync_control specification
Mario Kleiner
mario.kleiner at tuebingen.mpg.de
Fri Jul 9 09:07:25 PDT 2010
On Jul 9, 2010, at 3:40 PM, Michel Dänzer wrote:
> On Fre, 2010-07-09 at 16:20 +0300, Pauli Nieminen wrote:
>>
>> This commit assumes that MSC maybe different depending on where the
>> drawable is. While specification says "For a multi-monitor system,
>> the
>> monitor used to determine MSC is screen 0 of <display>." which IMO
>> means that there should be single MSC everywhere were target drawable
>> can move. So correct fix would be making MSC value in-depend of CRTC
>> where drawable is.
That commit only fixes the glXSwapBuffers() case, which is not
defined in the OML_sync_control extension. I couldn't find any
specification of how glXSwapBuffers should behave wrt. drawable on
different crtc's, e.g., SGI_swap_control doesn't talk about such
multi-monitor issues. In that sense the patch doesn't violate a
specification, because the behaviour is unspecified.
Currently we have proper behaviour while the drawable is on a given
crtc - it obeys swap_interval. For the swap that happens between a
move of the drawable from one crtc to the other, we have a small
timing glitch: The swap_interval setting is ignored for that swap -
it swaps on the next retrace, as if swap_interval is 1. But then a
swap_interval of 1 is the default setting and probably what almost
all "standard" client apps use anyway.
We could do a bit better and avoid that single glitch by mapping msc
count from the crtc where the drawable was to the crtc where the
drawable is now. But that would need us to keep track of the previous
crtc of a drawable and we'd need new DDX entry points to query the
current msc of any given crtc and the current crtc of a given
drawable from within the server. Currently this info is only
available in the DDX itself. Something like (pseudo-code):
if (current_crtc != previous_crtc)
last_swap_target = last_swap_target + (msc(current_crtc) - msc
(previous_crtc));
Not sure if avoiding this small glitch is worth the hassle of two new
entry points?
If you use the glXSwapBuffersMscOML() command or other
OML_sync_control commands then the commit doesn't apply. Currently it
is up to the client application to find out if a drawable moved
between crtc's inbetween swaps and handle this in a app specific manner.
From the perspective of a toolkit developer i like this "do it
yourself" behaviour for glXSwapBuffersMscOML(). OML_sync_control
provides all the neccessary tools for a client app to detect and
handle such situations in a way that leaves the application in
control. Apps that use OML_sync_control will likely care very much
about very precise visual timing. Some automagic corrections like the
above for glXSwapBuffers() could spoil the day of someone (e.g.,
me ;) ) that needs very precise timing control and uses
OML_sync_control for that purpose.
>
> I agree there *should* be such a single MSC, the question is how it
> should be calculated when the CRTCs don't all have the same vertical
> refresh rate.
I guess OML_sync_control was specified at a time when systems with
multiple-displays for one screen didn't exist, at least not ones with
different refresh rates for the same screen. If you think about how
applications would use the extension to precisely schedule swaps, i
think the assumption is that the drawable will usually not move
between crtc's or that all crtc's work perfectly synchronized with
the same refresh rate, e.g., for multi-display virtual reality
applications.
>
> For the old intel DRI1 swap scheduling hack, I solved this by
> making the
> MSC not correspond to any specific CRTC counter directly but making
> it a
> 'virtual' counter which increases at the same rate as the CRTC the
> window is currently being synchronized to. Looking at the
> GLX_OML_sync_control spec again, I think this solution should still be
> feasible in general, as all the extension calls take a drawable
> parameter.
Hmm. I'm not sure if i as a toolkit developer would like that kind of
virtualization. What i do is i have a given target system time at
which the swap should happen - as close to that time as possible. I
use the msc count and the associated ust timestamp together with the
known video refresh rate and my given target time to translate the
target time into a target_msc. I use these counts and timestamps to
synchronize with other modalities like sound, various i/o etc. and
often need sub-millisecond accurate timing. Sometimes i need to
synchronize swaps across multiple displays. If such a virtualized
counter wouldn't be very accurate or if the associated ust timestamps
wouldn't be very accurate, i'd be in trouble and the OML_sync_control
extension would lose most of its value to me.
*********************************************************************
Mario Kleiner
Max Planck Institute for Biological Cybernetics
Spemannstr. 38
72076 Tuebingen
Germany
e-mail: mario.kleiner at tuebingen.mpg.de
office: +49 (0)7071/601-1623
fax: +49 (0)7071/601-616
www: http://www.kyb.tuebingen.mpg.de/~kleinerm
*********************************************************************
"For a successful technology, reality must take precedence
over public relations, for Nature cannot be fooled."
(Richard Feynman)
More information about the xorg-devel
mailing list