Mesa (master): gbm: Add gbm_bo_get_fd()

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


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

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Fri Mar 28 00:33:54 2014 -0700

gbm: Add gbm_bo_get_fd()

Add gbm function to get a DMA-BUF file descriptor for a gbm bo.

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

---

 src/gbm/backends/dri/gbm_dri.c |   16 ++++++++++++++++
 src/gbm/main/gbm.c             |   17 +++++++++++++++++
 src/gbm/main/gbm.h             |    3 +++
 src/gbm/main/gbmint.h          |    1 +
 4 files changed, 37 insertions(+)

diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
index acf6b24..a674036 100644
--- a/src/gbm/backends/dri/gbm_dri.c
+++ b/src/gbm/backends/dri/gbm_dri.c
@@ -361,6 +361,21 @@ gbm_dri_bo_write(struct gbm_bo *_bo, const void *buf, size_t count)
    return 0;
 }
 
+static int
+gbm_dri_bo_get_fd(struct gbm_bo *_bo)
+{
+   struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
+   struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
+   int fd;
+
+   if (bo->image == NULL)
+      return -1;
+
+   dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_FD, &fd);
+
+   return fd;
+}
+
 static void
 gbm_dri_bo_destroy(struct gbm_bo *_bo)
 {
@@ -696,6 +711,7 @@ dri_device_create(int fd)
    dri->base.base.bo_import = gbm_dri_bo_import;
    dri->base.base.is_format_supported = gbm_dri_is_format_supported;
    dri->base.base.bo_write = gbm_dri_bo_write;
+   dri->base.base.bo_get_fd = gbm_dri_bo_get_fd;
    dri->base.base.bo_destroy = gbm_dri_bo_destroy;
    dri->base.base.destroy = dri_destroy;
    dri->base.base.surface_create = gbm_dri_surface_create;
diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
index 30785a6..ad5208c 100644
--- a/src/gbm/main/gbm.c
+++ b/src/gbm/main/gbm.c
@@ -230,6 +230,23 @@ gbm_bo_get_handle(struct gbm_bo *bo)
    return bo->handle;
 }
 
+/** Get a DMA-BUF file descriptor for the buffer object
+ *
+ * This function creates a DMA-BUF (also known as PRIME) file descriptor
+ * handle for the buffer object.  Eeach call to gbm_bo_get_fd() returns a new
+ * file descriptor and the caller is responsible for closing the file
+ * descriptor.
+
+ * \param bo The buffer object
+ * \return Returns a file descriptor referring  to the underlying buffer
+ */
+GBM_EXPORT int
+gbm_bo_get_fd(struct gbm_bo *bo)
+{
+   return bo->gbm->bo_get_fd(bo);
+}
+
+
 /** Write data into the buffer object
  *
  * If the buffer object was created with the GBM_BO_USE_WRITE flag,
diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
index 9d2a030..9e0c770 100644
--- a/src/gbm/main/gbm.h
+++ b/src/gbm/main/gbm.h
@@ -256,6 +256,9 @@ union gbm_bo_handle
 gbm_bo_get_handle(struct gbm_bo *bo);
 
 int
+gbm_bo_get_fd(struct gbm_bo *bo);
+
+int
 gbm_bo_write(struct gbm_bo *bo, const void *buf, size_t count);
 
 void
diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h
index 4baf8e3..31345e6 100644
--- a/src/gbm/main/gbmint.h
+++ b/src/gbm/main/gbmint.h
@@ -69,6 +69,7 @@ struct gbm_device {
    struct gbm_bo *(*bo_import)(struct gbm_device *gbm, uint32_t type,
                                void *buffer, uint32_t usage);
    int (*bo_write)(struct gbm_bo *bo, const void *buf, size_t data);
+   int (*bo_get_fd)(struct gbm_bo *bo);
    void (*bo_destroy)(struct gbm_bo *bo);
 
    struct gbm_surface *(*surface_create)(struct gbm_device *gbm,




More information about the mesa-commit mailing list