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.olive...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev