static RegionPtr radeon_glamor_copy_area_nodstbo(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { ScreenPtr screen = pDstDrawable->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); PixmapPtr src_pixmap = get_drawable_pixmap(pSrcDrawable); PixmapPtr dst_pixmap = get_drawable_pixmap(pDstDrawable); struct radeon_pixmap *src_priv; RegionPtr ret = NULL; if (src_pixmap != dst_pixmap) { src_priv = radeon_get_pixmap_private(src_pixmap); if (!radeon_glamor_prepare_access_cpu_ro(scrn, src_pixmap, src_priv)) return ret; } ret = fbCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); if (src_pixmap != dst_pixmap) radeon_glamor_finish_access_cpu(src_pixmap); return ret; }
/** * Does an fbCopyArea to take care of the requested copy. */ static void ephyrCopy(PixmapPtr pDst, int srcX, int srcY, int dstX, int dstY, int w, int h) { ScreenPtr pScreen = pDst->drawable.pScreen; KdScreenPriv(pScreen); KdScreenInfo *screen = pScreenPriv->screen; EphyrScrPriv *scrpriv = screen->driver; EphyrFakexaPriv *fakexa = scrpriv->fakexa; fbCopyArea(&fakexa->pSrc->drawable, &fakexa->pDst->drawable, fakexa->pGC, srcX, srcY, w, h, dstX, dstY); }
RegionPtr vivante_unaccel_CopyArea(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty) { RegionPtr ret; vivante_prepare_drawable(pDst, ACCESS_RW); vivante_prepare_drawable(pSrc, ACCESS_RO); ret = fbCopyArea(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); vivante_finish_drawable(pSrc, ACCESS_RO); vivante_finish_drawable(pDst, ACCESS_RW); return ret; }
static RegionPtr radeon_glamor_copy_area(DrawablePtr pSrcDrawable, DrawablePtr pDstDrawable, GCPtr pGC, int srcx, int srcy, int width, int height, int dstx, int dsty) { ScreenPtr screen = pDstDrawable->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); RADEONInfoPtr info = RADEONPTR(scrn); PixmapPtr src_pixmap = get_drawable_pixmap(pSrcDrawable); PixmapPtr dst_pixmap = get_drawable_pixmap(pDstDrawable); struct radeon_pixmap *src_priv = radeon_get_pixmap_private(src_pixmap); struct radeon_pixmap *dst_priv = radeon_get_pixmap_private(dst_pixmap); RegionPtr ret = NULL; if (info->accel_state->force || (src_priv && !src_priv->bo) || (dst_priv && !dst_priv->bo)) { if (!radeon_glamor_prepare_access_gpu(dst_priv)) goto fallback; if (src_priv != dst_priv && !radeon_glamor_prepare_access_gpu(src_priv)) goto fallback; ret = info->glamor.SavedCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); radeon_glamor_finish_access_gpu_rw(info, dst_priv); if (src_priv != dst_priv) radeon_glamor_finish_access_gpu_ro(info, src_priv); return ret; } fallback: if (radeon_glamor_prepare_access_cpu_rw(scrn, dst_pixmap, dst_priv)) { if (pSrcDrawable == pDstDrawable || radeon_glamor_prepare_access_cpu_ro(scrn, src_pixmap, src_priv)) { ret = fbCopyArea(pSrcDrawable, pDstDrawable, pGC, srcx, srcy, width, height, dstx, dsty); if (pSrcDrawable != pDstDrawable) radeon_glamor_finish_access_cpu(src_pixmap); } radeon_glamor_finish_access_cpu(dst_pixmap); } return ret; }
RegionPtr uxa_check_copy_area(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC, int srcx, int srcy, int w, int h, int dstx, int dsty) { ScreenPtr screen = pSrc->pScreen; RegionPtr ret = NULL; UXA_FALLBACK(("from %p to %p (%c,%c)\n", pSrc, pDst, uxa_drawable_location(pSrc), uxa_drawable_location(pDst))); if (uxa_prepare_access(pDst, UXA_ACCESS_RW)) { if (uxa_prepare_access(pSrc, UXA_ACCESS_RO)) { ret = fbCopyArea(pSrc, pDst, pGC, srcx, srcy, w, h, dstx, dsty); uxa_finish_access(pSrc, UXA_ACCESS_RO); } uxa_finish_access(pDst, UXA_ACCESS_RW); } return ret; }