From a43d286ef7ff65087b1f051d071b829ca7b02073 Mon Sep 17 00:00:00 2001 From: Kristian Høgsberg Date: Fri, 28 Mar 2014 10:17:11 -0700 Subject: gbm: Add import from fd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a new import type that lets us create a gbm bo from a DMA-BUF file descriptor. Signed-off-by: Kristian Høgsberg --- 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 a674036bf6f..50fa588ff39 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 ad5208ca136..6179e5b830d 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 9e0c7705ea8..92d472a0762 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, -- cgit v1.2.3