aboutsummaryrefslogtreecommitdiff
path: root/xorg-server/exa/exa_migration_mixed.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2010-02-25 07:51:00 +0000
committermarha <marha@users.sourceforge.net>2010-02-25 07:51:00 +0000
commitdca37d126746d995167a31f58d3a395ae162f5d4 (patch)
tree6f5a0e00be9e5f70d6bc341d4abdb1f14c8f79a2 /xorg-server/exa/exa_migration_mixed.c
parent23fda7c555e6c749b1d9727be5e5571a0559b9b3 (diff)
parent24bc15a386e37908396c3f6088f6fc98ceaa0f46 (diff)
downloadvcxsrv-dca37d126746d995167a31f58d3a395ae162f5d4.tar.gz
vcxsrv-dca37d126746d995167a31f58d3a395ae162f5d4.tar.bz2
vcxsrv-dca37d126746d995167a31f58d3a395ae162f5d4.zip
svn merge ^/branches/released .
Diffstat (limited to 'xorg-server/exa/exa_migration_mixed.c')
-rw-r--r--xorg-server/exa/exa_migration_mixed.c48
1 files changed, 30 insertions, 18 deletions
diff --git a/xorg-server/exa/exa_migration_mixed.c b/xorg-server/exa/exa_migration_mixed.c
index 6816e6c9b..fb4715135 100644
--- a/xorg-server/exa/exa_migration_mixed.c
+++ b/xorg-server/exa/exa_migration_mixed.c
@@ -165,9 +165,37 @@ void
exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
{
ExaPixmapPriv(pPixmap);
+ Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
+ Bool success;
+
+ success = ExaDoPrepareAccess(pPixmap, index);
+
+ if (success && has_gpu_copy && pExaPixmap->pDamage) {
+ /* 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 (success) {
+ /* 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.
+ */
+ DamageUnregister(&pPixmap->drawable, pExaPixmap->pDamage);
+ DamageDestroy(pExaPixmap->pDamage);
+ pExaPixmap->pDamage = NULL;
+
+ free(pExaPixmap->sys_ptr);
+ pExaPixmap->sys_ptr = NULL;
+
+ return;
+ }
+ }
- if (!ExaDoPrepareAccess(pPixmap, index)) {
- Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
+ if (!success) {
ExaMigrationRec pixmaps[1];
/* Do we need to allocate our system buffer? */
@@ -228,22 +256,6 @@ 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;
}
}