drm_fb * CDRMUtils::DrmFbGetFromBo(struct gbm_bo *bo) { { struct drm_fb *fb = static_cast<drm_fb *>(gbm_bo_get_user_data(bo)); if(fb) { return fb; } } struct drm_fb *fb = new drm_fb; fb->bo = bo; uint32_t width, height, handles[4] = {0}, strides[4] = {0}, offsets[4] = {0}; width = gbm_bo_get_width(bo); height = gbm_bo_get_height(bo); handles[0] = gbm_bo_get_handle(bo).u32; strides[0] = gbm_bo_get_stride(bo); memset(offsets, 0, 16); auto ret = drmModeAddFB2(m_fd, width, height, m_primary_plane->format, handles, strides, offsets, &fb->fb_id, 0); if(ret) { delete (fb); CLog::Log(LOGDEBUG, "CDRMUtils::%s - failed to add framebuffer", __FUNCTION__); return nullptr; } gbm_bo_set_user_data(bo, fb, DrmFbDestroyCallback); return fb; }
static void update_framebuffer_from_bo( const struct MPGLContext *ctx, struct gbm_bo *bo) { struct priv *p = ctx->priv; p->fb.bo = bo; p->fb.fd = p->kms->fd; p->fb.width = gbm_bo_get_width(bo); p->fb.height = gbm_bo_get_height(bo); int stride = gbm_bo_get_stride(bo); int handle = gbm_bo_get_handle(bo).u32; int ret = drmModeAddFB(p->kms->fd, p->fb.width, p->fb.height, 24, 32, stride, handle, &p->fb.id); if (ret) { MP_ERR(ctx->vo, "Failed to create framebuffer: %s\n", mp_strerror(errno)); } gbm_bo_set_user_data(bo, &p->fb, framebuffer_destroy_callback); }