[Mesa-dev] [PATCH mesa 1/3] gallium-egl: Simplify native_wayland_drm_bufmgr_helper interface

Emil Velikov emil.l.velikov at gmail.com
Thu Jul 18 12:04:26 PDT 2013


On 18/07/13 13:11, Ander Conselvan de Oliveira wrote:
> The helper provides a series of functions to easy the implementation
> of the WL_bind_wayland_display extension on different platforms. But
> even with the helpers there was still a bit of duplicated code between
> platforms, with the drm authentication being the only part that
> differs.
> 
> This patch changes the bufmgr interface to provide a self contained
> object with a create function that takes a drm authentication callback
> as an argument. That way all the helper functions are made static and
> the "_helper" suffix was removed from the sources file name.
> 
> This change also removes the mix of Wayland client and server code in
> the wayland drm platform source file. All the uses of libwayland-server
> are now contained in native_wayland_drm_bufmgr.c.
> 
> Changes to the drm platform are only compile tested.
> 
Hi Ander Conselvan de Oliveira

Thanks for doing this, I was wondering what's happening with my mesa
build since updating wayland to 1.2 :)

I have a rather silly question

> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> ---
>  src/gallium/state_trackers/egl/Makefile.am         |   2 +-
>  src/gallium/state_trackers/egl/common/native.h     |   2 +-
>  .../egl/common/native_wayland_drm_bufmgr.c         | 214 +++++++++++++++++++++
>  .../egl/common/native_wayland_drm_bufmgr.h         |  37 ++++
>  .../egl/common/native_wayland_drm_bufmgr_helper.c  | 106 ----------
>  .../egl/common/native_wayland_drm_bufmgr_helper.h  |  47 -----
>  src/gallium/state_trackers/egl/drm/native_drm.c    |  52 +----
>  src/gallium/state_trackers/egl/drm/native_drm.h    |   2 +-
>  .../state_trackers/egl/wayland/native_drm.c        |  93 +++------
>  src/gallium/state_trackers/egl/x11/native_dri2.c   |  87 +++------
>  10 files changed, 305 insertions(+), 337 deletions(-)
>  create mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
>  create mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h
>  delete mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
>  delete mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h
[...]
> diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
> new file mode 100644
> index 0000000..1603a3a
> --- /dev/null
> +++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
> @@ -0,0 +1,214 @@
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include "native.h"
> +#include "util/u_inlines.h"
> +#include "state_tracker/drm_driver.h"
> +
> +#ifdef HAVE_WAYLAND_BACKEND
> +
> +#include <wayland-server.h>
> +#include <wayland-drm-server-protocol.h>
> +
> +#include "native_wayland_drm_bufmgr.h"
> +
> +#include "wayland-drm.h"
> +
> +struct wayland_drm_bufmgr {
> +   struct native_display_wayland_bufmgr base;
> +
> +   struct wl_drm *wl_server_drm;
> +   char *device_name;
> +
> +   void *user_data;
> +
> +   wayland_drm_bufmgr_authenticate_func authenticate;
> +};
> +
> +static INLINE struct wayland_drm_bufmgr *
> +wayland_drm_bufmgr(const struct native_display_wayland_bufmgr *base)
> +{
> +   return (struct wayland_drm_bufmgr *) base;
> +}
> +
> +static int
> +wayland_drm_bufmgr_authenticate(void *user_data, uint32_t magic)
> +{
> +   struct native_display *ndpy = user_data;
> +   struct wayland_drm_bufmgr *bufmgr;
> +
> +   bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr);
> +
> +   return bufmgr->authenticate(user_data, magic);
> +}
> +
> +static void
> +wayland_drm_bufmgr_reference_buffer(void *user_data, uint32_t name, int fd,
> +                                    struct wl_drm_buffer *buffer)
> +{
> +   struct native_display *ndpy = user_data;
> +   struct pipe_resource templ;
> +   struct winsys_handle wsh;
> +   enum pipe_format pf;
> +
> +   switch (buffer->format) {
> +   case WL_DRM_FORMAT_ARGB8888:
> +      pf = PIPE_FORMAT_B8G8R8A8_UNORM;
> +      break;
> +   case WL_DRM_FORMAT_XRGB8888:
> +      pf = PIPE_FORMAT_B8G8R8X8_UNORM;
> +      break;
> +   default:
> +      pf = PIPE_FORMAT_NONE;
> +      break;
> +   }
> +
> +   if (pf == PIPE_FORMAT_NONE)
> +      return;
> +
> +   memset(&templ, 0, sizeof(templ));
> +   templ.target = PIPE_TEXTURE_2D;
> +   templ.format = pf;
> +   templ.bind = PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW;
> +   templ.width0 = buffer->buffer.width;
> +   templ.height0 = buffer->buffer.height;
> +   templ.depth0 = 1;
> +   templ.array_size = 1;
> +
> +   memset(&wsh, 0, sizeof(wsh));
> +   wsh.handle = name;
> +   wsh.stride = buffer->stride[0];
> +
> +   buffer->driver_buffer =
> +      ndpy->screen->resource_from_handle(ndpy->screen, &templ, &wsh);
> +}
> +
> +static void
> +wayland_drm_bufmgr_unreference_buffer(void *user_data,
> +                                      struct wl_drm_buffer *buffer)
> +{
> +   struct pipe_resource *resource = buffer->driver_buffer;
> +
> +   pipe_resource_reference(&resource, NULL);
> +}
> +
> +static struct wayland_drm_callbacks wl_drm_callbacks = {
> +   wayland_drm_bufmgr_authenticate,
> +   wayland_drm_bufmgr_reference_buffer,
> +   wayland_drm_bufmgr_unreference_buffer
> +};
> +
> +static boolean
> +wayland_drm_bufmgr_bind_display(struct native_display *ndpy,
> +                                struct wl_display *wl_dpy)
> +{
> +   struct wayland_drm_bufmgr *bufmgr;
> +
> +   bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr);
> +
> +   if (bufmgr->wl_server_drm)
> +      return FALSE;
> +
> +   bufmgr->wl_server_drm = wayland_drm_init(wl_dpy, bufmgr->device_name,
> +         &wl_drm_callbacks, ndpy, 0);
> +
> +   if (!bufmgr->wl_server_drm)
> +      return FALSE;
> +
> +   return TRUE;
> +}
> +
> +static boolean
> +wayland_drm_bufmgr_unbind_display(struct native_display *ndpy,
> +                                  struct wl_display *wl_dpy)
> +{
> +   struct wayland_drm_bufmgr *bufmgr;
> +
> +   bufmgr = wayland_drm_bufmgr(ndpy->wayland_bufmgr);
> +
> +   if (!bufmgr->wl_server_drm)
> +      return FALSE;
> +
> +   wayland_drm_uninit(bufmgr->wl_server_drm);
> +   bufmgr->wl_server_drm = NULL;
> +
> +   return TRUE;
> +}
> +
> +static struct pipe_resource *
> +wayland_drm_bufmgr_wl_buffer_get_resource(struct native_display *ndpy,
> +                                          struct wl_buffer *buffer)
> +{
> +   return wayland_drm_buffer_get_buffer(buffer);
> +}
> +
> +static EGLBoolean
> +wayland_drm_bufmgr_query_buffer(struct native_display *ndpy,
> +                                struct wl_buffer *_buffer,
> +                                EGLint attribute, EGLint *value)

According to
src/gallium/state_trackers/egl/common/native_wayland_bufmgr.h the
function should use non EGL variable types

   boolean (*query_buffer)(struct native_display *ndpy,
                           struct wl_buffer *buffer,
                           int attribute, int *value);

otherwise the compiler complains a bit :\

Cheers
Emil


More information about the mesa-dev mailing list