diff options
author | Maarten Maathuis <madman2003@gmail.com> | 2010-02-17 11:40:43 +0100 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2010-02-17 23:22:33 -0800 |
commit | 9623daad7c864d46b0dfcbb6e689820b96cc8115 (patch) | |
tree | 6dd2f75187da861147821a11ad0a6e988d4c41d5 /exa | |
parent | 5b9a52be7e975e59e0bbc6b43539ecaff96b2ecd (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>
Diffstat (limited to 'exa')
-rw-r--r-- | 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 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; |