diff options
Diffstat (limited to 'exa/exa_migration_mixed.c')
| -rw-r--r-- | exa/exa_migration_mixed.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c index 9587ea23f..b755b83bb 100644 --- a/exa/exa_migration_mixed.c +++ b/exa/exa_migration_mixed.c @@ -141,8 +141,9 @@ exaMoveInPixmap_mixed(PixmapPtr pPixmap) void exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) { + ExaPixmapPriv(pPixmap); + if (!ExaDoPrepareAccess(pPixmap, index)) { - ExaPixmapPriv(pPixmap); Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap); ExaMigrationRec pixmaps[1]; @@ -203,6 +204,22 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr; pPixmap->devKind = pExaPixmap->sys_pitch; pExaPixmap->use_gpu_copy = FALSE; + /* 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; + + free(pExaPixmap->sys_ptr); + pExaPixmap->sys_ptr = NULL; } } |
