From d8e05c04758cbcd7b5c11362cb28ce017d50098b Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Wed, 24 Aug 2016 15:00:13 +0200 Subject: [PATCH] modesetting: Fall back to primary crtc for vblank for drawables on slave outputs This fixes glxgears running at 1 fps when fully covering a slave-output and the modesetting driver is used for the master gpu. Reported-by: Peter Wu Reviewed-by: Adam Jackson Signed-off-by: Hans de Goede --- hw/xfree86/drivers/modesetting/vblank.c | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/hw/xfree86/drivers/modesetting/vblank.c b/hw/xfree86/drivers/modesetting/vblank.c index 35924c370..04a895269 100644 --- a/hw/xfree86/drivers/modesetting/vblank.c +++ b/hw/xfree86/drivers/modesetting/vblank.c @@ -128,6 +128,32 @@ ms_covering_crtc(ScreenPtr pScreen, BoxPtr box, Bool screen_is_ms) best_coverage = coverage; } } + + /* Fallback to primary crtc for drawable's on slave outputs */ + if (best_crtc == NULL && !pScreen->isGPU) { + RROutputPtr primary_output = NULL; + ScreenPtr slave; + + if (dixPrivateKeyRegistered(rrPrivKey)) + primary_output = RRFirstOutput(scrn->pScreen); + if (!primary_output || !primary_output->crtc) + return NULL; + + crtc = primary_output->crtc->devPrivate; + if (!ms_crtc_on(crtc)) + return NULL; + + xorg_list_for_each_entry(slave, &pScreen->slave_list, slave_head) { + if (!slave->is_output_slave) + continue; + + if (ms_covering_crtc(slave, box, FALSE)) { + /* The drawable is on a slave output, return primary crtc */ + return crtc; + } + } + } + return best_crtc; }