Bool psbInit2DBuffer(int fd, Psb2DBufferPtr buf) { int ret; void *addr; struct _drmBONode *node; struct drm_bo_info_req *req; ret = drmBOCreate(fd, PSB_2D_RELOC_BUFFER_SIZE, 0, NULL, DRM_BO_FLAG_MEM_LOCAL | DRM_BO_FLAG_EXE | DRM_BO_FLAG_READ, DRM_BO_HINT_DONT_FENCE, &buf->buffer); if (ret) return FALSE; ret = drmBOMap(fd, &buf->buffer, DRM_BO_FLAG_WRITE, 0, &addr); buf->startCmd = addr; drmBOUnmap(fd, &buf->buffer); ret = drmBOCreateList(10, &buf->bufferList); if (ret) return FALSE; buf->fd = fd; buf->curCmd = buf->startCmd; buf->startReloc = (struct drm_psb_reloc *) ((unsigned long)buf->startCmd + PSB_2D_RELOC_OFFS); buf->curReloc = buf->startReloc; buf->maxRelocs = (PSB_2D_RELOC_BUFFER_SIZE - PSB_2D_RELOC_OFFS) / sizeof(struct drm_psb_reloc); ret = psbAddValidateItem(&buf->bufferList, &buf->buffer, 0, 0, &buf->myValidateIndex, &node); if (ret) return FALSE; req = &node->bo_arg.d.req.bo_req; req->hint = DRM_BO_HINT_PRESUMED_OFFSET; req->presumed_offset = 0; /* Local memory */ return TRUE; }
/** * DRI2 */ static __DRIscreen * dri2CreateNewScreen(int scrn, int fd, unsigned int sarea_handle, const __DRIextension **extensions, const __DRIconfig ***driver_configs, void *data) { #ifdef TTM_API static const __DRIextension *emptyExtensionList[] = { NULL }; __DRIscreen *psp; unsigned int *p; drmVersionPtr version; if (driDriverAPI.InitScreen2 == NULL) return NULL; psp = _mesa_malloc(sizeof(*psp)); if (!psp) return NULL; setupLoaderExtensions(psp, extensions); version = drmGetVersion(fd); if (version) { psp->drm_version.major = version->version_major; psp->drm_version.minor = version->version_minor; psp->drm_version.patch = version->version_patchlevel; drmFreeVersion(version); } psp->extensions = emptyExtensionList; psp->fd = fd; psp->myNum = scrn; psp->dri2.enabled = GL_TRUE; if (drmBOReference(psp->fd, sarea_handle, &psp->dri2.sareaBO)) { fprintf(stderr, "Failed to reference DRI2 sarea BO\n"); _mesa_free(psp); return NULL; } if (drmBOMap(psp->fd, &psp->dri2.sareaBO, DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE, 0, &psp->dri2.sarea)) { drmBOUnreference(psp->fd, &psp->dri2.sareaBO); _mesa_free(psp); return NULL; } p = psp->dri2.sarea; while (DRI2_SAREA_BLOCK_TYPE(*p)) { switch (DRI2_SAREA_BLOCK_TYPE(*p)) { case DRI2_SAREA_BLOCK_LOCK: psp->dri2.lock = (__DRILock *) p; break; case DRI2_SAREA_BLOCK_EVENT_BUFFER: psp->dri2.buffer = (__DRIEventBuffer *) p; break; } p = DRI2_SAREA_BLOCK_NEXT(p); } psp->lock = (drmLock *) &psp->dri2.lock->lock; psp->DriverAPI = driDriverAPI; *driver_configs = driDriverAPI.InitScreen2(psp); if (*driver_configs == NULL) { drmBOUnmap(psp->fd, &psp->dri2.sareaBO); drmBOUnreference(psp->fd, &psp->dri2.sareaBO); _mesa_free(psp); return NULL; } psp->DriverAPI = driDriverAPI; return psp; #else return NULL; #endif }