From b923364c5ec8251e81b4aa5fd451d9d7bb038009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Spintzyk?= Date: Fri, 18 Sep 2020 14:31:47 +0200 Subject: [PATCH] modesetting: Find crtc on secondary outputs as fallback instead of returning primary crtc MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Ɓukasz Spintzyk --- hw/xfree86/drivers/modesetting/vblank.c | 56 +++++++++++++------------ 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c index b02d75aef..2337a37ad 100644 --- a/hw/xfree86/drivers/modesetting/vblank.c +++ b/hw/xfree86/drivers/modesetting/vblank.c @@ -104,6 +104,18 @@ static int ms_box_area(BoxPtr box) return (int)(box->x2 - box->x1) * (int)(box->y2 - box->y1); } +static Bool rr_crtc_on(RRCrtcPtr crtc, Bool crtc_is_ms_hint) +{ + if (!crtc) { + return FALSE; + } + if (crtc_is_ms_hint && crtc->devPrivate) { + return ms_crtc_on(crtc->devPrivate); + } else { + return !!crtc->mode; + } +} + Bool ms_crtc_on(xf86CrtcPtr crtc) { @@ -219,13 +231,11 @@ ms_covering_xf86_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms) static RRCrtcPtr ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms) { - ScrnInfoPtr scrn = xf86ScreenToScrn(pScreen); rrScrPrivPtr pScrPriv; RRCrtcPtr crtc, best_crtc; int coverage, best_coverage; int c; BoxRec crtc_box, cover_box; - Bool crtc_on; best_crtc = NULL; best_coverage = 0; @@ -241,14 +251,8 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms) for (c = 0; c < pScrPriv->numCrtcs; c++) { crtc = pScrPriv->crtcs[c]; - if (screen_is_ms) { - crtc_on = ms_crtc_on((xf86CrtcPtr) crtc->devPrivate); - } else { - crtc_on = !!crtc->mode; - } - /* If the CRTC is off, treat it as not covering */ - if (!crtc_on) + if (!rr_crtc_on(crtc, screen_is_ms)) continue; ms_randr_crtc_box(crtc, &crtc_box); @@ -260,32 +264,27 @@ ms_covering_randr_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms) } } - /* Fallback to primary crtc for drawable's on secondary outputs */ - if (best_crtc == NULL && !pScreen->isGPU) { - RROutputPtr primary_output = NULL; + return best_crtc; +} + +static RRCrtcPtr +ms_covering_randr_crtc_on_secondary(ScreenPtr pScreen, BoxPtr box) +{ + if (!pScreen->isGPU) { ScreenPtr secondary; - - if (dixPrivateKeyRegistered(rrPrivKey)) - primary_output = ms_first_output(scrn->pScreen); - if (!primary_output || !primary_output->crtc) - return NULL; - - crtc = primary_output->crtc; - if (!ms_crtc_on((xf86CrtcPtr) crtc->devPrivate)) - return NULL; + RRCrtcPtr crtc = NULL; xorg_list_for_each_entry(secondary, &pScreen->secondary_list, secondary_head) { if (!secondary->is_output_secondary) continue; - if (ms_covering_randr_crtc(secondary, box, FALSE)) { - /* The drawable is on a secondary output, return primary crtc */ + crtc = ms_covering_randr_crtc(secondary, box, FALSE); + if (crtc) return crtc; - } } } - return best_crtc; + return NULL; } xf86CrtcPtr @@ -306,6 +305,7 @@ RRCrtcPtr ms_randr_crtc_covering_drawable(DrawablePtr pDraw) { ScreenPtr pScreen = pDraw->pScreen; + RRCrtcPtr crtc = NULL; BoxRec box; box.x1 = pDraw->x; @@ -313,7 +313,11 @@ ms_randr_crtc_covering_drawable(DrawablePtr pDraw) box.x2 = box.x1 + pDraw->width; box.y2 = box.y1 + pDraw->height; - return ms_covering_randr_crtc(pScreen, &box, TRUE); + crtc = ms_covering_randr_crtc(pScreen, &box, TRUE); + if (!crtc) { + crtc = ms_covering_randr_crtc_on_secondary(pScreen, &box); + } + return crtc; } static Bool