+From 6a973189d22ae1fef08e90ab6a8f6ee18ad4f33e Mon Sep 17 00:00:00 2001
+From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com>
+Date: Thu, 18 Jul 2013 15:11:23 +0300
+Subject: [PATCH 1/4] gallium-egl: Simplify native_wayland_drm_bufmgr_helper
+ interface
+
+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.
+
+Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@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 +++++++++++++++++++++
+ ...bufmgr_helper.h => native_wayland_drm_bufmgr.h} | 26 +--
+ .../egl/common/native_wayland_drm_bufmgr_helper.c | 106 ----------
+ 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 +++------
+ 9 files changed, 276 insertions(+), 308 deletions(-)
+ create mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.c
+ rename src/gallium/state_trackers/egl/common/{native_wayland_drm_bufmgr_helper.h => native_wayland_drm_bufmgr.h} (59%)
+ delete mode 100644 src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
+
+diff --git a/src/gallium/state_trackers/egl/Makefile.am b/src/gallium/state_trackers/egl/Makefile.am
+index f78b36e..126fafc 100644
+--- a/src/gallium/state_trackers/egl/Makefile.am
++++ b/src/gallium/state_trackers/egl/Makefile.am
+@@ -38,7 +38,7 @@ libegl_la_SOURCES = \
+ common/egl_g3d_st.c \
+ common/egl_g3d_sync.c \
+ common/native_helper.c \
+- common/native_wayland_drm_bufmgr_helper.c
++ common/native_wayland_drm_bufmgr.c
+
+ if HAVE_EGL_PLATFORM_X11
+ libegl_la_SOURCES += \
+diff --git a/src/gallium/state_trackers/egl/common/native.h b/src/gallium/state_trackers/egl/common/native.h
+index 431bd3f..797933d 100644
+--- a/src/gallium/state_trackers/egl/common/native.h
++++ b/src/gallium/state_trackers/egl/common/native.h
+@@ -245,7 +245,7 @@ struct native_display {
+
+ const struct native_display_buffer *buffer;
+ const struct native_display_modeset *modeset;
+- const struct native_display_wayland_bufmgr *wayland_bufmgr;
++ struct native_display_wayland_bufmgr *wayland_bufmgr;
+ };
+
+ /**
+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)
++{
++ struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
++ struct pipe_resource *resource = buffer->driver_buffer;
++
++ if (!wayland_buffer_is_drm(&buffer->buffer))
++ return EGL_FALSE;
++
++ switch (attribute) {
++ case EGL_TEXTURE_FORMAT:
++ switch (resource->format) {
++ case PIPE_FORMAT_B8G8R8A8_UNORM:
++ *value = EGL_TEXTURE_RGBA;
++ return EGL_TRUE;
++ case PIPE_FORMAT_B8G8R8X8_UNORM:
++ *value = EGL_TEXTURE_RGB;
++ return EGL_TRUE;
++ default:
++ return EGL_FALSE;
++ }
++ case EGL_WIDTH:
++ *value = buffer->buffer.width;
++ return EGL_TRUE;
++ case EGL_HEIGHT:
++ *value = buffer->buffer.height;
++ return EGL_TRUE;
++ default:
++ return EGL_FALSE;
++ }
++}
++
++
++struct native_display_wayland_bufmgr *
++wayland_drm_bufmgr_create(wayland_drm_bufmgr_authenticate_func authenticate,
++ void *user_data, char *device_name)
++{
++ struct wayland_drm_bufmgr *bufmgr;
++
++ bufmgr = calloc(1, sizeof *bufmgr);
++ if (!bufmgr)
++ return NULL;
++
++ bufmgr->user_data = user_data;
++ bufmgr->authenticate = authenticate;
++ bufmgr->device_name = strdup(device_name);
++
++ bufmgr->base.bind_display = wayland_drm_bufmgr_bind_display;
++ bufmgr->base.unbind_display = wayland_drm_bufmgr_unbind_display;
++ bufmgr->base.buffer_get_resource = wayland_drm_bufmgr_wl_buffer_get_resource;
++ bufmgr->base.query_buffer = wayland_drm_bufmgr_query_buffer;
++
++ return &bufmgr->base;
++}
++
++void
++wayland_drm_bufmgr_destroy(struct native_display_wayland_bufmgr *_bufmgr)
++{
++ struct wayland_drm_bufmgr *bufmgr = wayland_drm_bufmgr(_bufmgr);
++
++ if (!bufmgr)
++ return;
++
++ free(bufmgr->device_name);
++ free(bufmgr);
++}
++
++#endif
+diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h
+similarity index 59%
+rename from src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h
+rename to src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h
+index 543dc6f..7bf6513 100644
+--- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.h
++++ b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr.h
+@@ -22,26 +22,16 @@
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+-#ifndef _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_
+-#define _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_
++#ifndef _NATIVE_WAYLAND_DRM_BUFMGR_H_
++#define _NATIVE_WAYLAND_DRM_BUFMGR_H_
+
+-#include "wayland-drm.h"
++typedef int (*wayland_drm_bufmgr_authenticate_func)(void *, uint32_t);
+
+-void
+-egl_g3d_wl_drm_helper_reference_buffer(void *user_data, uint32_t name, int fd,
+- struct wl_drm_buffer *buffer);
++struct native_display_wayland_bufmgr *
++wayland_drm_bufmgr_create(wayland_drm_bufmgr_authenticate_func authenticate,
++ void *user_data, char *device_name);
+
+ void
+-egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
+- struct wl_drm_buffer *buffer);
+-
+-struct pipe_resource *
+-egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,
+- struct wl_buffer *buffer);
+-
+-EGLBoolean
+-egl_g3d_wl_drm_common_query_buffer(struct native_display *ndpy,
+- struct wl_buffer *buffer,
+- EGLint attribute, EGLint *value);
++wayland_drm_bufmgr_destroy(struct native_display_wayland_bufmgr *bufmgr);
+
+-#endif /* _NATIVE_WAYLAND_DRM_BUFMGR_HELPER_H_ */
++#endif /* _NATIVE_WAYLAND_DRM_BUFMGR_H_ */
+diff --git a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c b/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
+deleted file mode 100644
+index a9e7342..0000000
+--- a/src/gallium/state_trackers/egl/common/native_wayland_drm_bufmgr_helper.c
++++ /dev/null
+@@ -1,106 +0,0 @@
+-#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_helper.h"
+-
+-void
+-egl_g3d_wl_drm_helper_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);
+-}
+-
+-void
+-egl_g3d_wl_drm_helper_unreference_buffer(void *user_data,
+- struct wl_drm_buffer *buffer)
+-{
+- struct pipe_resource *resource = buffer->driver_buffer;
+-
+- pipe_resource_reference(&resource, NULL);
+-}
+-
+-struct pipe_resource *
+-egl_g3d_wl_drm_common_wl_buffer_get_resource(struct native_display *ndpy,
+- struct wl_buffer *buffer)
+-{
+- return wayland_drm_buffer_get_buffer(buffer);
+-}
+-
+-EGLBoolean
+-egl_g3d_wl_drm_common_query_buffer(struct native_display *ndpy,
+- struct wl_buffer *_buffer,
+- EGLint attribute, EGLint *value)
+-{
+- struct wl_drm_buffer *buffer = (struct wl_drm_buffer *) _buffer;
+- struct pipe_resource *resource = buffer->driver_buffer;
+-
+- if (!wayland_buffer_is_drm(&buffer->buffer))
+- return EGL_FALSE;
+-
+- switch (attribute) {
+- case EGL_TEXTURE_FORMAT:
+- switch (resource->format) {
+- case PIPE_FORMAT_B8G8R8A8_UNORM:
+- *value = EGL_TEXTURE_RGBA;
+- return EGL_TRUE;
+- case PIPE_FORMAT_B8G8R8X8_UNORM:
+- *value = EGL_TEXTURE_RGB;
+- return EGL_TRUE;
+- default:
+- return EGL_FALSE;
+- }
+- case EGL_WIDTH:
+- *value = buffer->buffer.width;
+- return EGL_TRUE;
+- case EGL_HEIGHT:
+- *value = buffer->buffer.height;
+- return EGL_TRUE;
+- default:
+- return EGL_FALSE;
+- }
+-}
+-
+-#endif
+diff --git a/src/gallium/state_trackers/egl/drm/native_drm.c b/src/gallium/state_trackers/egl/drm/native_drm.c
+index 03bfdda..88ac490 100644
+--- a/src/gallium/state_trackers/egl/drm/native_drm.c
++++ b/src/gallium/state_trackers/egl/drm/native_drm.c
+@@ -132,6 +132,8 @@ drm_display_destroy(struct native_display *ndpy)
+
+ FREE(drmdpy->device_name);
+
++ wayland_drm_bufmgr_destroy(ndpy->wayland_bufmgr);
++
+ if (drmdpy->own_gbm) {
+ gbm_device_destroy(&drmdpy->gbmdrm->base.base);
+ if (drmdpy->fd >= 0)
+@@ -195,53 +197,6 @@ drm_display_authenticate(void *user_data, uint32_t magic)
+ return drmAuthMagic(drmdpy->fd, magic);
+ }
+
+-static struct wayland_drm_callbacks wl_drm_callbacks = {
+- drm_display_authenticate,
+- egl_g3d_wl_drm_helper_reference_buffer,
+- egl_g3d_wl_drm_helper_unreference_buffer
+-};
+-
+-static boolean
+-drm_display_bind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct drm_display *drmdpy = drm_display(ndpy);
+-
+- if (drmdpy->wl_server_drm)
+- return FALSE;
+-
+- drmdpy->wl_server_drm = wayland_drm_init(wl_dpy,
+- drmdpy->device_name,
+- &wl_drm_callbacks, ndpy, 0);
+-
+- if (!drmdpy->wl_server_drm)
+- return FALSE;
+-
+- return TRUE;
+-}
+-
+-static boolean
+-drm_display_unbind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct drm_display *drmdpy = drm_display(ndpy);
+-
+- if (!drmdpy->wl_server_drm)
+- return FALSE;
+-
+- wayland_drm_uninit(drmdpy->wl_server_drm);
+- drmdpy->wl_server_drm = NULL;
+-
+- return TRUE;
+-}
+-
+-static struct native_display_wayland_bufmgr drm_display_wayland_bufmgr = {
+- drm_display_bind_wayland_display,
+- drm_display_unbind_wayland_display,
+- egl_g3d_wl_drm_common_wl_buffer_get_resource,
+- egl_g3d_wl_drm_common_query_buffer
+-};
+-
+ #endif /* HAVE_WAYLAND_BACKEND */
+
+ static struct native_surface *
+@@ -293,7 +248,8 @@ drm_create_display(struct gbm_gallium_drm_device *gbmdrm, int own_gbm,
+ drmdpy->base.buffer = &drm_display_buffer;
+ #ifdef HAVE_WAYLAND_BACKEND
+ if (drmdpy->device_name)
+- drmdpy->base.wayland_bufmgr = &drm_display_wayland_bufmgr;
++ drmdpy->base.wayland_bufmgr = wayland_drm_bufmgr_create(
++ drm_display_authenticate, drmdpy, drmdpy->device_name);
+ #endif
+ drm_display_init_modeset(&drmdpy->base);
+
+diff --git a/src/gallium/state_trackers/egl/drm/native_drm.h b/src/gallium/state_trackers/egl/drm/native_drm.h
+index 16a4251..2c015b2 100644
+--- a/src/gallium/state_trackers/egl/drm/native_drm.h
++++ b/src/gallium/state_trackers/egl/drm/native_drm.h
+@@ -37,7 +37,7 @@
+ #include "common/native_helper.h"
+
+ #ifdef HAVE_WAYLAND_BACKEND
+-#include "common/native_wayland_drm_bufmgr_helper.h"
++#include "common/native_wayland_drm_bufmgr.h"
+ #endif
+
+ #include "gbm_gallium_drmint.h"
+diff --git a/src/gallium/state_trackers/egl/wayland/native_drm.c b/src/gallium/state_trackers/egl/wayland/native_drm.c
+index fc8aac7..a4bcdd8 100644
+--- a/src/gallium/state_trackers/egl/wayland/native_drm.c
++++ b/src/gallium/state_trackers/egl/wayland/native_drm.c
+@@ -40,7 +40,7 @@
+ #include "wayland-drm-client-protocol.h"
+ #include "wayland-egl-priv.h"
+
+-#include "common/native_wayland_drm_bufmgr_helper.h"
++#include "common/native_wayland_drm_bufmgr.h"
+
+ #include <xf86drm.h>
+ #include <sys/types.h>
+@@ -53,7 +53,6 @@ struct wayland_drm_display {
+ const struct native_event_handler *event_handler;
+
+ struct wl_drm *wl_drm;
+- struct wl_drm *wl_server_drm; /* for EGL_WL_bind_wayland_display */
+ int fd;
+ char *device_name;
+ boolean authenticated;
+@@ -77,6 +76,8 @@ wayland_drm_display_destroy(struct native_display *ndpy)
+ if (drmdpy->base.own_dpy)
+ wl_display_disconnect(drmdpy->base.dpy);
+
++ wayland_drm_bufmgr_destroy(ndpy->wayland_bufmgr);
++
+ ndpy_uninit(ndpy);
+
+ if (drmdpy->fd)
+@@ -195,6 +196,24 @@ static const struct wl_registry_listener registry_listener = {
+ registry_handle_global
+ };
+
++static int
++wayland_drm_display_authenticate(void *user_data, uint32_t magic)
++{
++ struct native_display *ndpy = user_data;
++ struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
++ boolean current_authenticate, authenticated;
++
++ current_authenticate = drmdpy->authenticated;
++
++ wl_drm_authenticate(drmdpy->wl_drm, magic);
++ wl_display_roundtrip(drmdpy->base.dpy);
++ authenticated = drmdpy->authenticated;
++
++ drmdpy->authenticated = current_authenticate;
++
++ return authenticated ? 0 : -1;
++}
++
+ static boolean
+ wayland_drm_display_init_screen(struct native_display *ndpy)
+ {
+@@ -226,6 +245,9 @@ wayland_drm_display_init_screen(struct native_display *ndpy)
+ return FALSE;
+ }
+
++ drmdpy->base.base.wayland_bufmgr = wayland_drm_bufmgr_create(
++ wayland_drm_display_authenticate, drmdpy, drmdpy->device_name);
++
+ return TRUE;
+ }
+
+@@ -235,72 +257,6 @@ static struct native_display_buffer wayland_drm_display_buffer = {
+ drm_display_export_native_buffer
+ };
+
+-static int
+-wayland_drm_display_authenticate(void *user_data, uint32_t magic)
+-{
+- struct native_display *ndpy = user_data;
+- struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
+- boolean current_authenticate, authenticated;
+-
+- current_authenticate = drmdpy->authenticated;
+-
+- wl_drm_authenticate(drmdpy->wl_drm, magic);
+- wl_display_roundtrip(drmdpy->base.dpy);
+- authenticated = drmdpy->authenticated;
+-
+- drmdpy->authenticated = current_authenticate;
+-
+- return authenticated ? 0 : -1;
+-}
+-
+-static struct wayland_drm_callbacks wl_drm_callbacks = {
+- wayland_drm_display_authenticate,
+- egl_g3d_wl_drm_helper_reference_buffer,
+- egl_g3d_wl_drm_helper_unreference_buffer
+-};
+-
+-static boolean
+-wayland_drm_display_bind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
+-
+- if (drmdpy->wl_server_drm)
+- return FALSE;
+-
+- drmdpy->wl_server_drm =
+- wayland_drm_init(wl_dpy, drmdpy->device_name,
+- &wl_drm_callbacks, ndpy, 0);
+-
+- if (!drmdpy->wl_server_drm)
+- return FALSE;
+-
+- return TRUE;
+-}
+-
+-static boolean
+-wayland_drm_display_unbind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct wayland_drm_display *drmdpy = wayland_drm_display(ndpy);
+-
+- if (!drmdpy->wl_server_drm)
+- return FALSE;
+-
+- wayland_drm_uninit(drmdpy->wl_server_drm);
+- drmdpy->wl_server_drm = NULL;
+-
+- return TRUE;
+-}
+-
+-static struct native_display_wayland_bufmgr wayland_drm_display_wayland_bufmgr = {
+- wayland_drm_display_bind_wayland_display,
+- wayland_drm_display_unbind_wayland_display,
+- egl_g3d_wl_drm_common_wl_buffer_get_resource,
+- egl_g3d_wl_drm_common_query_buffer
+-};
+-
+-
+ struct wayland_display *
+ wayland_create_drm_display(struct wl_display *dpy,
+ const struct native_event_handler *event_handler)
+@@ -322,7 +278,6 @@ wayland_create_drm_display(struct wl_display *dpy,
+ drmdpy->base.base.init_screen = wayland_drm_display_init_screen;
+ drmdpy->base.base.destroy = wayland_drm_display_destroy;
+ drmdpy->base.base.buffer = &wayland_drm_display_buffer;
+- drmdpy->base.base.wayland_bufmgr = &wayland_drm_display_wayland_bufmgr;
+
+ drmdpy->base.create_buffer = wayland_create_drm_buffer;
+
+diff --git a/src/gallium/state_trackers/egl/x11/native_dri2.c b/src/gallium/state_trackers/egl/x11/native_dri2.c
+index 053044a..3d08863 100644
+--- a/src/gallium/state_trackers/egl/x11/native_dri2.c
++++ b/src/gallium/state_trackers/egl/x11/native_dri2.c
+@@ -39,7 +39,7 @@
+
+ #include "common/native_helper.h"
+ #ifdef HAVE_WAYLAND_BACKEND
+-#include "common/native_wayland_drm_bufmgr_helper.h"
++#include "common/native_wayland_drm_bufmgr.h"
+ #endif
+
+ #ifdef GLX_DIRECT_RENDERING
+@@ -757,6 +757,8 @@ dri2_display_destroy(struct native_display *ndpy)
+ if (dri2dpy->surfaces)
+ util_hash_table_destroy(dri2dpy->surfaces);
+
++ wayland_drm_bufmgr_destroy(ndpy->wayland_bufmgr);
++
+ if (dri2dpy->xscr)
+ x11_screen_destroy(dri2dpy->xscr);
+ if (dri2dpy->own_dpy)
+@@ -785,6 +787,19 @@ dri2_display_invalidate_buffers(struct x11_screen *xscr, Drawable drawable,
+ &dri2surf->base, dri2surf->server_stamp);
+ }
+
++#ifdef HAVE_WAYLAND_BACKEND
++
++static int
++dri2_display_authenticate(void *user_data, uint32_t magic)
++{
++ struct native_display *ndpy = user_data;
++ struct dri2_display *dri2dpy = dri2_display(ndpy);
++
++ return x11_screen_authenticate(dri2dpy->xscr, magic);
++}
++
++#endif /* HAVE_WAYLAND_BACKEND */
++
+ /**
+ * Initialize DRI2 and pipe screen.
+ */
+@@ -816,6 +831,13 @@ dri2_display_init_screen(struct native_display *ndpy)
+ return FALSE;
+ }
+
++#ifdef HAVE_WAYLAND_BACKEND
++ dri2dpy->base.wayland_bufmgr = wayland_drm_bufmgr_create(
++ dri2_display_authenticate, dri2dpy,
++ x11_screen_get_device_name(dri2dpy->xscr));
++
++#endif
++
+ return TRUE;
+ }
+
+@@ -832,66 +854,6 @@ dri2_display_hash_table_compare(void *key1, void *key2)
+ return ((char *) key1 - (char *) key2);
+ }
+
+-#ifdef HAVE_WAYLAND_BACKEND
+-
+-static int
+-dri2_display_authenticate(void *user_data, uint32_t magic)
+-{
+- struct native_display *ndpy = user_data;
+- struct dri2_display *dri2dpy = dri2_display(ndpy);
+-
+- return x11_screen_authenticate(dri2dpy->xscr, magic);
+-}
+-
+-static struct wayland_drm_callbacks wl_drm_callbacks = {
+- dri2_display_authenticate,
+- egl_g3d_wl_drm_helper_reference_buffer,
+- egl_g3d_wl_drm_helper_unreference_buffer
+-};
+-
+-static boolean
+-dri2_display_bind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct dri2_display *dri2dpy = dri2_display(ndpy);
+-
+- if (dri2dpy->wl_server_drm)
+- return FALSE;
+-
+- dri2dpy->wl_server_drm = wayland_drm_init(wl_dpy,
+- x11_screen_get_device_name(dri2dpy->xscr),
+- &wl_drm_callbacks, ndpy, 0);
+-
+- if (!dri2dpy->wl_server_drm)
+- return FALSE;
+-
+- return TRUE;
+-}
+-
+-static boolean
+-dri2_display_unbind_wayland_display(struct native_display *ndpy,
+- struct wl_display *wl_dpy)
+-{
+- struct dri2_display *dri2dpy = dri2_display(ndpy);
+-
+- if (!dri2dpy->wl_server_drm)
+- return FALSE;
+-
+- wayland_drm_uninit(dri2dpy->wl_server_drm);
+- dri2dpy->wl_server_drm = NULL;
+-
+- return TRUE;
+-}
+-
+-static struct native_display_wayland_bufmgr dri2_display_wayland_bufmgr = {
+- dri2_display_bind_wayland_display,
+- dri2_display_unbind_wayland_display,
+- egl_g3d_wl_drm_common_wl_buffer_get_resource,
+- egl_g3d_wl_drm_common_query_buffer
+-};
+-
+-#endif /* HAVE_WAYLAND_BACKEND */
+-
+ struct native_display *
+ x11_create_dri2_display(Display *dpy,
+ const struct native_event_handler *event_handler)
+@@ -936,9 +898,6 @@ x11_create_dri2_display(Display *dpy,
+ dri2dpy->base.copy_to_pixmap = native_display_copy_to_pixmap;
+ dri2dpy->base.create_window_surface = dri2_display_create_window_surface;
+ dri2dpy->base.create_pixmap_surface = dri2_display_create_pixmap_surface;
+-#ifdef HAVE_WAYLAND_BACKEND
+- dri2dpy->base.wayland_bufmgr = &dri2_display_wayland_bufmgr;
+-#endif
+
+ return &dri2dpy->base;
+ }
+--
+1.8.4
+