[PATCH xserver 1/2] modesetting: Fix reverse prime partial update issues on secondary GPU outputs
Hans de Goede
hdegoede at redhat.com
Thu Sep 15 13:47:46 UTC 2016
When using reverse prime we do 2 copies, 1 from the primary GPU's
framebuffer to a shared pixmap and 1 from the shared pixmap to the
secondary GPU's framebuffer.
This means that on the primary GPU side the copy MUST be finished,
before we start the second copy (before the secondary GPU's driver
starts processing the damage on the shared pixmap).
This fixes secondary outputs sometimes showning (some) old fb contents,
because of the 2 copies racing with each other, for an example of
what this looks like see:
https://fedorapeople.org/~jwrdegoede/IMG_20160915_130555.jpg
Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
hw/xfree86/drivers/modesetting/driver.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/hw/xfree86/drivers/modesetting/driver.c b/hw/xfree86/drivers/modesetting/driver.c
index a8e83b2..f98d6da 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);
}
--
2.9.3
More information about the xorg-devel
mailing list