mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 17:30:12 +01:00
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.
This commit is contained in:
parent
93aea84f47
commit
56758c839f
2 changed files with 29 additions and 4 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue