diff --git a/hw/xfree86/xwayland/xwayland-client.c b/hw/xfree86/xwayland/xwayland-client.c index 944db61..ce900cf 100644 --- a/hw/xfree86/xwayland/xwayland-client.c +++ b/hw/xfree86/xwayland/xwayland-client.c @@ -114,11 +114,10 @@ global_handler(struct wl_display *display, wl_compositor_create (xwl_screen->display, id, 1); wl_compositor_add_listener(xwl_screen->compositor, &compositor_listener, xwl_screen); -#ifdef WITH_LIBDRMM +#ifdef WITH_LIBDRM } else if (strcmp (interface, "wl_drm") == 0) { - xwl_screen->drm = wl_drm_create (xwl_screen->display, id); - wl_drm_add_listener (xwl_screen->drm, - &drm_listener, xwl_screen); + xwl_screen->drm = wl_drm_create (xwl_screen->display, id, 1); + wl_drm_add_listener (xwl_screen->drm, &xwl_drm_listener, xwl_screen); #endif } else if (strcmp (interface, "wl_shm") == 0) { xwl_screen->shm = wl_shm_create (xwl_screen->display, id, 1); @@ -166,10 +165,21 @@ sync_callback(void *data) *done = 1; } +void +xwl_force_roundtrip(struct xwl_screen *xwl_screen) +{ + int done = 0; + + wl_display_sync_callback(xwl_screen->display, sync_callback, &done); + wl_display_iterate(xwl_screen->display, WL_DISPLAY_WRITABLE); + while (!done) + wl_display_iterate(xwl_screen->display, WL_DISPLAY_READABLE); +} + int wayland_screen_init(struct xwl_screen *xwl_screen, int use_drm) { - int done = 0; + int ret; xwl_screen->display = wl_display_connect(NULL); if (xwl_screen->display == NULL) { @@ -186,37 +196,22 @@ wayland_screen_init(struct xwl_screen *xwl_screen, int use_drm) wl_display_iterate(xwl_screen->display, WL_DISPLAY_READABLE); xwl_screen->wayland_fd = - wl_display_get_fd(xwl_screen->display, - source_update, xwl_screen); + wl_display_get_fd(xwl_screen->display, source_update, xwl_screen); AddGeneralSocket(xwl_screen->wayland_fd); - RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, - xwl_screen); + RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, xwl_screen); #ifdef WITH_LIBDRM - if (use_drm) { - int ret; - - if ((ret = wayland_drm_screen_init(xwl_screen)) != Success) - return ret; - - wl_display_iterate(xwl_screen->display, WL_DISPLAY_WRITABLE); - while (!xwl_screen->authenticated) - wl_display_iterate(xwl_screen->display, WL_DISPLAY_READABLE); - } + if (use_drm) + ret = wayland_drm_screen_init(xwl_screen); + if (use_drm && ret != Success) + return ret; #endif - if (!xwl_screen->premultiplied_argb_visual || !xwl_screen->rgb_visual) { - wl_display_sync_callback(xwl_screen->display, sync_callback, &done); - wl_display_iterate(xwl_screen->display, WL_DISPLAY_WRITABLE); - while (!done) - wl_display_iterate(xwl_screen->display, WL_DISPLAY_READABLE); - if (!xwl_screen->premultiplied_argb_visual || - !xwl_screen->rgb_visual) { - ErrorF("visuals missing"); - exit(1); - } - } + if (!xwl_screen->premultiplied_argb_visual || !xwl_screen->rgb_visual) + xwl_force_roundtrip(xwl_screen); + if (!xwl_screen->premultiplied_argb_visual || !xwl_screen->rgb_visual) + return BadMatch; return Success; } diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c index 70497ce..2f33014 100644 --- a/hw/xfree86/xwayland/xwayland-drm.c +++ b/hw/xfree86/xwayland/xwayland-drm.c @@ -33,7 +33,7 @@ #include #include #include -#include +#include #include #include @@ -62,7 +62,7 @@ drm_handle_authenticated (void *data, struct wl_drm *drm) xwl_screen->authenticated = 1; } -static const struct wl_drm_listener drm_listener = +const struct wl_drm_listener xwl_drm_listener = { drm_handle_device, drm_handle_authenticated @@ -73,6 +73,11 @@ wayland_drm_screen_init(struct xwl_screen *xwl_screen) { uint32_t magic; + xwl_force_roundtrip(xwl_screen); + + ErrorF("wayland_drm_screen_init, device name %s\n", + xwl_screen->device_name); + xwl_screen->drm_fd = open(xwl_screen->device_name, O_RDWR); if (xwl_screen->drm_fd < 0) { ErrorF("failed to open the drm fd\n"); @@ -85,5 +90,15 @@ wayland_drm_screen_init(struct xwl_screen *xwl_screen) } wl_drm_authenticate(xwl_screen->drm, magic); + + xwl_force_roundtrip(xwl_screen); + + ErrorF("opened drm fd: %d\n", xwl_screen->drm_fd); + + if (!xwl_screen->authenticated) { + ErrorF("Failed to auth drm fd\n"); + return BadAccess; + } + return Success; } diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c index 19a5974..cafeaed 100644 --- a/hw/xfree86/xwayland/xwayland-input.c +++ b/hw/xfree86/xwayland/xwayland-input.c @@ -513,6 +513,8 @@ input_handler(struct wl_display *display, struct xwl_screen *xwl_screen = data; if (strcmp (interface, "wl_input_device") == 0) { + ErrorF("input_handler: input device %d\n", id); + create_input_device(xwl_screen, id, 1); } } @@ -520,6 +522,8 @@ input_handler(struct wl_display *display, void xwl_input_init(struct xwl_screen *xwl_screen) { + ErrorF("xwl_input_init\n"); + xwl_screen->input_listener = wl_display_add_global_listener(xwl_screen->display, input_handler, xwl_screen); diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h index 0ad2aa8..e0d0144 100644 --- a/hw/xfree86/xwayland/xwayland-private.h +++ b/hw/xfree86/xwayland/xwayland-private.h @@ -102,6 +102,8 @@ struct xwl_input_device { struct list link; }; +extern const struct wl_drm_listener xwl_drm_listener; + struct xwl_output * xwl_output_create(struct xwl_screen *xwl_screen); @@ -109,6 +111,8 @@ void xwl_input_teardown(pointer p); pointer xwl_input_setup(pointer module, pointer opts, int *errmaj, int *errmin); void xwl_input_init(struct xwl_screen *screen); +void xwl_force_roundtrip(struct xwl_screen *xwl_screen); + int wayland_screen_init(struct xwl_screen *screen, int use_drm); int wayland_screen_close(struct xwl_screen *screen); diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c index ccdf28f..001c4d6 100644 --- a/hw/xfree86/xwayland/xwayland.c +++ b/hw/xfree86/xwayland/xwayland.c @@ -50,7 +50,7 @@ #include "drm-client-protocol.h" #ifdef WITH_LIBDRM -#include "wayland-drm-client-protocol.h" +#include "drm-client-protocol.h" #endif /* @@ -671,8 +671,7 @@ xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen) { miPointerScreenPtr pointer_priv; - if (wayland_screen_init(xwl_screen, xwl_screen->driver->use_drm) != Success) - return BadAlloc; + ErrorF("xwl_screen_init\n"); xwl_screen->screen = screen; @@ -707,6 +706,8 @@ xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen) xwl_screen->sprite_funcs = pointer_priv->spriteFuncs; pointer_priv->spriteFuncs = &xwl_pointer_sprite_funcs; + ErrorF("scheduling xwl_input_delayed_init\n"); + TimerSet(NULL, 0, 1, xwl_input_delayed_init, xwl_screen); return Success; } @@ -717,6 +718,8 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, { struct xwl_screen *xwl_screen; + ErrorF("xwl_screen_pre_init\n"); + xwl_screen = calloc(sizeof *xwl_screen, 1); if (xwl_screen == NULL) { ErrorF("calloc failed\n"); @@ -739,6 +742,10 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, xf86InitialConfiguration(scrninfo, TRUE); + if (wayland_screen_init(xwl_screen, + xwl_screen->driver->use_drm) != Success) + return NULL; + return xwl_screen; } @@ -751,7 +758,7 @@ int xwl_screen_get_drm_fd(struct xwl_screen *xwl_screen) #ifdef WITH_LIBDRM int xwl_create_window_buffer_drm(struct xwl_window *xwl_window, - PixmapPtr pixmap, uint32_t name) + PixmapPtr pixmap, uint32_t name) { xwl_window->buffer = wl_drm_create_buffer(xwl_window->xwl_screen->drm, @@ -794,8 +801,7 @@ void xwl_screen_destroy(struct xwl_screen *xwl_screen) free(xwl_screen); } -int xwl_screen_authenticate(struct xwl_screen *xwl_screen, - uint32_t magic) +int xwl_screen_authenticate(struct xwl_screen *xwl_screen, uint32_t magic) { xwl_screen->authenticated = 0; #ifdef WITH_LIBDRM