[PATCH] exa/mixed: fix gnome-panel corruption

Maarten Maathuis madman2003 at gmail.com
Mon Feb 15 10:17:17 PST 2010


- A mapped pixmap can't be used for acceleration, any decent memory manager
will refuse this.
- Source pixmaps migrated with a bounding region are incomplete (from the
gpu point of view), so do the upload unconditionally, instead of just for
deferred destination pixmaps.
- Fixes fd.o bug #26076.

Signed-off-by: Maarten Maathuis <madman2003 at gmail.com>
---
 exa/exa_migration_mixed.c |   21 +++++++++++++--------
 1 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index 6816e6c..d200917 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -165,8 +165,20 @@ void
 exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
 {
     ExaPixmapPriv(pPixmap);
+    Bool success;
+
+    if ((success = ExaDoPrepareAccess(pPixmap, index)) &&
+	    pExaPixmap->pDamage && exaPixmapHasGpuCopy(pPixmap)) {
+	/* You cannot do accelerated operations while a buffer is mapped. */
+	exaFinishAccess(&pPixmap->drawable, index);
+	/* Update the gpu view of both deferred destination pixmaps and of
+	 * source pixmaps that were migrated with a bounding region.
+	 */
+	exaMoveInPixmap_mixed(pPixmap);
+	success = ExaDoPrepareAccess(pPixmap, index);
+    }
 
-    if (!ExaDoPrepareAccess(pPixmap, index)) {
+    if (!success) {
 	Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
 	ExaMigrationRec pixmaps[1];
 
@@ -231,13 +243,6 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
     /* We have a gpu pixmap that can be accessed, we don't need the cpu copy
      * anymore. Drivers that prefer DFS, should fail prepare access. */
     } else if (pExaPixmap->pDamage && exaPixmapHasGpuCopy(pPixmap)) {
-	ExaScreenPriv(pPixmap->drawable.pScreen);
-
-	/* Copy back any deferred content if needed. */
-	if (pExaScr->deferred_mixed_pixmap &&
-	    pExaScr->deferred_mixed_pixmap == pPixmap)
-	    exaMoveInPixmap_mixed(pPixmap);
-
 	DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
 	DamageDestroy(pExaPixmap->pDamage);
 	pExaPixmap->pDamage = NULL;
-- 
1.7.0



More information about the xorg-devel mailing list