示例#1
0
static void *bo_rockchip_create(struct omap_device *dev,
				size_t width, size_t height, uint32_t flags,
				uint32_t *handle, uint32_t *pitch)
{
	struct kms_driver *kms = dev->bo_dev;
	struct kms_bo *kms_bo;
	unsigned attr[7];

	attr[0] = KMS_WIDTH;
	attr[1] = width;
	attr[2] = KMS_HEIGHT;
	attr[3] = height;
	attr[4] = KMS_BO_TYPE;
	attr[5] = KMS_BO_TYPE_SCANOUT_X8R8G8B8;
	attr[6] = 0;

	if (kms_bo_create(kms, attr, &kms_bo))
		return NULL;

	if (kms_bo_get_prop(kms_bo, KMS_HANDLE, handle))
		return NULL;

	if (kms_bo_get_prop(kms_bo, KMS_PITCH, pitch))
		return NULL;

	return kms_bo;
}
示例#2
0
static void
crtc_load_cursor_argb_kms(xf86CrtcPtr crtc, CARD32 * image)
{
    modesettingPtr ms = modesettingPTR(crtc->scrn);
    struct crtc_private *crtcp = crtc->driver_private;
    unsigned char *ptr;

    if (!crtcp->cursor_bo) {
	unsigned attr[8];

	attr[0] = KMS_BO_TYPE;
#ifdef KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8
	attr[1] = KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
#else
	attr[1] = KMS_BO_TYPE_CURSOR;
#endif
	attr[2] = KMS_WIDTH;
	attr[3] = 64;
	attr[4] = KMS_HEIGHT;
	attr[5] = 64;
	attr[6] = 0;

        if (kms_bo_create(ms->kms, attr, &crtcp->cursor_bo))
	   return;

	if (kms_bo_get_prop(crtcp->cursor_bo, KMS_HANDLE,
			    &crtcp->cursor_handle))
	    goto err_bo_destroy;
    }

    kms_bo_map(crtcp->cursor_bo, (void**)&ptr);
    memcpy(ptr, image, 64*64*4);
    kms_bo_unmap(crtcp->cursor_bo);

    if (crtc->cursor_shown)
	drmModeSetCursor(ms->fd, crtcp->drm_crtc->crtc_id,
			 crtcp->cursor_handle, 64, 64);

    return;

err_bo_destroy:
    kms_bo_destroy(&crtcp->cursor_bo);
}
static int fb_alloc_buffer(struct private_module_t *module,
			   struct private_buffer_t *buffer,
			   const drmModeModeInfo *mode)
{
	unsigned int bo_attrs[] = {
		KMS_WIDTH, mode->hdisplay,
		KMS_HEIGHT, mode->vdisplay,
		KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
		KMS_TERMINATE_PROP_LIST,
	};
	uint32_t handles[4] = { 0 };
	uint32_t pitches[4] = { 0 };
	uint32_t offsets[4] = { 0 };
	int err;

	err = kms_bo_create(module->kms, bo_attrs, &buffer->bo);
	if (err < 0)
		goto done;

	err = kms_bo_map(buffer->bo, &buffer->vaddr);
	if (err < 0)
		goto done;

	kms_bo_get_prop(buffer->bo, KMS_HANDLE, &buffer->handle);

	handles[0] = buffer->handle;
	pitches[0] = mode->hdisplay * 2;
	err = drmModeAddFB2(module->fd, mode->hdisplay, mode->vdisplay,
			    FB_FORMAT, handles, pitches, offsets, &buffer->fb,
			    0);

done:
	if (err < 0)
		fb_free_buffer(module, buffer);

	return err;
}
示例#4
0
static struct gbm_bo *gbm_kms_bo_create(struct gbm_device *gbm,
					uint32_t width, uint32_t height,
					uint32_t format, uint32_t usage)
{
	struct gbm_kms_device *dev = (struct gbm_kms_device*)gbm;
	struct gbm_kms_bo *bo;
	unsigned attr[] = {
		KMS_BO_TYPE, KMS_BO_TYPE_SCANOUT_X8R8G8B8,
		KMS_WIDTH, 0,
		KMS_HEIGHT, 0,
		KMS_TERMINATE_PROP_LIST
	};

	GBM_DEBUG("%s: %s: %d\n", __FILE__, __func__, __LINE__);

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

	switch (format) {
		// 32bpp
	case GBM_FORMAT_ARGB8888:
	case GBM_BO_FORMAT_ARGB8888:
	case GBM_FORMAT_XRGB8888:
	case GBM_BO_FORMAT_XRGB8888:
		break;
	default:
		// unsupported...
		goto error;
	}

	if (usage & GBM_BO_USE_CURSOR_64X64)
		attr[1] = KMS_BO_TYPE_CURSOR_64X64_A8R8G8B8;
	attr[3] = width;
	attr[5] = height;

	// Create BO
	if (kms_bo_create(dev->kms, attr, &bo->bo))
		goto error;

	bo->base.gbm = gbm;
	bo->base.width = width;
	bo->base.height = height;
	bo->base.format = format;

	kms_bo_get_prop(bo->bo, KMS_HANDLE, &bo->base.handle.u32);
	kms_bo_get_prop(bo->bo, KMS_PITCH, &bo->base.stride);

	bo->size = bo->base.stride * bo->base.height;

	if (drmPrimeHandleToFD(dev->base.base.fd, bo->base.handle.u32, DRM_CLOEXEC, &bo->fd)) {
		GBM_DEBUG("%s: %s: drmPrimeHandleToFD() failed. %s\n", __FILE__, __func__, strerror(errno));
		goto error;
	}

	// Map to the user space for bo_write
	if (usage & GBM_BO_USE_WRITE) {
		if (kms_bo_map(bo->bo, &bo->addr))
			goto error;
	}

	return (struct gbm_bo*)bo;

 error:
	GBM_DEBUG("%s: %s: %d: ERROR!!!!\n", __FILE__, __func__, __LINE__);
	gbm_kms_bo_destroy((struct gbm_bo*)bo);
	return NULL;
}