diff options
author | Kristian Høgsberg <[email protected]> | 2014-03-28 10:17:11 -0700 |
---|---|---|
committer | Kristian Høgsberg <[email protected]> | 2014-04-01 12:27:26 -0700 |
commit | a43d286ef7ff65087b1f051d071b829ca7b02073 (patch) | |
tree | ca66de52ed5d0f42d7473167aef75086682e7ea4 | |
parent | f54f5891be24eea2af2d1c9864a3f74c1e7648fc (diff) |
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 <[email protected]>
-rw-r--r-- | src/gbm/backends/dri/gbm_dri.c | 21 | ||||
-rw-r--r-- | src/gbm/main/gbm.c | 1 | ||||
-rw-r--r-- | 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, |