neccessary for dri3 Signed-off-by: Axel Davy <axel.d...@ens.fr> --- v2: fix indentation hw/xfree86/xwayland/xwayland-drm.c | 56 ++++++++++++++++++++++++-------------- hw/xfree86/xwayland/xwayland.h | 3 ++ 2 files changed, 38 insertions(+), 21 deletions(-)
diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c index 076fb68..12011bf 100644 --- a/hw/xfree86/xwayland/xwayland-drm.c +++ b/hw/xfree86/xwayland/xwayland-drm.c @@ -157,49 +157,63 @@ is_fd_render_node(int fd) } int -xwl_drm_pre_init(struct xwl_screen *xwl_screen) +xwl_device_get_fd(struct xwl_screen *xwl_screen) { uint32_t magic; + int fd; - xwl_screen->drm_registry = wl_display_get_registry(xwl_screen->display); - wl_registry_add_listener(xwl_screen->drm_registry, &drm_listener, - xwl_screen); - - /* Ensure drm_handler has seen all the interfaces */ - wl_display_roundtrip(xwl_screen->display); - /* Ensure the xwl_drm_listener has seen the drm device, if any */ - wl_display_roundtrip(xwl_screen->display); - - 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) { + fd = open(xwl_screen->device_name, O_RDWR); + if (fd < 0) { ErrorF("failed to open the drm fd\n"); - return BadAccess; + return -1; } - if (!is_fd_render_node(xwl_screen->drm_fd)) { + if (!is_fd_render_node(fd)) { - if (drmGetMagic(xwl_screen->drm_fd, &magic)) { + if (drmGetMagic(fd, &magic)) { ErrorF("failed to get drm magic"); - return BadAccess; + close (fd); + return -1; } wl_drm_authenticate(xwl_screen->drm, magic); wl_display_roundtrip(xwl_screen->display); - ErrorF("opened drm fd: %d\n", xwl_screen->drm_fd); + ErrorF("opened drm fd: %d\n", fd); if (!xwl_screen->authenticated) { ErrorF("Failed to auth drm fd\n"); - return BadAccess; + close (fd); + return -1; } } else { xwl_screen->authenticated = 1; } + return fd; +} + +int +xwl_drm_pre_init(struct xwl_screen *xwl_screen) +{ + xwl_screen->drm_registry = wl_display_get_registry(xwl_screen->display); + wl_registry_add_listener(xwl_screen->drm_registry, &drm_listener, + xwl_screen); + + /* Ensure drm_handler has seen all the interfaces */ + wl_display_roundtrip(xwl_screen->display); + /* Ensure the xwl_drm_listener has seen the drm device, if any */ + wl_display_roundtrip(xwl_screen->display); + + ErrorF("wayland_drm_screen_init, device name %s\n", + xwl_screen->device_name); + + xwl_screen->drm_fd = xwl_device_get_fd(xwl_screen); + if (xwl_screen->drm_fd < 0) { + return BadAccess; + } + return Success; } diff --git a/hw/xfree86/xwayland/xwayland.h b/hw/xfree86/xwayland/xwayland.h index 8e484a1..c380618 100644 --- a/hw/xfree86/xwayland/xwayland.h +++ b/hw/xfree86/xwayland/xwayland.h @@ -76,6 +76,9 @@ xwl_drm_authenticate(ClientPtr client, struct xwl_screen *xwl_screen, uint32_t magic); extern _X_EXPORT int +xwl_device_get_fd(struct xwl_screen *xwl_screen); + +extern _X_EXPORT int xwl_create_window_buffer_drm(struct xwl_window *xwl_window, PixmapPtr pixmap, uint32_t name); -- 1.8.3.2 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel