diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c index a8e83b291..f98d6da2b 100644 --- a/hw/xfree86/drivers/modesetting/driver.c +++ b/hw/xfree86/drivers/modesetting/driver.c @@ -586,13 +586,24 @@ dispatch_slave_dirty(ScreenPtr pScreen) static void redisplay_dirty(ScreenPtr screen, PixmapDirtyUpdatePtr dirty) { - + modesettingPtr ms = modesettingPTR(xf86ScreenToScrn(screen)); RegionRec pixregion; PixmapRegionInit(&pixregion, dirty->slave_dst); DamageRegionAppend(&dirty->slave_dst->drawable, &pixregion); PixmapSyncDirtyHelper(dirty); + if (!screen->isGPU) { + /* + * When copying from the master framebuffer to the shared pixmap, + * we must ensure the copy is complete before the slave starts a + * copy to its own framebuffer (some slaves scanout directly from + * the shared pixmap, but not all). + */ + if (ms->drmmode.glamor) + glamor_finish(screen); + } + DamageRegionProcessPending(&dirty->slave_dst->drawable); RegionUninit(&pixregion); }