diff options
author | marha <marha@users.sourceforge.net> | 2010-06-19 12:15:27 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2010-06-19 12:15:27 +0000 |
commit | 481fca2e77a44d0f0cd56c2732645726eec9dc6f (patch) | |
tree | 7ec3cb23280cb186027c91a3a8ff2307e10ed66f /xorg-server/hw/xfree86/dri2/dri2.c | |
parent | 85597ff9162e3fe37b73efd9b9e3d92cd793383a (diff) | |
download | vcxsrv-481fca2e77a44d0f0cd56c2732645726eec9dc6f.tar.gz vcxsrv-481fca2e77a44d0f0cd56c2732645726eec9dc6f.tar.bz2 vcxsrv-481fca2e77a44d0f0cd56c2732645726eec9dc6f.zip |
xserver and xkeyboard-config git update 19/6/2010
Diffstat (limited to 'xorg-server/hw/xfree86/dri2/dri2.c')
-rw-r--r-- | xorg-server/hw/xfree86/dri2/dri2.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/xorg-server/hw/xfree86/dri2/dri2.c b/xorg-server/hw/xfree86/dri2/dri2.c index 123bc3225..fbed587c2 100644 --- a/xorg-server/hw/xfree86/dri2/dri2.c +++ b/xorg-server/hw/xfree86/dri2/dri2.c @@ -759,6 +759,7 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, DRI2DrawablePtr pPriv;
DRI2BufferPtr pDestBuffer = NULL, pSrcBuffer = NULL;
int ret, i;
+ CARD64 ust, current_msc;
pPriv = DRI2GetDrawable(pDraw);
if (pPriv == NULL) {
@@ -803,12 +804,26 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc, * need to schedule a swap for the last swap target + the swap interval.
*/
if (target_msc == 0 && divisor == 0 && remainder == 0) {
+ /* If the current vblank count of the drawable's crtc is lower
+ * than the count stored in last_swap_target from a previous swap
+ * then reinitialize last_swap_target to the current crtc's msc,
+ * otherwise the swap will hang. This will happen if the drawable
+ * is moved to a crtc with a lower refresh rate, or a crtc that just
+ * got enabled.
+ */
+ if (!(*ds->GetMSC)(pDraw, &ust, ¤t_msc))
+ pPriv->last_swap_target = 0;
+
+ if (current_msc < pPriv->last_swap_target)
+ pPriv->last_swap_target = current_msc;
+
/*
* Swap target for this swap is last swap target + swap interval since
* we have to account for the current swap count, interval, and the
* number of pending swaps.
*/
*swap_target = pPriv->last_swap_target + pPriv->swap_interval;
+
} else {
/* glXSwapBuffersMscOML could have a 0 target_msc, honor it */
*swap_target = target_msc;
|