瀏覽代碼

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.
tags/android-x86-2.2-r2
Kristian Høgsberg 14 年之前
父節點
當前提交
56758c839f
共有 2 個檔案被更改,包括 29 行新增4 行删除
  1. 28
    4
      src/egl/drivers/dri2/platform_wayland.c
  2. 1
    0
      src/egl/wayland/wayland-egl.c

+ 28
- 4
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) {

+ 1
- 0
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;


Loading…
取消
儲存