gbm: Add gbm_bo_get_fd()
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 28 Mar 2014 07:33:54 +0000 (00:33 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 1 Apr 2014 19:27:13 +0000 (12:27 -0700)
Add gbm function to get a DMA-BUF file descriptor for a gbm bo.

Signed-off-by: Kristian Høgsberg <krh@bitplanet.net>
src/gbm/backends/dri/gbm_dri.c
src/gbm/main/gbm.c
src/gbm/main/gbm.h
src/gbm/main/gbmint.h

index acf6b246af0b0b3c0d27ddade514dec2144a5ffb..a674036bf6f7a6c65bf5e16b2a5a7c88dca007ad 100644 (file)
@@ -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;
index 30785a66a4dde801ca27e7d045c2504eb229912e..ad5208ca13607aa48dd1771eea7dbd339a830bb6 100644 (file)
@@ -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,
index 9d2a0308766daeb7cbd290abce55eacc10f30d00..9e0c7705ea8c9a9a7bd9b021ba76e87b365a7164 100644 (file)
@@ -255,6 +255,9 @@ gbm_bo_get_device(struct gbm_bo *bo);
 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);
 
index 4baf8e3d3d18f59a9c676fc675c30531d0048e25..31345e6f6dec7d94afdf69ba21716f9ff215a7db 100644 (file)
@@ -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,