Exemple #1
0
struct sp_bo *create_sp_bo(struct sp_dev *dev, uint32_t width, uint32_t height,
		uint32_t depth, uint32_t bpp, uint32_t format, uint32_t flags)
{
	int ret;
	struct drm_mode_create_dumb cd;
	struct sp_bo *bo;

	memset(&cd, 0, sizeof(cd));

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

	cd.height = height;
	cd.width = width;
	cd.bpp = bpp;
	cd.flags = flags;

	ret = drmIoctl(dev->fd, DRM_IOCTL_MODE_CREATE_DUMB, &cd);
	if (ret) {
		printf("failed to create sp_bo %d\n", ret);
		goto err;
	}

	bo->dev = dev;
	bo->width = width;
	bo->height = height;
	bo->depth = depth;
	bo->bpp = bpp;
	bo->format = format;
	bo->flags = flags;

	bo->handle = cd.handle;
	bo->pitch = cd.pitch;
	bo->size = cd.size;

	ret = add_fb_sp_bo(bo, format);
	if (ret) {
		printf("failed to add fb ret=%d\n", ret);
		goto err;
	}

	ret = map_sp_bo(bo);
	if (ret) {
		printf("failed to map bo ret=%d\n", ret);
		goto err;
	}

	return bo;

err:
	free_sp_bo(bo);
	return NULL;
}
Exemple #2
0
void destroy_sp_dev(struct sp_dev *dev) {
	int i;

	if (dev->planes) {
		for (i = 0; i < dev->num_planes; i++) {
			if (dev->planes[i].in_use)
				put_sp_plane(&dev->planes[i]);
			if (dev->planes[i].plane)
				drmModeFreePlane(dev->planes[i].plane);
			if (dev->planes[i].bo)
				free_sp_bo(dev->planes[i].bo);
		}
		free(dev->planes);
	}
	if (dev->crtcs) {
		for (i = 0; i < dev->num_crtcs; i++) {
			if (dev->crtcs[i].crtc)
				drmModeFreeCrtc(dev->crtcs[i].crtc);
			if (dev->crtcs[i].scanout)
				free_sp_bo(dev->crtcs[i].scanout);
		}
		free(dev->crtcs);
	}
	if (dev->encoders) {
		for (i = 0; i < dev->num_encoders; i++) {
			if (dev->encoders[i])
				drmModeFreeEncoder(dev->encoders[i]);
		}
		free(dev->encoders);
	}
	if (dev->connectors) {
		for (i = 0; i < dev->num_connectors; i++) {
			if (dev->connectors[i])
				drmModeFreeConnector(dev->connectors[i]);
		}
		free(dev->connectors);
	}

	close(dev->fd);
	free(dev);
}
Exemple #3
0
void put_sp_plane(struct sp_plane *plane) {
	drmModePlanePtr p;

	/* Get the latest plane information (most notably the crtc_id) */
	p = drmModeGetPlane(plane->dev->fd, plane->plane->plane_id);
	if (p)
		plane->plane = p;

	if (plane->plane->crtc_id)
		drmModeSetPlane(plane->dev->fd, plane->plane->plane_id,
				plane->plane->crtc_id, 0, 0,
				0, 0, 0, 0, 0, 0, 0, 0);

	if (plane->bo) {
		free_sp_bo(plane->bo);
		plane->bo = NULL;
	}
	plane->in_use = 0;
}