Added a new interface to create a gbm_bo from external name. Signed-off-by: Zhigang Gong <zhigang.g...@linux.intel.com> --- src/gbm/backends/dri/gbm_dri.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/gbm/main/gbm.c | 12 ++++++++++++ src/gbm/main/gbm.h | 6 ++++++ src/gbm/main/gbmint.h | 4 ++++ 4 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c index 7673953..c8f6196 100644 --- a/src/gbm/backends/dri/gbm_dri.c +++ b/src/gbm/backends/dri/gbm_dri.c @@ -356,6 +356,45 @@ gbm_dri_bo_create(struct gbm_device *gbm, return &bo->base.base; } +static struct gbm_bo * +gbm_dri_bo_create_from_name(struct gbm_device *gbm, + uint32_t width, uint32_t height, + enum gbm_bo_format format, int name, + int pitch) +{ + struct gbm_dri_device *dri = gbm_dri_device(gbm); + struct gbm_dri_bo *bo; + int dri_format; + + if (gbm_dri_match_format(format, &dri_format) != 0) + return NULL; + + bo = calloc(1, sizeof *bo); + if (bo == NULL) + return NULL; + + bo->base.base.gbm = gbm; + bo->base.base.width = width; + bo->base.base.height = height; + + bo->image = + dri->image->createImageFromName(dri->screen, + width, height, + dri_format, name, pitch, + bo); + if (bo->image == NULL) { + free(bo); + return NULL; + } + + dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE, + &bo->base.base.handle.s32); + dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_STRIDE, + (int *) &bo->base.base.pitch); + + return &bo->base.base; +} + static void dri_destroy(struct gbm_device *gbm) { @@ -380,6 +419,7 @@ dri_device_create(int fd) dri->base.base.fd = fd; dri->base.base.bo_create = gbm_dri_bo_create; dri->base.base.bo_create_from_egl_image = gbm_dri_bo_create_from_egl_image; + dri->base.base.bo_create_from_name = gbm_dri_bo_create_from_name; dri->base.base.is_format_supported = gbm_dri_is_format_supported; dri->base.base.bo_destroy = gbm_dri_bo_destroy; dri->base.base.destroy = dri_destroy; diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c index 8440b2c..71c02a2 100644 --- a/src/gbm/main/gbm.c +++ b/src/gbm/main/gbm.c @@ -177,6 +177,18 @@ gbm_bo_create(struct gbm_device *gbm, } GBM_EXPORT struct gbm_bo * +gbm_bo_create_from_name(struct gbm_device *gbm, + uint32_t width, uint32_t height, + enum gbm_bo_format format, int name, + int pitch) +{ + if (width == 0 || height == 0) + return NULL; + + return gbm->bo_create_from_name(gbm, width, height, format, name, pitch); +} + +GBM_EXPORT struct gbm_bo * gbm_bo_create_from_egl_image(struct gbm_device *gbm, void *egl_dpy, void *egl_image, uint32_t width, uint32_t height, diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h index e3cecb4..49ff2a8 100644 --- a/src/gbm/main/gbm.h +++ b/src/gbm/main/gbm.h @@ -88,6 +88,12 @@ gbm_bo_create(struct gbm_device *gbm, enum gbm_bo_format format, uint32_t flags); struct gbm_bo * +gbm_bo_create_from_name(struct gbm_device *gbm, + uint32_t width, uint32_t height, + enum gbm_bo_format format, int name, + int pitch); + +struct gbm_bo * gbm_bo_create_from_egl_image(struct gbm_device *gbm, void *egl_dpy, void *egl_img, uint32_t width, uint32_t height, diff --git a/src/gbm/main/gbmint.h b/src/gbm/main/gbmint.h index fb8db80..1aab789 100644 --- a/src/gbm/main/gbmint.h +++ b/src/gbm/main/gbmint.h @@ -60,6 +60,10 @@ struct gbm_device { void *egl_dpy, void *egl_img, uint32_t width, uint32_t height, uint32_t usage); + struct gbm_bo *(*bo_create_from_name)(struct gbm_device *gbm, + uint32_t width, uint32_t height, + enum gbm_bo_format format, int name, + int pitch); void (*bo_destroy)(struct gbm_bo *bo); }; -- 1.7.3.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev