summaryrefslogtreecommitdiff
path: root/hw/xfree86/drivers
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2016-08-24 15:00:13 +0200
committerAdam Jackson <ajax@redhat.com>2016-09-13 11:18:43 -0400
commitd8e05c04758cbcd7b5c11362cb28ce017d50098b (patch)
treec6cd4487b59e98b583ede7385ff7685c6c6b5931 /hw/xfree86/drivers
parent7ade8ba10e1e767bb510343c86573bc5d4804b92 (diff)
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 <peter@lekensteyn.nl> Reviewed-by: Adam Jackson <ajax@redhat.com> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'hw/xfree86/drivers')
-rw-r--r--hw/xfree86/drivers/modesetting/vblank.c26
1 files changed, 26 insertions, 0 deletions
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;
}