summaryrefslogtreecommitdiff
path: root/src/egl/drivers/dri2/platform_wayland.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/egl/drivers/dri2/platform_wayland.c')
-rw-r--r--src/egl/drivers/dri2/platform_wayland.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index 21b440624f..6ae3f6554b 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -35,6 +35,9 @@
#include "egl_dri2.h"
+#include <wayland-client.h>
+#include "wayland-drm-client-protocol.h"
+
static void
sync_callback(void *data)
{
@@ -561,6 +564,26 @@ dri2_wayland_create_image_khr(_EGLDriver *drv, _EGLDisplay *disp,
}
}
+static int
+dri2_wayland_authenticate(_EGLDisplay *disp, uint32_t id)
+{
+ struct dri2_egl_display *dri2_dpy = dri2_egl_display(disp);
+ int ret = 0;
+
+ dri2_dpy->wl_dpy->authenticated = false;
+
+ wl_drm_authenticate(dri2_dpy->wl_dpy->drm, id);
+ force_roundtrip(dri2_dpy->wl_dpy->display);
+
+ if (!dri2_dpy->wl_dpy->authenticated)
+ ret = -1;
+
+ /* reset authenticated */
+ dri2_dpy->wl_dpy->authenticated = true;
+
+ return ret;
+}
+
/**
* Called via eglTerminate(), drv->API.Terminate().
*/
@@ -626,8 +649,14 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
goto cleanup_fd;
}
- if (!dri2_load_driver(disp))
+ dri2_dpy->device_name = strdup(dri2_dpy->wl_dpy->device_name);
+ if (dri2_dpy->device_name == NULL) {
+ _eglError(EGL_BAD_ALLOC, "DRI2: failed to get device name");
goto cleanup_driver_name;
+ }
+
+ if (!dri2_load_driver(disp))
+ goto cleanup_device_name;
dri2_dpy->dri2_loader_extension.base.name = __DRI_DRI2_LOADER;
dri2_dpy->dri2_loader_extension.base.version = 3;
@@ -654,6 +683,9 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
disp->Extensions.KHR_gl_renderbuffer_image = EGL_TRUE;
disp->Extensions.KHR_gl_texture_2D_image = EGL_TRUE;
+ disp->Extensions.WL_bind_wayland_display = EGL_TRUE;
+ dri2_dpy->authenticate = dri2_wayland_authenticate;
+
/* we're supporting EGL 1.4 */
disp->VersionMajor = 1;
disp->VersionMinor = 4;
@@ -662,6 +694,8 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
cleanup_driver:
dlclose(dri2_dpy->driver);
+ cleanup_device_name:
+ free(dri2_dpy->device_name);
cleanup_driver_name:
free(dri2_dpy->driver_name);
cleanup_fd: