The 'frame' argument passed to event handlers is the plain
CRTC vblank counter that stops progressing when the
associated display is in DPMS-off mode. If we have a
DPMS-off period the frame counter and MSC will
diverge, which can cause some higher-level functions
to return incorrect values.

This patch fixes the problem by adding interpolated
vblanks to the frame counter before using it in handler
functions.

Signed-off-by: Ilija Hadzic <ihad...@research.bell-labs.com>
---
 src/radeon_dri2.c | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index ef9bd48..d0b808b 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -796,6 +796,9 @@ void radeon_dri2_frame_event_handler(unsigned int frame, 
unsigned int tv_sec,
                                M_ANY, DixWriteAccess);
     if (status != Success)
         goto cleanup;
+    if (!event->crtc)
+       goto cleanup;
+    frame += radeon_get_interpolated_vblanks(event->crtc);
 
     screen = drawable->pScreen;
     scrn = xf86ScreenToScrn(screen);
@@ -1251,6 +1254,11 @@ void radeon_dri2_flip_event_handler(unsigned int frame, 
unsigned int tv_sec,
        free(flip);
        return;
     }
+    if (!flip->crtc) {
+       free(flip);
+       return;
+    }
+    frame += radeon_get_interpolated_vblanks(flip->crtc);
 
     screen = drawable->pScreen;
     scrn = xf86ScreenToScrn(screen);
-- 
1.8.1.5

_______________________________________________
xorg-driver-ati mailing list
xorg-driver-ati@lists.x.org
http://lists.x.org/mailman/listinfo/xorg-driver-ati

Reply via email to