OSDN Git Service

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 acf6b24..a674036 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 30785a6..ad5208c 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 9d2a030..9e0c770 100644 (file)
@@ -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
index 4baf8e3..31345e6 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,