exa/mixed: pixmaps that succeed prepare access have no need for a cpu copy
- 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 <madman2003@gmail.com> Acked-by: Michel Dänzer <michel@daenzer.net> Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
parent
bb7acfbcfb
commit
fd86738733
|
@ -506,11 +506,9 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable,
|
||||||
exaMarkSync (pDstDrawable->pScreen);
|
exaMarkSync (pDstDrawable->pScreen);
|
||||||
/* UTS: mainly for SHM PutImage's secondary path.
|
/* UTS: mainly for SHM PutImage's secondary path.
|
||||||
*
|
*
|
||||||
* Not taking this path for mixed pixmaps: It could only save one CPU
|
* Only taking this path for directly accessible pixmaps.
|
||||||
* copy between cached memory and risks causing a more expensive
|
|
||||||
* DownloadFromScreen later on.
|
|
||||||
*/
|
*/
|
||||||
} else if (!(pExaScr->info->flags & EXA_MIXED_PIXMAPS)) {
|
} else if (!pDstExaPixmap->pDamage) {
|
||||||
int bpp = pSrcDrawable->bitsPerPixel;
|
int bpp = pSrcDrawable->bitsPerPixel;
|
||||||
int src_stride = exaGetPixmapPitch(pSrcPixmap);
|
int src_stride = exaGetPixmapPitch(pSrcPixmap);
|
||||||
CARD8 *src = NULL;
|
CARD8 *src = NULL;
|
||||||
|
|
|
@ -141,8 +141,9 @@ exaMoveInPixmap_mixed(PixmapPtr pPixmap)
|
||||||
void
|
void
|
||||||
exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
|
exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
|
||||||
{
|
{
|
||||||
|
ExaPixmapPriv(pPixmap);
|
||||||
|
|
||||||
if (!ExaDoPrepareAccess(pPixmap, index)) {
|
if (!ExaDoPrepareAccess(pPixmap, index)) {
|
||||||
ExaPixmapPriv(pPixmap);
|
|
||||||
Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
|
Bool has_gpu_copy = exaPixmapHasGpuCopy(pPixmap);
|
||||||
ExaMigrationRec pixmaps[1];
|
ExaMigrationRec pixmaps[1];
|
||||||
|
|
||||||
|
@ -203,6 +204,22 @@ exaPrepareAccessReg_mixed(PixmapPtr pPixmap, int index, RegionPtr pReg)
|
||||||
pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr;
|
pPixmap->devPrivate.ptr = pExaPixmap->sys_ptr;
|
||||||
pPixmap->devKind = pExaPixmap->sys_pitch;
|
pPixmap->devKind = pExaPixmap->sys_pitch;
|
||||||
pExaPixmap->use_gpu_copy = FALSE;
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue