Ejemplo n.º 1
0
static int
drmAdjustListNodes(drmBOList * list)
{
    drmBONode *node;
    drmMMListHead *l;
    int ret = 0;

    while (list->numCurrent < list->numTarget) {
	node = (drmBONode *) malloc(sizeof(*node));
	if (!node) {
	    ret = -ENOMEM;
	    break;
	}
	list->numCurrent++;
	DRMLISTADD(&node->head, &list->free);
    }

    while (list->numCurrent > list->numTarget) {
	l = list->free.next;
	if (l == &list->free)
	    break;
	DRMLISTDEL(l);
	node = DRMLISTENTRY(drmBONode, l, head);
	free(node);
	list->numCurrent--;
    }
    return ret;
}
Ejemplo n.º 2
0
static int
drmBOResetList(drmBOList * list)
{
    drmMMListHead *l;
    int ret;

    ret = drmAdjustListNodes(list);
    if (ret)
	return ret;

    l = list->list.next;
    while (l != &list->list) {
	DRMLISTDEL(l);
	DRMLISTADD(l, &list->free);
	list->numOnList--;
	l = list->list.next;
    }
    return drmAdjustListNodes(list);
}
Ejemplo n.º 3
0
Archivo: tegra.c Proyecto: 5py/libdrm
int drm_tegra_bo_create(struct drm_tegra *drm, uint32_t flags, uint32_t size,
			struct drm_tegra_bo **bop)
{
	struct drm_tegra_gem_create args;
	struct drm_tegra_bo *bo;
	int err;

	if (!drm || size == 0 || !bop)
		return -EINVAL;

	bo = calloc(1, sizeof(*bo));
	if (!bo)
		return -ENOMEM;

	DRMINITLISTHEAD(&bo->list);
	atomic_set(&bo->ref, 1);
	bo->flags = flags;
	bo->size = size;
	bo->drm = drm;

	memset(&args, 0, sizeof(args));
	args.flags = flags;
	args.size = size;

	err = drmCommandWriteRead(drm->fd, DRM_TEGRA_GEM_CREATE, &args,
				  sizeof(args));
	if (err < 0) {
		free(bo);
		return -errno;
	}

	DRMLISTADD(&bo->list, &drm->bo_list);
	bo->handle = args.handle;

	*bop = bo;

	return 0;
}
Ejemplo n.º 4
0
Archivo: tegra.c Proyecto: 5py/libdrm
int drm_tegra_bo_open(struct drm_tegra *drm, uint32_t name,
		      struct drm_tegra_bo **bop)
{
	struct drm_gem_open args;
	struct drm_tegra_bo *bo;
	int err;

	if (!drm || !name || !bop)
		return -EINVAL;

	bo = calloc(1, sizeof(*bo));
	if (!bo)
		return -ENOMEM;

	DRMINITLISTHEAD(&bo->list);
	atomic_set(&bo->ref, 1);
	bo->flags = 0;
	bo->drm = drm;

	memset(&args, 0, sizeof(args));
	args.name = name;

	err = drmIoctl(drm->fd, DRM_IOCTL_GEM_OPEN, &args);
	if (err < 0) {
		free(bo);
		return -errno;
	}

	DRMLISTADD(&bo->list, &drm->bo_list);
	bo->handle = args.handle;
	bo->size = args.size;

	*bop = bo;

	return 0;
}