[Mesa-dev] [PATCH 1/2] gbm: Introduce a new API gbm_bo_create_from_name.

Ian Romanick idr at freedesktop.org
Fri Dec 16 14:06:55 PST 2011


On 12/15/2011 01:58 AM, zhigang.gong at linux.intel.com wrote:
> From: Zhigang Gong<zhigang.gong at linux.intel.com>
>
> Glamor need a function to create a texture from a
> BO allocated by using libdrm directly in DDX layer.
> EGL image extension API eglCreateImageKHR does support
> this function, but that extension only support one
> colore format - ARGB32 which is not sufficent for
> us. I discussed this in the mail list and KRH suggest
> me to extent GBM to support more color formats should
> be better. I took his advice and decide to use gbm
> bo to create image. Now before extent the color formats,
> I have to add a new API to the create a gbo from a
> name. This commit is for that purpose.
>
> Signed-off-by: Zhigang Gong<zhigang.gong at linux.intel.com>

This patch should be split in two:

- Pull code out of gbm_dri_bo_create into the new function 
gbm_dri_match_format.

- Add the new bo_create_from_name interfaces interface.

This allows the gbm_dri_match_format patch and the follow-on patch 
(gbm/dri: Added more color formats.) to be committed while discussion 
about bo_create_from_name continues.

> ---
>   src/gbm/backends/dri/gbm_dri.c |   87 ++++++++++++++++++++++++++++++++++------
>   src/gbm/main/gbm.c             |   14 ++++++
>   src/gbm/main/gbm.h             |    6 +++
>   src/gbm/main/gbmint.h          |    4 ++
>   4 files changed, 98 insertions(+), 13 deletions(-)
>
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_dri.c
> index 9de8cb6..d78cf5f 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -284,6 +284,22 @@ gbm_dri_bo_create_from_egl_image(struct gbm_device *gbm,
>      return&bo->base.base;
>   }
>
> +static int
> +gbm_dri_match_format(enum gbm_bo_format format, int *dri_format)
> +{
> +   switch (format) {
> +   case GBM_BO_FORMAT_XRGB8888:
> +      *dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
> +      break;
> +   case GBM_BO_FORMAT_ARGB8888:
> +      *dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
> +      break;
> +   default:
> +      return -1;
> +   }
> +      return 0;
> +}
> +
>   static struct gbm_bo *
>   gbm_dri_bo_create(struct gbm_device *gbm,
>                     uint32_t width, uint32_t height,
> @@ -296,23 +312,15 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>
>      bo = calloc(1, sizeof *bo);
>      if (bo == NULL)
> -      return NULL;
> +      goto fail;
>
>      bo->base.base.gbm = gbm;
>      bo->base.base.width = width;
>      bo->base.base.height = height;
>
> -   switch (format) {
> -   case GBM_BO_FORMAT_XRGB8888:
> -      dri_format = __DRI_IMAGE_FORMAT_XRGB8888;
> -      break;
> -   case GBM_BO_FORMAT_ARGB8888:
> -      dri_format = __DRI_IMAGE_FORMAT_ARGB8888;
> -      break;
> -   default:
> -      return NULL;
> -   }
> -
> +   if (gbm_dri_match_format(format,&dri_format) != 0)
> +      goto fail;
> +
>      if (usage&  GBM_BO_USE_SCANOUT)
>         dri_use |= __DRI_IMAGE_USE_SCANOUT;
>      if (usage&  GBM_BO_USE_CURSOR_64X64)
> @@ -323,8 +331,9 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>                                 width, height,
>                                 dri_format, dri_use,
>                                 bo);
> +

Spurious whitespace change.

>      if (bo->image == NULL)
> -      return NULL;
> +      goto fail;
>
>      dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
>                             &bo->base.base.handle.s32);
> @@ -332,8 +341,59 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>                             (int *)&bo->base.base.pitch);
>
>      return&bo->base.base;
> +
> +fail:
> +
> +   if (bo)
> +      free(bo);

There is no reason to check whether the pointer is NULL before calling free.

> +   return NULL;
>   }
>
> +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;
> +
> +   bo = calloc(1, sizeof *bo);
> +   if (bo == NULL)
> +      goto fail;
> +
> +   bo->base.base.gbm = gbm;
> +   bo->base.base.width = width;
> +   bo->base.base.height = height;
> +
> +   if (gbm_dri_match_format(format,&dri_format) != 0)
> +      goto fail;
> +
> +   bo->image =
> +      dri->image->createImageFromName(dri->screen,
> +                                      width, height,
> +                                      dri_format, name, pitch,
> +                                      bo);
> +   if (bo->image == NULL)
> +      goto fail;
> +
> +   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;
> +
> +fail:
> +
> +   if (bo)
> +      free(bo);

Same comment as above.

> +   return NULL;
> +
> +}
> +
> +
>   static void
>   dri_destroy(struct gbm_device *gbm)
>   {
> @@ -358,6 +418,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..93e06f3 100644
> --- a/src/gbm/main/gbm.c
> +++ b/src/gbm/main/gbm.c
> @@ -177,6 +177,20 @@ 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 05d2292..aeed0df 100644
> --- a/src/gbm/main/gbm.h
> +++ b/src/gbm/main/gbm.h
> @@ -82,6 +82,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);
>   };
>



More information about the mesa-dev mailing list