- A mapped pixmap can't be used for acceleration, any decent memory manager
will refuse this.
- Source pixmaps may need updating, so move in the pixmap unconditionally, it
should be a no-op in most cases anyway.

Signed-off-by: Maarten Maathuis <[email protected]>
---
 exa/exa_migration_mixed.c |   18 ++++++++++++------
 1 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c
index 6816e6c..77b2b2b 100644
--- a/exa/exa_migration_mixed.c
+++ b/exa/exa_migration_mixed.c
@@ -167,9 +167,12 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, 
RegionPtr pReg)
     ExaPixmapPriv(pPixmap);
 
     if (!ExaDoPrepareAccess(pPixmap, index)) {
-       Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
+       Bool has_gpu_copy;
        ExaMigrationRec pixmaps[1];
 
+late_failure:
+       has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
+
        /* Do we need to allocate our system buffer? */
        if (!pExaPixmap->sys_ptr) {
            pExaPixmap->sys_ptr = malloc(pExaPixmap->sys_pitch *
@@ -231,12 +234,15 @@ 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);
+       /* You cannot do accelerated operations while a buffer is mapped. */
+       exaFinishAccess(&pPixmap->drawable, index);
+       /* Sources with pReg are not fully in the gpu pixmap yet, as well
+        * as deferred destination pixmaps.
+        */
+       exaMoveInPixmap_mixed(pPixmap);
+       if (!ExaDoPrepareAccess(pPixmap, index))
+           goto late_failure;
 
        DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
        DamageDestroy(pExaPixmap->pDamage);
-- 
1.6.6.1

_______________________________________________
xorg-devel mailing list
[email protected]
http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to