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 <[email protected]> --- 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 [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
