diff --git a/hw/xfree86/drivers/modesetting/present.c b/hw/xfree86/drivers/modesetting/present.c index f0a0e2704e608c5b31f01fd8d4a0aefbe5ad5463..916a153035722d7a93d55f97db3a58a3ede6788b 100644 --- a/hw/xfree86/drivers/modesetting/present.c +++ b/hw/xfree86/drivers/modesetting/present.c @@ -272,6 +272,9 @@ ms_present_check_unflip(RRCrtcPtr crtc, pixmap->devKind != drmmode_bo_get_pitch(&ms->drmmode.front_bo)) return FALSE; + if (!ms->drmmode.glamor) + return FALSE; + #ifdef GBM_BO_WITH_MODIFIERS /* Check if buffer format/modifier is supported by all active CRTCs */ gbm = ms->glamor.gbm_bo_from_pixmap(screen, pixmap); diff --git a/present/present.c b/present/present.c index 217fe1d7a00f6a6910c8f858148b6d33d3a2e332..271fe32bc8b389498171dc572f17f5cd611ff167 100644 --- a/present/present.c +++ b/present/present.c @@ -44,11 +44,19 @@ present_get_crtc(WindowPtr window) { ScreenPtr screen = window->drawable.pScreen; present_screen_priv_ptr screen_priv = present_screen_priv(screen); + RRCrtcPtr crtc = NULL; if (!screen_priv) return NULL; - return screen_priv->get_crtc(screen_priv, window); + crtc = screen_priv->get_crtc(screen_priv, window); + if (crtc && !present_screen_priv(crtc->pScreen)) { + crtc = RRFirstEnabledCrtc(screen); + } + if (crtc && !present_screen_priv(crtc->pScreen)) { + crtc = NULL; + } + return crtc; } /* diff --git a/randr/randr.c b/randr/randr.c index 3f94c2f6ca94c0df430c25b776ce6de19b1e017a..6d02c25777c9f38241a71df6b78840ae0111cbc1 100644 --- a/randr/randr.c +++ b/randr/randr.c @@ -697,6 +697,33 @@ RRFirstOutput(ScreenPtr pScreen) return NULL; } +RRCrtcPtr +RRFirstEnabledCrtc(ScreenPtr pScreen) +{ + rrScrPriv(pScreen); + RROutputPtr output; + int i, j; + + if (!pScrPriv) + return NULL; + + if (pScrPriv->primaryOutput && pScrPriv->primaryOutput->crtc && + pScrPriv->primaryOutput->pScreen == pScreen) + return pScrPriv->primaryOutput->crtc; + + for (i = 0; i < pScrPriv->numCrtcs; i++) { + RRCrtcPtr crtc = pScrPriv->crtcs[i]; + + for (j = 0; j < pScrPriv->numOutputs; j++) { + output = pScrPriv->outputs[j]; + if (output->crtc == crtc && crtc->mode) + return crtc; + } + } + return NULL; +} + + CARD16 RRVerticalRefresh(xRRModeInfo * mode) { diff --git a/randr/randrstr.h b/randr/randrstr.h index 8f427a48e7feefa0795d394fb42d59b44a043ea0..b23390575c1e0210c6c5eb7b97146da0e4221b10 100644 --- a/randr/randrstr.h +++ b/randr/randrstr.h @@ -593,6 +593,8 @@ extern _X_EXPORT Bool RRScreenInit(ScreenPtr pScreen); extern _X_EXPORT RROutputPtr RRFirstOutput(ScreenPtr pScreen); +extern _X_EXPORT RRCrtcPtr RRFirstEnabledCrtc(ScreenPtr pScreen); + extern _X_EXPORT Bool RROutputSetNonDesktop(RROutputPtr output, Bool non_desktop); extern _X_EXPORT CARD16