diff options
author | marha <marha@users.sourceforge.net> | 2009-10-21 21:22:47 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-10-21 21:22:47 +0000 |
commit | e141b55eccf3c69d8ced513992e21463d37dbb03 (patch) | |
tree | eaeeeda04d5b6ce82d43d04466164b44a74d0951 /xorg-server/exa/exa_migration_mixed.c | |
parent | d0fe50e45b3a640afa51eb8f45cf7c3a0df0740b (diff) | |
parent | 1f876171067c04fc21fccd5a3051f982fd85c0f0 (diff) | |
download | vcxsrv-e141b55eccf3c69d8ced513992e21463d37dbb03.tar.gz vcxsrv-e141b55eccf3c69d8ced513992e21463d37dbb03.tar.bz2 vcxsrv-e141b55eccf3c69d8ced513992e21463d37dbb03.zip |
svn merge ^/branches/released
Diffstat (limited to 'xorg-server/exa/exa_migration_mixed.c')
-rw-r--r-- | xorg-server/exa/exa_migration_mixed.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/xorg-server/exa/exa_migration_mixed.c b/xorg-server/exa/exa_migration_mixed.c index f42c9c233..6065d7577 100644 --- a/xorg-server/exa/exa_migration_mixed.c +++ b/xorg-server/exa/exa_migration_mixed.c @@ -99,8 +99,13 @@ exaDoMigration_mixed(ExaMigrationPtr pixmaps, int npixmaps, Bool can_accel) exaCreateDriverPixmap_mixed(pPixmap); if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) { + ExaScreenPriv(pPixmap->drawable.pScreen); + pPixmap->devKind = pExaPixmap->fb_pitch; exaCopyDirtyToFb(pixmaps + i); + + if (pExaScr->deferred_mixed_pixmap == pPixmap) + pExaScr->deferred_mixed_pixmap = NULL; } pExaPixmap->offscreen = exaPixmapIsOffscreen(pPixmap); @@ -197,6 +202,9 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg) /* Move back results of software rendering on system memory copy of mixed driver * pixmap (see exaPrepareAccessReg_mixed). + * + * Defer moving the destination back into the driver pixmap, to try and save + * overhead on multiple consequent software fallbacks. */ void exaFinishAccess_mixed(PixmapPtr pPixmap, int index) { @@ -204,6 +212,16 @@ void exaFinishAccess_mixed(PixmapPtr pPixmap, int index) if (pExaPixmap->pDamage && exaPixmapIsOffscreen(pPixmap)) { DamageRegionProcessPending(&pPixmap->drawable); - exaMoveInPixmap_mixed(pPixmap); + + if (index == EXA_PREPARE_DEST || index == EXA_PREPARE_AUX_DEST) { + ExaScreenPriv(pPixmap->drawable.pScreen); + + if (pExaScr->deferred_mixed_pixmap && + pExaScr->deferred_mixed_pixmap != pPixmap) + exaMoveInPixmap_mixed(pExaScr->deferred_mixed_pixmap); + pExaScr->deferred_mixed_pixmap = pPixmap; + pPixmap->devKind = pExaPixmap->fb_pitch; + } else + exaMoveInPixmap_mixed(pPixmap); } } |