summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <[email protected]>2011-02-04 15:37:51 -0500
committerBenjamin Franzke <[email protected]>2011-02-07 14:01:31 +0100
commit56758c839ff29bd168529535a4816bff3b79cde5 (patch)
tree9ca01e899c867941fb3a2dbb64943bfdf70e7de6
parent93aea84f472f5f9ff588f7b2d4f7320ec43bc216 (diff)
wayland-egl: Force roundtrips to get device name and authenticate correctly
If the client hasn't done the initial wl_display_iterate() at the time we initialize the display, we have to do that in platform_wayland.c. Make sure we detect that correctly instead of dup()ing fd=0, and use the sync callback to make sure we don't wait forever for authorization that won't happen.
-rw-r--r--src/egl/drivers/dri2/platform_wayland.c32
-rw-r--r--src/egl/wayland/wayland-egl.c1
2 files changed, 29 insertions, 4 deletions
diff --git a/src/egl/drivers/dri2/platform_wayland.c b/src/egl/drivers/dri2/platform_wayland.c
index b2234036158..16e088827ed 100644
--- a/src/egl/drivers/dri2/platform_wayland.c
+++ b/src/egl/drivers/dri2/platform_wayland.c
@@ -504,6 +504,24 @@ dri2_terminate(_EGLDriver *drv, _EGLDisplay *disp)
return EGL_TRUE;
}
+static void
+sync_callback(void *data)
+{
+ int *done = data;
+
+ *done = 1;
+}
+
+static void
+force_roundtrip(struct wl_display *display)
+{
+ int done = 0;
+
+ wl_display_sync_callback(display, sync_callback, &done);
+ wl_display_iterate(display, WL_DISPLAY_WRITABLE);
+ while (!done)
+ wl_display_iterate(display, WL_DISPLAY_READABLE);
+}
EGLBoolean
dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
@@ -525,15 +543,21 @@ dri2_initialize_wayland(_EGLDriver *drv, _EGLDisplay *disp)
disp->DriverData = (void *) dri2_dpy;
dri2_dpy->wl_dpy = disp->PlatformDisplay;
+ if (dri2_dpy->wl_dpy->fd == -1)
+ force_roundtrip(dri2_dpy->wl_dpy->display);
+ if (dri2_dpy->wl_dpy->fd == -1)
+ goto cleanup_dpy;
+
dri2_dpy->fd = dup(dri2_dpy->wl_dpy->fd);
if (dri2_dpy->fd < 0) {
_eglError(EGL_BAD_ALLOC, "DRI2: failed to dup fd");
goto cleanup_dpy;
}
-
- wl_display_iterate(dri2_dpy->wl_dpy->display, WL_DISPLAY_WRITABLE);
- while (!dri2_dpy->wl_dpy->authenticated)
- wl_display_iterate(dri2_dpy->wl_dpy->display, WL_DISPLAY_READABLE);
+
+ if (!dri2_dpy->wl_dpy->authenticated)
+ force_roundtrip(dri2_dpy->wl_dpy->display);
+ if (!dri2_dpy->wl_dpy->authenticated)
+ goto cleanup_dpy;
dri2_dpy->driver_name = dri2_get_driver_for_fd(dri2_dpy->fd);
if (dri2_dpy->driver_name == NULL) {
diff --git a/src/egl/wayland/wayland-egl.c b/src/egl/wayland/wayland-egl.c
index 6aa2d51063a..bb95fcbf590 100644
--- a/src/egl/wayland/wayland-egl.c
+++ b/src/egl/wayland/wayland-egl.c
@@ -102,6 +102,7 @@ wl_egl_display_create(struct wl_display *display)
egl_display->display = display;
egl_display->drm = NULL;
+ egl_display->fd = -1;
egl_display->device_name = NULL;
egl_display->authenticated = false;