diff --git a/present/present_scmd.c b/present/present_scmd.c index 123e95cae..efe1fd698 100644 --- a/present/present_scmd.c +++ b/present/present_scmd.c @@ -78,6 +78,9 @@ present_check_flip(RRCrtcPtr crtc, WindowPtr root = screen->root; present_screen_priv_ptr screen_priv = present_screen_priv(screen); + if (crtc) { + screen_priv = present_screen_priv(crtc->pScreen); + } if (reason) *reason = PRESENT_FLIP_REASON_UNKNOWN; @@ -177,11 +180,14 @@ static int present_get_ust_msc(ScreenPtr screen, RRCrtcPtr crtc, uint64_t *ust, uint64_t *msc) { present_screen_priv_ptr screen_priv = present_screen_priv(screen); + present_screen_priv_ptr crtc_screen_priv = screen_priv; + if (crtc) + crtc_screen_priv = present_screen_priv(crtc->pScreen); if (crtc == NULL) return present_fake_get_ust_msc(screen, ust, msc); else - return (*screen_priv->info->get_ust_msc)(crtc, ust, msc); + return (*crtc_screen_priv->info->get_ust_msc)(crtc, ust, msc); } static void @@ -212,7 +218,7 @@ present_queue_vblank(ScreenPtr screen, ret = present_fake_queue_vblank(screen, event_id, msc); else { - present_screen_priv_ptr screen_priv = present_screen_priv(screen); + present_screen_priv_ptr screen_priv = present_screen_priv(crtc->pScreen); ret = (*screen_priv->info->queue_vblank) (crtc, event_id, msc); } return ret; @@ -511,6 +517,9 @@ present_execute(present_vblank_ptr vblank, uint64_t ust, uint64_t crtc_msc) WindowPtr window = vblank->window; ScreenPtr screen = window->drawable.pScreen; present_screen_priv_ptr screen_priv = present_screen_priv(screen); + if (vblank && vblank->crtc) { + screen_priv=present_screen_priv(vblank->crtc->pScreen); + } if (present_execute_wait(vblank, crtc_msc)) return; diff --git a/present/present_vblank.c b/present/present_vblank.c index 3c3f3ca1c..b46370982 100644 --- a/present/present_vblank.c +++ b/present/present_vblank.c @@ -62,6 +62,10 @@ present_vblank_create(WindowPtr window, present_vblank_ptr vblank; PresentFlipReason reason = PRESENT_FLIP_REASON_UNKNOWN; + if (target_crtc) { + screen_priv = present_screen_priv(target_crtc->pScreen); + } + vblank = calloc (1, sizeof (present_vblank_rec)); if (!vblank) return NULL;