[Mesa-dev] [PATCH 10/11] egl/wayland: Remove duplicate wl_buffer creation code

Lucas Stach l.stach at pengutronix.de
Wed Jun 28 15:35:39 UTC 2017


Am Freitag, den 16.06.2017, 18:14 +0100 schrieb Daniel Stone:
> Now create_wl_buffer is generic enough, we can use it for the
> EGL_WL_create_wayland_buffer_from_image extension.
> 
> Signed-off-by: Daniel Stone <daniels at collabora.com>
> ---
>  src/egl/drivers/dri2/platform_wayland.c | 71 +++++----------------------------
>  1 file changed, 11 insertions(+), 60 deletions(-)
> 
> diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
> index b7197d0a75..96ce31c0ae 100644
> --- a/src/egl/drivers/dri2/platform_wayland.c
> +++ b/src/egl/drivers/dri2/platform_wayland.c
> @@ -655,21 +655,23 @@ create_wl_buffer(struct dri2_egl_display *dri2_dpy,
>     dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FOURCC, &fourcc);
>  
>     if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) {
> +      struct wl_drm *wl_drm =
> +         dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm;

This and...

>        int stride, fd;
>  
>        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
>        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd);
> -      ret = wl_drm_create_prime_buffer(dri2_surf->wl_drm_wrapper,
> -                                       fd, width, height, fourcc, 0, stride,
> -                                       0, 0, 0, 0);
> +      ret = wl_drm_create_prime_buffer(wl_drm, fd, width, height, fourcc, 0,
> +                                       stride, 0, 0, 0, 0);
>        close(fd);
>     } else {
> +      struct wl_drm *wl_drm =
> +         dri2_surf ? dri2_surf->wl_drm_wrapper : dri2_dpy->wl_drm;

.. this can be moved out of the if/else path to get rid of even more
duplication.

>        int stride, name;
>  
>        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &stride);
>        dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NAME, &name);
> -      ret = wl_drm_create_buffer(dri2_surf->wl_drm_wrapper,
> -                                 name, width, height, stride, fourcc);
> +      ret = wl_drm_create_buffer(wl_drm, name, width, height, stride, fourcc);
>     }
>  
>     return ret;
> @@ -829,70 +831,19 @@ dri2_wl_create_wayland_buffer_from_image(_EGLDriver *drv,
>     struct dri2_egl_image *dri2_img = dri2_egl_image(img);
>     __DRIimage *image = dri2_img->dri_image;
>     struct wl_buffer *buffer;
> -   int width, height, format, pitch;
> -   enum wl_drm_format wl_format;
>  
> -   dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FORMAT, &format);
> -
> -   switch (format) {
> -   case __DRI_IMAGE_FORMAT_ARGB8888:
> -      if (!(dri2_dpy->formats & HAS_ARGB8888))
> -         goto bad_format;
> -      wl_format = WL_DRM_FORMAT_ARGB8888;
> -      break;
> -   case __DRI_IMAGE_FORMAT_XRGB8888:
> -      if (!(dri2_dpy->formats & HAS_XRGB8888))
> -         goto bad_format;
> -      wl_format = WL_DRM_FORMAT_XRGB8888;
> -      break;
> -   default:
> -      goto bad_format;
> -   }
> -
> -   dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_WIDTH, &width);
> -   dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_HEIGHT, &height);
> -   dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, &pitch);
> -
> -   if (dri2_dpy->capabilities & WL_DRM_CAPABILITY_PRIME) {
> -      int fd;
> -
> -      dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_FD, &fd);
> -
> -      buffer =
> -         wl_drm_create_prime_buffer(dri2_dpy->wl_drm,
> -                                    fd,
> -                                    width, height,
> -                                    wl_format,
> -                                    0, pitch,
> -                                    0, 0,
> -                                    0, 0);
> -
> -      close(fd);
> -   } else {
> -      int name;
> -
> -      dri2_dpy->image->queryImage(image, __DRI_IMAGE_ATTRIB_NAME, &name);
> -
> -      buffer =
> -         wl_drm_create_buffer(dri2_dpy->wl_drm,
> -                              name,
> -                              width, height,
> -                              pitch,
> -                              wl_format);
> -   }
> +   buffer = create_wl_buffer(dri2_dpy, NULL, image);
>  
>     /* The buffer object will have been created with our internal event queue
>      * because it is using the wl_drm object as a proxy factory. We want the
>      * buffer to be used by the application so we'll reset it to the display's
> -    * default event queue */
> +    * default event queue. This isn't actually racy, as the only event the
> +    * buffer can get is a buffer release, which doesn't happen with an explicit
> +    * attach. */
>     if (buffer)
>        wl_proxy_set_queue((struct wl_proxy *) buffer, NULL);
>  
>     return buffer;
> -
> -bad_format:
> -   _eglError(EGL_BAD_MATCH, "unsupported image format");
> -   return NULL;
>  }
>  
>  static int




More information about the mesa-dev mailing list