summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@minato.local>2011-10-18 12:15:30 -0400
committerKristian Høgsberg <krh@bitplanet.net>2012-03-27 09:32:00 -0400
commit6152844dee2f2a590ba996db8423d1ba8d90fc2d (patch)
tree17ebd249b1963a12769b795ce37e2ddcc0e5c37f
parent0eafdf5a26ffb9c17a4f4a8420c65e0cbeddee9b (diff)
xwayland: Track protocol changes
-rw-r--r--hw/xfree86/xwayland/drm.xml41
-rw-r--r--hw/xfree86/xwayland/xwayland-cursor.c5
-rw-r--r--hw/xfree86/xwayland/xwayland-drm.c35
-rw-r--r--hw/xfree86/xwayland/xwayland-input.c2
-rw-r--r--hw/xfree86/xwayland/xwayland-output.c3
-rw-r--r--hw/xfree86/xwayland/xwayland-private.h4
-rw-r--r--hw/xfree86/xwayland/xwayland-window.c24
-rw-r--r--hw/xfree86/xwayland/xwayland.c93
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)