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;
}
Example #2
0
/**
 * 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
}