diff options
author | Kristian Høgsberg <krh@minato.local> | 2011-10-18 12:15:30 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-03-27 09:32:00 -0400 |
commit | 6152844dee2f2a590ba996db8423d1ba8d90fc2d (patch) | |
tree | 17ebd249b1963a12769b795ce37e2ddcc0e5c37f | |
parent | 0eafdf5a26ffb9c17a4f4a8420c65e0cbeddee9b (diff) |
xwayland: Track protocol changes
-rw-r--r-- | hw/xfree86/xwayland/drm.xml | 41 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-cursor.c | 5 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-drm.c | 35 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-input.c | 2 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-output.c | 3 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-private.h | 4 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland-window.c | 24 | ||||
-rw-r--r-- | hw/xfree86/xwayland/xwayland.c | 93 |
8 files changed, 116 insertions, 91 deletions
diff --git a/hw/xfree86/xwayland/drm.xml b/hw/xfree86/xwayland/drm.xml index 0331f124e..f63bebdca 100644 --- a/hw/xfree86/xwayland/drm.xml +++ b/hw/xfree86/xwayland/drm.xml @@ -1,14 +1,47 @@ <?xml version="1.0" encoding="UTF-8"?> <protocol name="drm"> + + <copyright> + Copyright © 2008-2011 Kristian Høgsberg + Copyright © 2010-2011 Intel Corporation + + Permission to use, copy, modify, distribute, and sell this + software and its documentation for any purpose is hereby granted + without fee, provided that\n the above copyright notice appear in + all copies and that both that copyright notice and this permission + notice appear in supporting documentation, and that the name of + the copyright holders not be used in advertising or publicity + pertaining to distribution of the software without specific, + written prior permission. The copyright holders make no + representations about the suitability of this software for any + purpose. It is provided "as is" without express or implied + warranty. + + THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS + SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY + SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN + AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF + THIS SOFTWARE. + </copyright> + <!-- drm support. This object is created by the server and published using the display's global event. --> <interface name="wl_drm" version="1"> <enum name="error"> <entry name="authenticate_fail" value="0"/> - <entry name="invalid_visual" value="1"/> + <entry name="invalid_format" value="1"/> <entry name="invalid_name" value="2"/> </enum> + <enum name="format"> + <entry name="argb32" value="0"/> + <entry name="premultiplied_argb32" value="1"/> + <entry name="xrgb32" value="2"/> + </enum> + <!-- Call this request with the magic received from drmGetMagic(). It will be passed on to the drmAuthMagic() or DRIAuthConnection() call. This authentication must be @@ -25,7 +58,7 @@ <arg name="width" type="int"/> <arg name="height" type="int"/> <arg name="stride" type="uint"/> - <arg name="visual" type="object" interface="wl_visual"/> + <arg name="format" type="uint"/> </request> <!-- Notification of the path of the drm device which is used by @@ -37,6 +70,10 @@ <arg name="name" type="string"/> </event> + <event name="format"> + <arg name="format" type="uint"/> + </event> + <!-- Raised if the authenticate request succeeded --> <event name="authenticated"/> </interface> diff --git a/hw/xfree86/xwayland/xwayland-cursor.c b/hw/xfree86/xwayland/xwayland-cursor.c index 9732197d0..7f25109eb 100644 --- a/hw/xfree86/xwayland/xwayland-cursor.c +++ b/hw/xfree86/xwayland/xwayland-cursor.c @@ -90,7 +90,6 @@ xwl_realize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) char filename[] = "/tmp/wayland-shm-XXXXXX"; int fd; struct wl_buffer *buffer; - struct wl_visual *visual; void *data; xwl_screen = xwl_screen_get(screen); @@ -122,10 +121,10 @@ xwl_realize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) expand_source_and_mask(cursor, data); munmap(data, size); - visual = xwl_screen->argb_visual; buffer = wl_shm_create_buffer(xwl_screen->shm, fd, cursor->bits->width, cursor->bits->height, - cursor->bits->width * 4, visual); + cursor->bits->width * 4, + WL_SHM_FORMAT_ARGB32); close(fd); dixSetPrivate(&cursor->devPrivates, &xwl_cursor_private_key, buffer); diff --git a/hw/xfree86/xwayland/xwayland-drm.c b/hw/xfree86/xwayland/xwayland-drm.c index c68beb2d9..54ef50388 100644 --- a/hw/xfree86/xwayland/xwayland-drm.c +++ b/hw/xfree86/xwayland/xwayland-drm.c @@ -55,6 +55,11 @@ drm_handle_device (void *data, struct wl_drm *drm, const char *device) } static void +drm_handle_format(void *data, struct wl_drm *wl_drm, uint32_t format) +{ +} + +static void drm_handle_authenticated (void *data, struct wl_drm *drm) { struct xwl_screen *xwl_screen = data; @@ -64,8 +69,9 @@ drm_handle_authenticated (void *data, struct wl_drm *drm) static const struct wl_drm_listener xwl_drm_listener = { - drm_handle_device, - drm_handle_authenticated + drm_handle_device, + drm_handle_format, + drm_handle_authenticated }; static void @@ -78,7 +84,8 @@ drm_handler(struct wl_display *display, struct xwl_screen *xwl_screen = data; if (strcmp (interface, "wl_drm") == 0) { - xwl_screen->drm = wl_drm_create (xwl_screen->display, id, 1); + xwl_screen->drm = wl_display_bind(xwl_screen->display, + id, &wl_drm_interface); wl_drm_add_listener (xwl_screen->drm, &xwl_drm_listener, xwl_screen); } } @@ -92,7 +99,7 @@ xwl_drm_pre_init(struct xwl_screen *xwl_screen) wl_display_add_global_listener(xwl_screen->display, drm_handler, xwl_screen); - xwl_force_roundtrip(xwl_screen); + wl_display_roundtrip(xwl_screen->display); ErrorF("wayland_drm_screen_init, device name %s\n", xwl_screen->device_name); @@ -110,7 +117,7 @@ xwl_drm_pre_init(struct xwl_screen *xwl_screen) wl_drm_authenticate(xwl_screen->drm, magic); - xwl_force_roundtrip(xwl_screen); + wl_display_roundtrip(xwl_screen->display); ErrorF("opened drm fd: %d\n", xwl_screen->drm_fd); @@ -147,13 +154,29 @@ int xwl_create_window_buffer_drm(struct xwl_window *xwl_window, PixmapPtr pixmap, uint32_t name) { + VisualID visual; + uint32_t format; + WindowPtr window = xwl_window->window; + ScreenPtr screen = window->drawable.pScreen; + int i; + + visual = wVisual(window); + for (i = 0; i < screen->numVisuals; i++) + if (screen->visuals[i].vid == visual) + break; + + if (screen->visuals[i].nplanes == 32) + format = WL_DRM_FORMAT_PREMULTIPLIED_ARGB32; + else + format = WL_DRM_FORMAT_XRGB32; + xwl_window->buffer = wl_drm_create_buffer(xwl_window->xwl_screen->drm, name, pixmap->drawable.width, pixmap->drawable.height, pixmap->devKind, - xwl_window->visual); + format); return xwl_window->buffer ? Success : BadDrawable; } diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c index 01dc7a62d..35b8eec77 100644 --- a/hw/xfree86/xwayland/xwayland-input.c +++ b/hw/xfree86/xwayland/xwayland-input.c @@ -420,7 +420,7 @@ create_input_device(struct xwl_screen *xwl_screen, uint32_t id, device_added(xwl_input_device, "xwayland-keyboard"); xwl_input_device->input_device = - wl_input_device_create (xwl_screen->display, id, 1); + wl_display_bind(xwl_screen->display, id, &wl_input_device_interface); xwl_input_device->id = id; wl_input_device_add_listener(xwl_input_device->input_device, diff --git a/hw/xfree86/xwayland/xwayland-output.c b/hw/xfree86/xwayland/xwayland-output.c index 788ddf292..f48000107 100644 --- a/hw/xfree86/xwayland/xwayland-output.c +++ b/hw/xfree86/xwayland/xwayland-output.c @@ -289,7 +289,8 @@ global_handler(struct wl_display *display, if (strcmp (interface, "wl_output") == 0) { xwl_output = xwl_output_create(xwl_screen); - xwl_output->output = wl_output_create (xwl_screen->display, id, 1); + xwl_output->output = wl_display_bind(xwl_screen->display, + id, &wl_output_interface); wl_output_add_listener(xwl_output->output, &output_listener, xwl_output); } diff --git a/hw/xfree86/xwayland/xwayland-private.h b/hw/xfree86/xwayland/xwayland-private.h index f80d66780..e337b7a25 100644 --- a/hw/xfree86/xwayland/xwayland-private.h +++ b/hw/xfree86/xwayland/xwayland-private.h @@ -29,7 +29,6 @@ struct xwl_window { struct xwl_screen *xwl_screen; struct wl_surface *surface; - struct wl_visual *visual; struct wl_buffer *buffer; WindowPtr window; DamagePtr damage; @@ -53,9 +52,6 @@ struct xwl_screen { struct wl_global_listener *input_listener; struct wl_drm *drm; struct wl_shm *shm; - struct wl_visual *argb_visual; - struct wl_visual *rgb_visual; - struct wl_visual *premultiplied_argb_visual; struct xserver *xorg_server; uint32_t mask; uint32_t flags; diff --git a/hw/xfree86/xwayland/xwayland-window.c b/hw/xfree86/xwayland/xwayland-window.c index fd28d18e4..c10b7d801 100644 --- a/hw/xfree86/xwayland/xwayland-window.c +++ b/hw/xfree86/xwayland/xwayland-window.c @@ -45,18 +45,25 @@ static DevPrivateKeyRec xwl_window_private_key; -static void free_pixmap(void *data) +static void +free_pixmap(void *data, struct wl_callback *callback, uint32_t time) { PixmapPtr pixmap = data; ScreenPtr screen = pixmap->drawable.pScreen; (*screen->DestroyPixmap)(pixmap); + wl_callback_destroy(callback); } +static const struct wl_callback_listener free_pixmap_listener = { + free_pixmap, +}; + static void xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap) { struct xwl_screen *xwl_screen = xwl_window->xwl_screen; + struct wl_callback *callback; /* We can safely destroy the buffer because we only use one buffer * per surface in xwayland model */ @@ -75,7 +82,8 @@ xwl_window_attach(struct xwl_window *xwl_window, PixmapPtr pixmap) pixmap->drawable.width, pixmap->drawable.height); - wl_display_sync_callback(xwl_screen->display, free_pixmap, pixmap); + callback = wl_display_sync(xwl_screen->display); + wl_callback_add_listener(callback, &free_pixmap_listener, pixmap); pixmap->refcnt++; } @@ -138,9 +146,7 @@ xwl_realize_window(WindowPtr window) ScreenPtr screen = window->drawable.pScreen; struct xwl_screen *xwl_screen; struct xwl_window *xwl_window; - VisualID visual; Bool ret; - int i; xwl_screen = xwl_screen_get(screen); @@ -171,16 +177,6 @@ xwl_realize_window(WindowPtr window) xserver_set_window_id(xwl_screen->xorg_server, xwl_window->surface, window->drawable.id); - visual = wVisual(window); - for (i = 0; i < screen->numVisuals; i++) - if (screen->visuals[i].vid == visual) - break; - - if (screen->visuals[i].nplanes == 32) - xwl_window->visual = xwl_screen->premultiplied_argb_visual; - else - xwl_window->visual = xwl_screen->rgb_visual; - wl_surface_set_user_data(xwl_window->surface, xwl_window); xwl_window_attach(xwl_window, (*screen->GetWindowPixmap)(window)); diff --git a/hw/xfree86/xwayland/xwayland.c b/hw/xfree86/xwayland/xwayland.c index e9f6964bd..e3c7edaab 100644 --- a/hw/xfree86/xwayland/xwayland.c +++ b/hw/xfree86/xwayland/xwayland.c @@ -71,48 +71,27 @@ static const struct xserver_listener xserver_listener = { }; static void -xwl_input_delayed_init(void *data) +xwl_input_delayed_init(void *data, struct wl_callback *callback, uint32_t time) { struct xwl_screen *xwl_screen = data; uint32_t id; ErrorF("xwl_input_delayed_init\n"); + wl_callback_destroy(callback); xwl_input_init(xwl_screen); id = wl_display_get_global(xwl_screen->display, "xserver", 1); if (id != 0) { - xwl_screen->xorg_server = xserver_create (xwl_screen->display, id, 1); + xwl_screen->xorg_server = wl_display_bind(xwl_screen->display, + id, &xserver_interface); xserver_add_listener(xwl_screen->xorg_server, &xserver_listener, xwl_screen); } } -static void -compositor_handle_visual(void *data, - struct wl_compositor *compositor, - uint32_t id, uint32_t token) -{ - struct xwl_screen *xwl_screen = data; - - switch (token) { - case WL_COMPOSITOR_VISUAL_ARGB32: - xwl_screen->argb_visual = - wl_visual_create(xwl_screen->display, id, 1); - break; - case WL_COMPOSITOR_VISUAL_PREMULTIPLIED_ARGB32: - xwl_screen->premultiplied_argb_visual = - wl_visual_create(xwl_screen->display, id, 1); - break; - case WL_COMPOSITOR_VISUAL_XRGB32: - xwl_screen->rgb_visual = - wl_visual_create(xwl_screen->display, id, 1); - break; - } -} - -static const struct wl_compositor_listener compositor_listener = { - compositor_handle_visual, +static const struct wl_callback_listener delayed_init_listner = { + xwl_input_delayed_init }; static void @@ -126,11 +105,11 @@ global_handler(struct wl_display *display, if (strcmp (interface, "wl_compositor") == 0) { xwl_screen->compositor = - wl_compositor_create (xwl_screen->display, id, 1); - wl_compositor_add_listener(xwl_screen->compositor, - &compositor_listener, xwl_screen); + wl_display_bind(xwl_screen->display, + id, &wl_compositor_interface); } else if (strcmp (interface, "wl_shm") == 0) { - xwl_screen->shm = wl_shm_create (xwl_screen->display, id, 1); + xwl_screen->shm = wl_display_bind(xwl_screen->display, + id, &wl_shm_interface); } } @@ -165,28 +144,11 @@ block_handler(pointer data, struct timeval **tv, pointer read_mask) wl_display_iterate(xwl_screen->display, WL_DISPLAY_WRITABLE); } -static void -sync_callback(void *data) -{ - int *done = 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 xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen) { + struct wl_callback *callback; + xwl_screen->screen = screen; if (!dixRegisterPrivateKey(&xwl_screen_private_key, PRIVATE_SCREEN, 0)) @@ -202,8 +164,8 @@ xwl_screen_init(struct xwl_screen *xwl_screen, ScreenPtr screen) AddGeneralSocket(xwl_screen->wayland_fd); RegisterBlockAndWakeupHandlers(block_handler, wakeup_handler, xwl_screen); - wl_display_sync_callback(xwl_screen->display, - xwl_input_delayed_init, xwl_screen); + callback = wl_display_sync(xwl_screen->display); + wl_callback_add_listener(callback, &delayed_init_listner, xwl_screen); return Success; } @@ -263,22 +225,33 @@ xwl_screen_pre_init(ScrnInfoPtr scrninfo, xwayland_screen_preinit_output(xwl_screen, scrninfo); - 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 NULL; - return xwl_screen; } int xwl_create_window_buffer_shm(struct xwl_window *xwl_window, - PixmapPtr pixmap, int fd) + PixmapPtr pixmap, int fd) { + VisualID visual; + uint32_t format; + WindowPtr window = xwl_window->window; + ScreenPtr screen = window->drawable.pScreen; + int i; + + visual = wVisual(window); + for (i = 0; i < screen->numVisuals; i++) + if (screen->visuals[i].vid == visual) + break; + + if (screen->visuals[i].nplanes == 32) + format = WL_SHM_FORMAT_PREMULTIPLIED_ARGB32; + else + format = WL_SHM_FORMAT_XRGB32; + xwl_window->buffer = wl_shm_create_buffer(xwl_window->xwl_screen->shm, fd, pixmap->drawable.width, pixmap->drawable.height, - pixmap->drawable.width * 4, xwl_window->visual); + pixmap->drawable.width * 4, format); return xwl_window->buffer ? Success : BadDrawable; } @@ -312,7 +285,7 @@ void xwl_screen_close(struct xwl_screen *xwl_screen) xwl_screen->root_x = 0; xwl_screen->root_y = 0; - xwl_force_roundtrip(xwl_screen); + wl_display_roundtrip(xwl_screen->display); } void xwl_screen_destroy(struct xwl_screen *xwl_screen) |