gbm: implement FD import with modifier
This implements a way to import FDs with modifiers on plain GBM devices, without the need to go through EGL. This is mostly to the benefit of gbm_gralloc, which can keep its dependencies low. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Tested-by: Robert Foss <robert.foss@collabora.com> Reviewed-by: Daniel Stone <daniels@collabora.com>
This commit is contained in:

committed by
Emil Velikov

parent
71b78b6b0c
commit
4026744fcb
@@ -932,6 +932,60 @@ gbm_dri_bo_import(struct gbm_device *gbm,
|
||||
break;
|
||||
}
|
||||
|
||||
case GBM_BO_IMPORT_FD_MODIFIER:
|
||||
{
|
||||
struct gbm_import_fd_modifier_data *fd_data = buffer;
|
||||
unsigned int error;
|
||||
int fourcc;
|
||||
|
||||
/* Import with modifier requires createImageFromDmaBufs2 */
|
||||
if (dri->image == NULL || dri->image->base.version < 15 ||
|
||||
dri->image->createImageFromDmaBufs2 == NULL) {
|
||||
errno = ENOSYS;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
switch(fd_data->format) {
|
||||
case GBM_FORMAT_RGB565:
|
||||
fourcc = __DRI_IMAGE_FOURCC_RGB565;
|
||||
break;
|
||||
case GBM_FORMAT_ARGB8888:
|
||||
case GBM_BO_FORMAT_ARGB8888:
|
||||
fourcc = __DRI_IMAGE_FOURCC_ARGB8888;
|
||||
break;
|
||||
case GBM_FORMAT_XRGB8888:
|
||||
case GBM_BO_FORMAT_XRGB8888:
|
||||
fourcc = __DRI_IMAGE_FOURCC_XRGB8888;
|
||||
break;
|
||||
case GBM_FORMAT_ABGR8888:
|
||||
fourcc = __DRI_IMAGE_FOURCC_ABGR8888;
|
||||
break;
|
||||
case GBM_FORMAT_XBGR8888:
|
||||
fourcc = __DRI_IMAGE_FOURCC_XBGR8888;
|
||||
break;
|
||||
default:
|
||||
errno = EINVAL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
image = dri->image->createImageFromDmaBufs2(dri->screen, fd_data->width,
|
||||
fd_data->height, fourcc,
|
||||
fd_data->modifier,
|
||||
fd_data->fds,
|
||||
fd_data->num_fds,
|
||||
fd_data->strides,
|
||||
fd_data->offsets,
|
||||
0, 0, 0, 0,
|
||||
&error, NULL);
|
||||
if (image == NULL) {
|
||||
errno = ENOSYS;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gbm_format = fd_data->format;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
errno = ENOSYS;
|
||||
return NULL;
|
||||
|
Reference in New Issue
Block a user