[Mesa-dev] [PATCH v2] EGL/android: Enhance pbuffer implementation

Tomasz Figa tfiga at chromium.org
Wed Dec 7 05:45:15 UTC 2016


On Tue, Dec 6, 2016 at 5:49 PM, Liu Zhiquan <zhiquan.liu at intel.com> wrote:
> Some dri drivers will pass multiple bits in buffer_mask parameter
> to droid_image_get_buffer(), more than the actual supported buffer
> type combination. For such case, will go through all the bits, and
> will not return error when unsupported buffer is requested, only
> return error when the allocation for supported buffer failed.
>

Missing changelog. Please see http://www.mesa3d.org/devinfo.html#submitting.

+ few more minor issues inline. Otherwise the behavior seems fine now.

> Signed-off-by: Liu Zhiquan <zhiquan.liu at intel.com>
> Signed-off-by: Long, Zhifang <zhifang.long at intel.com>
> ---
>  src/egl/drivers/dri2/platform_android.c | 180 ++++++++++++++++++--------------
>  1 file changed, 101 insertions(+), 79 deletions(-)
>
> diff --git a/src/egl/drivers/dri2/platform_android.c b/src/egl/drivers/dri2/platform_android.c
> index 373e2c0..46c6efa 100644
> --- a/src/egl/drivers/dri2/platform_android.c
> +++ b/src/egl/drivers/dri2/platform_android.c
> @@ -434,81 +434,92 @@ update_buffers(struct dri2_egl_surface *dri2_surf)
>  }
>
>  static int
> -get_back_bo(struct dri2_egl_surface *dri2_surf)
> +get_front_bo(struct dri2_egl_surface *dri2_surf, unsigned int format)
>  {
>     struct dri2_egl_display *dri2_dpy =
>        dri2_egl_display(dri2_surf->base.Resource.Display);
> -   int fourcc, pitch;
> -   int offset = 0, fd;
>
> -   if (dri2_surf->dri_image_back)
> +   if (dri2_surf->dri_image_front) {

Style: No need for braces.

>        return 0;
> -
> -   if (!dri2_surf->buffer)
> -      return -1;
> -
> -   fd = get_native_buffer_fd(dri2_surf->buffer);
> -   if (fd < 0) {
> -      _eglLog(_EGL_WARNING, "Could not get native buffer FD");
> -      return -1;
>     }
>
> -   fourcc = get_fourcc(dri2_surf->buffer->format);
> +   if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> +      /* According current EGL spec, front buffer rendering
> +       * for window surface is not supported now.
> +       * and mesa doesn't have the implementation of this case.
> +       * Add warning message, but not treat it as error.
> +       */
> +      _eglLog(_EGL_DEBUG, "DRI driver requested unsupported front buffer for window surface");
>

Style: Unnecessary blank line.

> -   pitch = dri2_surf->buffer->stride *
> -      get_format_bpp(dri2_surf->buffer->format);
> +   } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) {
>

Style: Unnecessary blank line.

> -   if (fourcc == -1 || pitch == 0) {
> -      _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)",
> -              fourcc, pitch);
> -      return -1;
> +      dri2_surf->dri_image_front =
> +          dri2_dpy->image->createImage(dri2_dpy->dri_screen,
> +                                              dri2_surf->base.Width,
> +                                              dri2_surf->base.Height,
> +                                              format,
> +                                              0,
> +                                              dri2_surf);
> +      if (!dri2_surf->dri_image_front) {
> +         _eglLog(_EGL_WARNING, "dri2_image_front allocation failed");
> +         return -1;
> +      }
>     }
>
> -   dri2_surf->dri_image_back =
> -      dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
> -                                          dri2_surf->base.Width,
> -                                          dri2_surf->base.Height,
> -                                          fourcc,
> -                                          &fd,
> -                                          1,
> -                                          &pitch,
> -                                          &offset,
> -                                          dri2_surf);
> -   if (!dri2_surf->dri_image_back)
> -      return -1;
> -
>     return 0;
>  }
>
>  static int
> -droid_image_get_buffers(__DRIdrawable *driDrawable,
> -                  unsigned int format,
> -                  uint32_t *stamp,
> -                  void *loaderPrivate,
> -                  uint32_t buffer_mask,
> -                  struct __DRIimageList *images)
> +get_back_bo(struct dri2_egl_surface *dri2_surf, unsigned int format)
>  {
> -   struct dri2_egl_surface *dri2_surf = loaderPrivate;
>     struct dri2_egl_display *dri2_dpy =
>        dri2_egl_display(dri2_surf->base.Resource.Display);
> +   int fourcc, pitch;
> +   int offset = 0, fd;
>
> -   images->image_mask = 0;
> -   images->front = NULL;
> -   images->back = NULL;
> -
> -   if (update_buffers(dri2_surf) < 0)
> +   if (dri2_surf->dri_image_back) {
>        return 0;
> +   }

Style: Unnecessary braces.

>
> -   if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
> -      if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> -         /* According current EGL spec,
> -          * front buffer rendering for window surface is not supported now */
> -         _eglLog(_EGL_WARNING,
> -                 "%s:%d front buffer rendering for window surface is not supported!",
> -                 __func__, __LINE__);
> -         return 0;
> +   if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> +      if (!dri2_surf->buffer) {
> +         _eglLog(_EGL_WARNING, "Could not get native buffer");
> +         return -1;
> +      }
> +
> +      fd = get_native_buffer_fd(dri2_surf->buffer);
> +      if (fd < 0) {
> +         _eglLog(_EGL_WARNING, "Could not get native buffer FD");
> +         return -1;
> +      }
> +
> +      fourcc = get_fourcc(dri2_surf->buffer->format);
> +
> +      pitch = dri2_surf->buffer->stride *
> +         get_format_bpp(dri2_surf->buffer->format);
> +
> +      if (fourcc == -1 || pitch == 0) {
> +         _eglLog(_EGL_WARNING, "Invalid buffer fourcc(%x) or pitch(%d)",
> +                 fourcc, pitch);
> +         return -1;
>        }
>
> +      dri2_surf->dri_image_back =
> +         dri2_dpy->image->createImageFromFds(dri2_dpy->dri_screen,
> +                                             dri2_surf->base.Width,
> +                                             dri2_surf->base.Height,
> +                                             fourcc,
> +                                             &fd,
> +                                             1,
> +                                             &pitch,
> +                                             &offset,
> +                                             dri2_surf);
> +      if (!dri2_surf->dri_image_back) {
> +         _eglLog(_EGL_WARNING, "dri2_image allocation failed");

The error could be more specific, e.g.

"failed to create DRI image from FD"

> +         return -1;
> +      }
> +

Style: Unnecessary braces.

> +   } else if (dri2_surf->base.Type == EGL_PBUFFER_BIT) {
>        /* The EGL 1.5 spec states that pbuffers are single-buffered. Specifically,
>         * the spec states that they have a back buffer but no front buffer, in
>         * contrast to pixmaps, which have a front buffer but no back buffer.
> @@ -522,43 +533,54 @@ droid_image_get_buffers(__DRIdrawable *driDrawable,
>         * behavior instead of trying to fix (and hence potentially breaking) the
>         * world.
>         */
> -      if (!dri2_surf->dri_image_front &&
> -          dri2_surf->base.Type == EGL_PBUFFER_BIT) {
> -         dri2_surf->dri_image_front =
> -            dri2_dpy->image->createImage(dri2_dpy->dri_screen,
> -                                         dri2_surf->base.Width,
> -                                         dri2_surf->base.Height,
> -                                         format,
> -                                         0,
> -                                         dri2_surf);
> -      }
> +      _eglLog(_EGL_DEBUG, "DRI driver requested unsupported back buffer for pbuffer surface");
> +   }
>
> -      if (!dri2_surf->dri_image_front) {
> -         _eglLog(_EGL_WARNING,
> -                 "%s:%d dri2_image front buffer allocation failed!",
> -                 __func__, __LINE__);
> +   return 0;
> +}
> +
> +/* Some drivers will pass multiple bits in buffer_mask.
> + * For such case, will go through all the bits, and
> + * will not return error when unsupported buffer is requested, only
> + * return error when the allocation for supported buffer failed.
> + */
> +static int
> +droid_image_get_buffers(__DRIdrawable *driDrawable,
> +                  unsigned int format,
> +                  uint32_t *stamp,
> +                  void *loaderPrivate,
> +                  uint32_t buffer_mask,
> +                  struct __DRIimageList *images)
> +{
> +   struct dri2_egl_surface *dri2_surf = loaderPrivate;
> +
> +   images->image_mask = 0;
> +   images->front = NULL;
> +   images->back = NULL;
> +
> +   if (update_buffers(dri2_surf) < 0)
> +      return 0;
> +
> +   if (buffer_mask & __DRI_IMAGE_BUFFER_FRONT) {
> +      if (get_front_bo(dri2_surf, format) < 0) {
>           return 0;
>        }

Style: Unnecessary braces.

>
> -      images->front = dri2_surf->dri_image_front;
> -      images->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
> +      if (dri2_surf->dri_image_front) {
> +         images->front = dri2_surf->dri_image_front;
> +         images->image_mask |= __DRI_IMAGE_BUFFER_FRONT;
> +      }
>     }
>
>     if (buffer_mask & __DRI_IMAGE_BUFFER_BACK) {
> -      if (dri2_surf->base.Type == EGL_WINDOW_BIT) {
> -         if (get_back_bo(dri2_surf) < 0)
> -            return 0;
> -      }
> -
> -      if (!dri2_surf->dri_image_back) {
> -         _eglLog(_EGL_WARNING,
> -                 "%s:%d dri2_image back buffer allocation failed!",
> -                 __func__, __LINE__);
> +      if (get_back_bo(dri2_surf, format) < 0) {
>           return 0;
>        }

Style: Unnecessary braces.

Best regards,
Tomasz


More information about the mesa-dev mailing list