Ejemplo n.º 1
0
/* 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;
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
}