static void MaliDRI2CopyRegion(DrawablePtr pDraw, RegionPtr pRegion, DRI2BufferPtr pDstBuffer, DRI2BufferPtr pSrcBuffer) { GCPtr pGC; RegionPtr copyRegion; ScreenPtr pScreen = pDraw->pScreen; MaliDRI2BufferPrivatePtr privates; PixmapPtr pScratchPixmap; privates = (MaliDRI2BufferPrivatePtr)pSrcBuffer->driverPrivate; if (privates->depth != pDraw->depth) { ErrorF("MaliDRI2CopyRegion: privates->depth != pDraw->depth (%d vs. %d)\n", privates->depth, pDraw->depth); return; } //ErrorF("MaliDRI2CopyRegion dstbuf=%p srcbuf=%p, depth=%d\n", pDstBuffer, pSrcBuffer, privates->depth); ump_cache_operations_control(UMP_CACHE_OP_START); ump_switch_hw_usage_secure_id(pSrcBuffer->name, UMP_USED_BY_CPU); ump_cache_operations_control(UMP_CACHE_OP_FINISH); pGC = GetScratchGC(pDraw->depth, pScreen); pScratchPixmap = GetScratchPixmapHeader(pScreen, privates->width, privates->height, privates->depth, pSrcBuffer->cpp * 8, pSrcBuffer->pitch, privates->addr); copyRegion = REGION_CREATE(pScreen, NULL, 0); REGION_COPY(pScreen, copyRegion, pRegion); (*pGC->funcs->ChangeClip)(pGC, CT_REGION, copyRegion, 0); ValidateGC(pDraw, pGC); (*pGC->ops->CopyArea)(pScratchPixmap, pDraw, pGC, 0, 0, pDraw->width, pDraw->height, 0, 0); FreeScratchPixmapHeader(pScratchPixmap); FreeScratchGC(pGC); ump_cache_operations_control(UMP_CACHE_OP_START); ump_switch_hw_usage_secure_id(pSrcBuffer->name, UMP_USED_BY_MALI); ump_cache_operations_control(UMP_CACHE_OP_FINISH); }
static Bool maliPrepareAccess(PixmapPtr pPix, int index) { ScreenPtr pScreen = pPix->drawable.pScreen; ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; MaliPtr fPtr = MALIPTR(pScrn); PrivPixmap *privPixmap = (PrivPixmap *)exaGetPixmapDriverPrivate(pPix); mali_mem_info *mem_info; IGNORE(index); if (!privPixmap) { ERROR_MSG("Failed to get private pixmap data"); return FALSE; } mem_info = privPixmap->mem_info; if (NULL != mem_info) { if (privPixmap->refs == 0) { if (privPixmap->isFrameBuffer) { privPixmap->addr = (unsigned long)fPtr->fbmem; } else { privPixmap->addr = (unsigned long)ump_mapped_pointer_get(mem_info->handle); } privPixmap->addr += mem_info->offset; } } else { ERROR_MSG("No mem_info on pixmap"); return FALSE; } pPix->devPrivate.ptr = (void *)(privPixmap->addr); if (NULL == pPix->devPrivate.ptr) { ERROR_MSG("cpu address not set"); return FALSE; } privPixmap->refs++; if (!privPixmap->isFrameBuffer) { int secure_id = 0; _lock_item_s item; secure_id = ump_secure_id_get(mem_info->handle); if (secure_id) { item.secure_id = secure_id; item.usage = _LOCK_ACCESS_CPU_WRITE; if (fPtr->fd_umplock > 0) { ioctl(fPtr->fd_umplock, LOCK_IOCTL_CREATE, &item); if (ioctl(fPtr->fd_umplock, LOCK_IOCTL_PROCESS, &item) < 0) { int max_retries = 5; ERROR_MSG("Unable to process lock item with ID 0x%x - throttling\n", item.secure_id); while ((ioctl(fPtr->fd_umplock, LOCK_IOCTL_PROCESS, &item) < 0) && max_retries) { usleep(2000); max_retries--; } if (max_retries == 0) { ERROR_MSG("Warning: Max retries == 0\n"); } } } if (fPtr->use_cached_ump) { ump_cache_operations_control(UMP_CACHE_OP_START); ump_switch_hw_usage_secure_id(item.secure_id, UMP_USED_BY_CPU); ump_cache_operations_control(UMP_CACHE_OP_FINISH); } } } return TRUE; }