backend-drm: Added support for legacy fd_import
This patch reenables the function drm_fb_get_from_dmabuf but with legacy fd_import support for gbm/mesa < 17.1.
This commit is contained in:
@@ -226,7 +226,6 @@ static struct drm_fb *
|
|||||||
drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
||||||
struct drm_backend *backend, bool is_opaque)
|
struct drm_backend *backend, bool is_opaque)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_GBM_FD_IMPORT
|
|
||||||
struct drm_fb *fb;
|
struct drm_fb *fb;
|
||||||
struct gbm_import_fd_data import_legacy = {
|
struct gbm_import_fd_data import_legacy = {
|
||||||
.width = dmabuf->attributes.width,
|
.width = dmabuf->attributes.width,
|
||||||
@@ -235,6 +234,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
|||||||
.stride = dmabuf->attributes.stride[0],
|
.stride = dmabuf->attributes.stride[0],
|
||||||
.fd = dmabuf->attributes.fd[0],
|
.fd = dmabuf->attributes.fd[0],
|
||||||
};
|
};
|
||||||
|
#ifdef HAVE_GBM_FD_IMPORT
|
||||||
struct gbm_import_fd_modifier_data import_mod = {
|
struct gbm_import_fd_modifier_data import_mod = {
|
||||||
.width = dmabuf->attributes.width,
|
.width = dmabuf->attributes.width,
|
||||||
.height = dmabuf->attributes.height,
|
.height = dmabuf->attributes.height,
|
||||||
@@ -242,6 +242,8 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
|||||||
.num_fds = dmabuf->attributes.n_planes,
|
.num_fds = dmabuf->attributes.n_planes,
|
||||||
.modifier = dmabuf->attributes.modifier[0],
|
.modifier = dmabuf->attributes.modifier[0],
|
||||||
};
|
};
|
||||||
|
#endif /* HAVE_GBM_FD_IMPORT */
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
/* XXX: TODO:
|
/* XXX: TODO:
|
||||||
@@ -263,6 +265,7 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
|||||||
fb->refcnt = 1;
|
fb->refcnt = 1;
|
||||||
fb->type = BUFFER_DMABUF;
|
fb->type = BUFFER_DMABUF;
|
||||||
|
|
||||||
|
#ifdef HAVE_GBM_FD_IMPORT
|
||||||
static_assert(ARRAY_LENGTH(import_mod.fds) ==
|
static_assert(ARRAY_LENGTH(import_mod.fds) ==
|
||||||
ARRAY_LENGTH(dmabuf->attributes.fd),
|
ARRAY_LENGTH(dmabuf->attributes.fd),
|
||||||
"GBM and linux_dmabuf FD size must match");
|
"GBM and linux_dmabuf FD size must match");
|
||||||
@@ -287,15 +290,21 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
|||||||
"GBM and linux_dmabuf offset size must match");
|
"GBM and linux_dmabuf offset size must match");
|
||||||
memcpy(import_mod.offsets, dmabuf->attributes.offset,
|
memcpy(import_mod.offsets, dmabuf->attributes.offset,
|
||||||
sizeof(import_mod.offsets));
|
sizeof(import_mod.offsets));
|
||||||
|
#endif /* NOT HAVE_GBM_FD_IMPORT */
|
||||||
|
|
||||||
/* The legacy FD-import path does not allow us to supply modifiers,
|
/* The legacy FD-import path does not allow us to supply modifiers,
|
||||||
* multiple planes, or buffer offsets. */
|
* multiple planes, or buffer offsets. */
|
||||||
if (dmabuf->attributes.modifier[0] != DRM_FORMAT_MOD_INVALID ||
|
if (dmabuf->attributes.modifier[0] != DRM_FORMAT_MOD_INVALID ||
|
||||||
import_mod.num_fds > 1 ||
|
dmabuf->attributes.n_planes > 1 ||
|
||||||
import_mod.offsets[0] > 0) {
|
dmabuf->attributes.offset[0] > 0) {
|
||||||
|
#ifdef HAVE_GBM_FD_IMPORT
|
||||||
fb->bo = gbm_bo_import(backend->gbm, GBM_BO_IMPORT_FD_MODIFIER,
|
fb->bo = gbm_bo_import(backend->gbm, GBM_BO_IMPORT_FD_MODIFIER,
|
||||||
&import_mod,
|
&import_mod,
|
||||||
GBM_BO_USE_SCANOUT);
|
GBM_BO_USE_SCANOUT);
|
||||||
|
#else /* NOT HAVE_GBM_FD_IMPORT */
|
||||||
|
drm_debug(backend, "\t\t\t[dmabuf] Unsupported use of modifiers.\n");
|
||||||
|
goto err_free;
|
||||||
|
#endif /* NOT HAVE_GBM_FD_IMPORT */
|
||||||
} else {
|
} else {
|
||||||
fb->bo = gbm_bo_import(backend->gbm, GBM_BO_IMPORT_FD,
|
fb->bo = gbm_bo_import(backend->gbm, GBM_BO_IMPORT_FD,
|
||||||
&import_legacy,
|
&import_legacy,
|
||||||
@@ -374,7 +383,6 @@ drm_fb_get_from_dmabuf(struct linux_dmabuf_buffer *dmabuf,
|
|||||||
|
|
||||||
err_free:
|
err_free:
|
||||||
drm_fb_destroy_dmabuf(fb);
|
drm_fb_destroy_dmabuf(fb);
|
||||||
#endif
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user