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; }
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; }
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; }