summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaarten Maathuis <madman2003@gmail.com>2010-02-17 11:40:43 +0100
committerKeith Packard <keithp@keithp.com>2010-02-17 23:22:33 -0800
commit9623daad7c864d46b0dfcbb6e689820b96cc8115 (patch)
tree6dd2f75187da861147821a11ad0a6e988d4c41d5
parent5b9a52be7e975e59e0bbc6b43539ecaff96b2ecd (diff)
exa/mixed: fix gnome-panel corruption
- 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@gmail.com> Acked-by: Michel Dänzer <michel@daenzer.net> Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--exa/exa_migration_mixed.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index 6816e6c9b..d20091707 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;