- When they have a gpu copy ofcource. - Use the presence of a cpu copy as a hint to fall back instead of UTS'ing in exaHWCopyNtoN.
Signed-off-by: Maarten Maathuis <[email protected]> --- exa/exa_accel.c | 8 ++++++-- exa/exa_migration_mixed.c | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/exa/exa_accel.c b/exa/exa_accel.c index 1d88acb..e17021e 100644 --- a/exa/exa_accel.c +++ b/exa/exa_accel.c @@ -508,9 +508,13 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable, * * Not taking this path for mixed pixmaps: It could only save one CPU * copy between cached memory and risks causing a more expensive - * DownloadFromScreen later on. + * DownloadFromScreen later on. This applies only to the situation where + * the driver prefers DFS, in that case PrepareAccess is failed. + * In situations where a gpu pixmap is directly accessable, pDamage and + * sys_ptr is NULL. */ - } else if (!(pExaScr->info->flags & EXA_MIXED_PIXMAPS)) { + } else if (!(pExaScr->info->flags & EXA_MIXED_PIXMAPS) || + !pDstExaPixmap->pDamage) { int bpp = pSrcDrawable->bitsPerPixel; int src_stride = exaGetPixmapPitch(pSrcPixmap); CARD8 *src = NULL; diff --git a/exa/exa_migration_mixed.c b/exa/exa_migration_mixed.c index 274fde3..5970de6 100644 --- a/exa/exa_migration_mixed.c +++ b/exa/exa_migration_mixed.c @@ -140,8 +140,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]; @@ -202,6 +203,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; } } -- 1.6.5.3 _______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
