/* Migrate pixmap to UMP buffer */ static struct armsoc_bo * MigratePixmapToGEM(struct ARMSOCRec *pARMSOC, DrawablePtr pDraw) { PixmapPtr pPixmap = (PixmapPtr) pDraw; ScreenPtr pScreen = pPixmap->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; struct armsoc_bo *bo = armsoc_bo_from_drawable(pDraw); uint32_t pitch; unsigned char *addr; if (bo) { DEBUG_MSG("MigratePixmapToGEM %p, already exists = %p\n", pPixmap, bo); armsoc_bo_reference(bo); return bo; } /* create the GEM buffer */ bo = armsoc_bo_new_with_dim(pARMSOC->dev, pDraw->width, pDraw->height, pDraw->depth, pDraw->bitsPerPixel, ARMSOC_BO_NON_SCANOUT); if (!bo) { ErrorF("MigratePixmapToGEM: bo alloc failed\n"); return NULL; } addr = armsoc_bo_map(bo); pitch = armsoc_bo_pitch(bo); /* copy the pixel data to the new location */ if (pitch == pPixmap->devKind) { memcpy(addr, pPixmap->devPrivate.ptr, armsoc_bo_size(bo)); } else { int y; unsigned char *data = pPixmap->devPrivate.ptr; for (y = 0; y < pPixmap->drawable.height; y++) { memcpy(addr + y * pitch, data + y * pPixmap->devKind, pPixmap->devKind); } } armsoc_bo_set_backup(bo, pPixmap->devKind, pPixmap->devPrivate.ptr); pPixmap->devKind = pitch; pPixmap->devPrivate.ptr = addr; armsoc_bo_set_drawable(bo, pDraw); DEBUG_MSG("MigratePixmapToGEM %p, new buf = %p\n", pPixmap, bo); return bo; }
static void ARMSOCDRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion, DRI2BufferPtr pDstBuffer, DRI2BufferPtr pSrcBuffer) { ScreenPtr pScreen = pDraw->pScreen; ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); RegionPtr pCopyClip; GCPtr pGC; PixmapPtr pScratchPixmap; struct ARMSOCDRI2BufferRec *src = ARMSOCBUF(pSrcBuffer); DEBUG_MSG("pDraw=%p, pDstBuffer=%p pSrcBuffer=%p", pDraw, pDstBuffer, pSrcBuffer); pGC = GetScratchGC(pDraw->depth, pScreen); if (!pGC) return; pCopyClip = REGION_CREATE(pScreen, NULL, 0); RegionCopy(pCopyClip, pRegion); (*pGC->funcs->ChangeClip) (pGC, CT_REGION, pCopyClip, 0); ValidateGC(pDraw, pGC); /* If the dst is the framebuffer, and we had a way to * schedule a deferred blit synchronized w/ vsync, that * would be a nice thing to do utilize here to avoid * tearing.. when we have sync object support for GEM * buffers, I think we could do something more clever * here. */ pScratchPixmap = GetScratchPixmapHeader(pScreen, armsoc_bo_width(src->bo), armsoc_bo_height(src->bo), armsoc_bo_depth(src->bo), armsoc_bo_bpp(src->bo), armsoc_bo_pitch(src->bo), armsoc_bo_map(src->bo)); pGC->ops->CopyArea((DrawablePtr) pScratchPixmap, pDraw, pGC, 0, 0, pDraw->width, pDraw->height, 0, 0); FreeScratchPixmapHeader(pScratchPixmap); FreeScratchGC(pGC); }
int armsoc_bo_clear(struct armsoc_bo *bo) { unsigned char *dst; assert(bo->refcnt > 0); dst = armsoc_bo_map(bo); if (!dst) { xf86DrvMsg(-1, X_ERROR, "Couldn't map scanout bo\n"); return -1; } if (armsoc_bo_cpu_prep(bo, ARMSOC_GEM_WRITE)) { xf86DrvMsg(-1, X_ERROR, " %s: armsoc_bo_cpu_prep failed - unable to synchronise access.\n", __func__); return -1; } memset(dst, 0x0, bo->size); (void)armsoc_bo_cpu_fini(bo, ARMSOC_GEM_WRITE); return 0; }