gbm: implement FD import with modifier
authorLucas Stach <l.stach@pengutronix.de>
Thu, 8 Jun 2017 18:56:17 +0000 (20:56 +0200)
committerEmil Velikov <emil.l.velikov@gmail.com>
Thu, 15 Jun 2017 09:43:36 +0000 (10:43 +0100)
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>
src/gbm/backends/dri/gbm_dri.c

index 7fb569078b27cdd7e620ad092814124105f905b8..19be440d48e31e3a7dc8bec8726fb815888675bf 100644 (file)
@@ -932,6 +932,60 @@ gbm_dri_bo_import(struct gbm_device *gbm,
       break;
    }
 
       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;
    default:
       errno = ENOSYS;
       return NULL;