exa: implement UTS based upload through CopyArea
- Some image viewers (eog, gqview) trigger the CopyArea path of Xext/shm.c - I'm not aware of any code path that wouldn't like UTS and trigger this code. - miDoCopy should handle src coordinate clipping. - Overlapping blits are obviously not an issue (both would have to be offscreen or not).
This commit is contained in:
parent
567cf67959
commit
1b5758bef0
|
@ -466,27 +466,59 @@ exaHWCopyNtoN (DrawablePtr pSrcDrawable,
|
||||||
goto fallback;
|
goto fallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!exaPixmapIsOffscreen(pSrcPixmap) ||
|
if (exaPixmapIsOffscreen(pDstPixmap)) {
|
||||||
!exaPixmapIsOffscreen(pDstPixmap) ||
|
/* Normal blitting. */
|
||||||
!(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap, reverse ? -1 : 1,
|
if (exaPixmapIsOffscreen(pSrcPixmap)) {
|
||||||
upsidedown ? -1 : 1,
|
if (!(*pExaScr->info->PrepareCopy) (pSrcPixmap, pDstPixmap, reverse ? -1 : 1,
|
||||||
pGC ? pGC->alu : GXcopy,
|
upsidedown ? -1 : 1,
|
||||||
pGC ? pGC->planemask : FB_ALLONES)) {
|
pGC ? pGC->alu : GXcopy,
|
||||||
|
pGC ? pGC->planemask : FB_ALLONES)) {
|
||||||
|
goto fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (nbox--)
|
||||||
|
{
|
||||||
|
(*pExaScr->info->Copy) (pDstPixmap,
|
||||||
|
pbox->x1 + dx + src_off_x,
|
||||||
|
pbox->y1 + dy + src_off_y,
|
||||||
|
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
||||||
|
pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*pExaScr->info->DoneCopy) (pDstPixmap);
|
||||||
|
exaMarkSync (pDstDrawable->pScreen);
|
||||||
|
/* UTS: mainly for SHM PutImage's secondary path. */
|
||||||
|
} else {
|
||||||
|
int bpp = pSrcDrawable->bitsPerPixel;
|
||||||
|
int src_stride = exaGetPixmapPitch(pSrcPixmap);
|
||||||
|
CARD8 *src = NULL;
|
||||||
|
|
||||||
|
if (!pExaScr->info->UploadToScreen)
|
||||||
|
goto fallback;
|
||||||
|
|
||||||
|
if (pSrcDrawable->bitsPerPixel != pDstDrawable->bitsPerPixel)
|
||||||
|
goto fallback;
|
||||||
|
|
||||||
|
if (pSrcDrawable->bitsPerPixel < 8)
|
||||||
|
goto fallback;
|
||||||
|
|
||||||
|
if (pGC && !(pGC->alu == GXcopy && EXA_PM_IS_SOLID(pSrcDrawable, pGC->planemask)))
|
||||||
|
goto fallback;
|
||||||
|
|
||||||
|
while (nbox--)
|
||||||
|
{
|
||||||
|
src = pSrcExaPixmap->sys_ptr + (pbox->y1 + dy + src_off_y) * src_stride + (pbox->x1 + dx + src_off_x) * (bpp / 8);
|
||||||
|
if (!pExaScr->info->UploadToScreen(pDstPixmap, pbox->x1 + dst_off_x,
|
||||||
|
pbox->y1 + dst_off_y, pbox->x2 - pbox->x1, pbox->y2 - pbox->y1,
|
||||||
|
(char *) src, src_stride))
|
||||||
|
goto fallback;
|
||||||
|
|
||||||
|
pbox++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else
|
||||||
goto fallback;
|
goto fallback;
|
||||||
}
|
|
||||||
|
|
||||||
while (nbox--)
|
|
||||||
{
|
|
||||||
(*pExaScr->info->Copy) (pDstPixmap,
|
|
||||||
pbox->x1 + dx + src_off_x,
|
|
||||||
pbox->y1 + dy + src_off_y,
|
|
||||||
pbox->x1 + dst_off_x, pbox->y1 + dst_off_y,
|
|
||||||
pbox->x2 - pbox->x1, pbox->y2 - pbox->y1);
|
|
||||||
pbox++;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*pExaScr->info->DoneCopy) (pDstPixmap);
|
|
||||||
exaMarkSync (pDstDrawable->pScreen);
|
|
||||||
|
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue