Mesa (master): gbm: Add import from fd

Kristian Høgsberg krh at kemper.freedesktop.org
Tue Apr 1 19:28:42 UTC 2014


Module: Mesa
Branch: master
Commit: a43d286ef7ff65087b1f051d071b829ca7b02073
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a43d286ef7ff65087b1f051d071b829ca7b02073

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Fri Mar 28 10:17:11 2014 -0700

gbm: Add import from fd

Add a new import type that lets us create a gbm bo from a
DMA-BUF file descriptor.

Signed-off-by: Kristian Høgsberg <krh at bitplanet.net>

---

 src/gbm/backends/dri/gbm_dri.c |   21 +++++++++++++++++++--
 src/gbm/main/gbm.c             |    1 +
 src/gbm/main/gbm.h             |    9 +++++++++
 3 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index a674036..50fa588 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -448,7 +448,7 @@ gbm_dri_bo_import(struct gbm_device *gbm,
       if (!wb)
          return NULL;
 
-      image = wb->driver_buffer;
+      image = dri->image->dupImage(wb->driver_buffer, NULL);
 
       switch (wb->format) {
       case WL_DRM_FORMAT_XRGB8888:
@@ -477,6 +477,7 @@ gbm_dri_bo_import(struct gbm_device *gbm,
          return NULL;
 
       image = dri->lookup_image(dri->screen, buffer, dri->lookup_user_data);
+      image = dri->image->dupImage(image, NULL);
       dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &dri_format);
       gbm_format = gbm_dri_to_gbm_format(dri_format);
       if (gbm_format == 0)
@@ -484,6 +485,22 @@ gbm_dri_bo_import(struct gbm_device *gbm,
       break;
    }
 
+   case GBM_BO_IMPORT_FD:
+   {
+      struct gbm_import_fd_data *fd_data = buffer;
+      int stride = fd_data->stride, offset = 0;
+
+      image = dri->image->createImageFromFds(dri->screen,
+                                             fd_data->width,
+                                             fd_data->height,
+                                             fd_data->format,
+                                             &fd_data->fd, 1,
+                                             &stride, &offset,
+                                             NULL);
+      gbm_format = fd_data->format;
+      break;
+   }
+
    default:
       return NULL;
    }
@@ -493,7 +510,7 @@ gbm_dri_bo_import(struct gbm_device *gbm,
    if (bo == NULL)
       return NULL;
 
-   bo->image = dri->image->dupImage(image, NULL);
+   bo->image = image;
 
    if (usage & GBM_BO_USE_SCANOUT)
       dri_use |= __DRI_IMAGE_USE_SCANOUT;
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
index ad5208c..6179e5b 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -362,6 +362,7 @@ gbm_bo_create(struct gbm_device *gbm,
  *
  *   GBM_BO_IMPORT_WL_BUFFER
  *   GBM_BO_IMPORT_EGL_IMAGE
+ *   GBM_BO_IMPORT_FD
  *
  * The the gbm bo shares the underlying pixels but its life-time is
  * independent of the foreign object.
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 9e0c770..92d472a 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -232,6 +232,15 @@ gbm_bo_create(struct gbm_device *gbm,
 
 #define GBM_BO_IMPORT_WL_BUFFER         0x5501
 #define GBM_BO_IMPORT_EGL_IMAGE         0x5502
+#define GBM_BO_IMPORT_FD                0x5503
+
+struct gbm_import_fd_data {
+   int fd;
+   uint32_t width;
+   uint32_t height;
+   uint32_t stride;
+   uint32_t format;
+};
 
 struct gbm_bo *
 gbm_bo_import(struct gbm_device *gbm, uint32_t type,




More information about the mesa-commit mailing list