diff options
Diffstat (limited to 'src/egl/drivers')
-rw-r--r-- | src/egl/drivers/dri2/platform_wayland.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c index 211036f45f4..f4c09ac0bc1 100644 --- a/src/egl/drivers/dri2/platform_wayland.c +++ b/src/egl/drivers/dri2/platform_wayland.c @@ -43,6 +43,7 @@ #include "egl_dri2_fallbacks.h" #include "loader.h" #include "util/u_vector.h" +#include "eglglobals.h" #include <wayland-client.h> #include "wayland-drm-client-protocol.h" @@ -111,6 +112,19 @@ destroy_window_callback(void *data) dri2_surf->wl_win = NULL; } +static struct wl_surface * +get_wl_surface_proxy(struct wl_egl_window *window) +{ + /* Version 3 of wl_egl_window introduced a version field at the same + * location where a pointer to wl_surface was stored. Thus, if + * window->version is dereferencable, we've been given an older version of + * wl_egl_window, and window->version points to wl_surface */ + if (_eglPointerIsDereferencable((void *)(window->version))) { + return wl_proxy_create_wrapper((void *)(window->version)); + } + return wl_proxy_create_wrapper(window->surface); +} + /** * Called via eglCreateWindowSurface(), drv->API.CreateWindowSurface(). */ @@ -182,7 +196,7 @@ dri2_wl_create_window_surface(_EGLDriver *drv, _EGLDisplay *disp, wl_proxy_set_queue((struct wl_proxy *)dri2_surf->wl_dpy_wrapper, dri2_surf->wl_queue); - dri2_surf->wl_surface_wrapper = wl_proxy_create_wrapper(window->surface); + dri2_surf->wl_surface_wrapper = get_wl_surface_proxy(window); if (!dri2_surf->wl_surface_wrapper) { _eglError(EGL_BAD_ALLOC, "dri2_create_surface"); goto cleanup_drm; |