[Libva] [PATCH 08/16] tests: add support for Wayland.
Zhao Halley
halley.zhao at intel.com
Tue Jun 5 02:06:56 PDT 2012
From: Gwenole Beauchesne <gwenole.beauchesne at intel.com>
---
test/common/Makefile.am | 6 +
test/common/va_display.c | 6 +
test/common/va_display_wayland.c | 203 ++++++++++++++++++++++++++++++++++++++
3 files changed, 215 insertions(+), 0 deletions(-)
create mode 100644 test/common/va_display_wayland.c
diff --git a/test/common/Makefile.am b/test/common/Makefile.am
index c348fd7..83bdf79 100644
--- a/test/common/Makefile.am
+++ b/test/common/Makefile.am
@@ -39,6 +39,12 @@ source_c += va_display_x11.c
libva_display_cflags += $(X11_CFLAGS)
libva_display_libs += $(X11_LIBS)
+if USE_WAYLAND
+source_c += va_display_wayland.c
+libva_display_cflags += $(WAYLAND_CFLAGS)
+libva_display_libs += $(top_builddir)/va/libva-wayland.la $(WAYLAND_LIBS)
+endif
+
libva_display_la_SOURCES= $(source_c)
noinst_HEADERS = $(source_h)
libva_display_la_CFLAGS = $(libva_display_cflags)
diff --git a/test/common/va_display.c b/test/common/va_display.c
index dd560c8..2e6984e 100644
--- a/test/common/va_display.c
+++ b/test/common/va_display.c
@@ -30,6 +30,9 @@
#ifdef ANDROID
extern const VADisplayHooks va_display_hooks_android;
#else
+#if USE_WAYLAND
+extern const VADisplayHooks va_display_hooks_wayland;
+#endif
extern const VADisplayHooks va_display_hooks_x11;
#endif
@@ -38,6 +41,9 @@ static const VADisplayHooks *g_display_hooks_available[] = {
#ifdef ANDROID
&va_display_hooks_android,
#else
+#if USE_WAYLAND
+ &va_display_hooks_wayland,
+#endif
&va_display_hooks_x11,
#endif
NULL
diff --git a/test/common/va_display_wayland.c b/test/common/va_display_wayland.c
new file mode 100644
index 0000000..32bebd7
--- /dev/null
+++ b/test/common/va_display_wayland.c
@@ -0,0 +1,203 @@
+/*
+ * Copyright (c) 2012 Intel Corporation. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <va/va_wayland.h>
+#include "va_display.h"
+
+struct display {
+ struct wl_display *display;
+ struct wl_compositor *compositor;
+ struct wl_shell *shell;
+ struct wl_shell_surface *shell_surface;
+ struct wl_surface *surface;
+ unsigned int ref_count;
+ int event_fd;
+ unsigned int event_mask;
+ VASurfaceWL va_surface_wl;
+};
+
+static struct display *g_display;
+
+static void
+display_handle_global(
+ struct wl_display *display,
+ uint32_t id,
+ const char *interface,
+ uint32_t version,
+ void *data
+)
+{
+ struct display * const d = data;
+
+ if (strcmp(interface, "wl_compositor") == 0)
+ d->compositor = wl_display_bind(display, id, &wl_compositor_interface);
+ else if (strcmp(interface, "wl_shell") == 0)
+ d->shell = wl_display_bind(display, id, &wl_shell_interface);
+}
+
+static int
+event_mask_update(uint32_t mask, void *data)
+{
+ struct display * const d = data;
+
+ d->event_mask = mask;
+ return 0;
+}
+
+static VADisplay
+va_open_display_wayland(void)
+{
+ struct display *d;
+
+ if (g_display) {
+ d = g_display;
+ d->ref_count++;
+ }
+ else {
+ d = calloc(1, sizeof(*d));
+ if (!d)
+ return NULL;
+ d->event_fd = -1;
+
+ d->display = wl_display_connect(NULL);
+ if (!d->display) {
+ free(d);
+ return NULL;
+ }
+ wl_display_set_user_data(d->display, d);
+ wl_display_add_global_listener(d->display, display_handle_global, d);
+ d->event_fd = wl_display_get_fd(d->display, event_mask_update, d);
+ wl_display_iterate(d->display, d->event_mask);
+
+ d->ref_count = 1;
+ g_display = d;
+ }
+ return vaGetDisplayWL(d->display);
+}
+
+static void
+va_close_display_wayland(VADisplay va_dpy)
+{
+ struct display * const d = g_display;
+
+ if (!d || --d->ref_count > 0)
+ return;
+
+ if (d->va_surface_wl) {
+ vaDestroySurfaceWL(va_dpy, d->va_surface_wl);
+ d->va_surface_wl = NULL;
+ }
+
+ if (d->surface) {
+ wl_surface_destroy(d->surface);
+ d->surface = NULL;
+ }
+
+ if (d->shell_surface) {
+ wl_shell_surface_destroy(d->shell_surface);
+ d->shell_surface = NULL;
+ }
+
+ if (d->shell) {
+ wl_shell_destroy(d->shell);
+ d->shell = NULL;
+ }
+
+ if (d->compositor) {
+ wl_compositor_destroy(d->compositor);
+ d->compositor = NULL;
+ }
+
+ if (d->display) {
+#if 0
+ /* XXX: wayland server protocol only? */
+ wl_display_destroy(d->display);
+#endif
+ d->display = NULL;
+ }
+ free(g_display);
+ g_display = NULL;
+}
+
+static int
+ensure_window(VADisplay va_dpy, unsigned int width, unsigned int height)
+{
+ struct display * const d = g_display;
+ VAStatus va_status;
+
+ if (!d->surface) {
+ d->surface = wl_compositor_create_surface(d->compositor);
+ if (!d->surface)
+ return 0;
+ }
+
+ if (!d->shell_surface) {
+ d->shell_surface = wl_shell_get_shell_surface(d->shell, d->surface);
+ if (!d->shell_surface)
+ return 0;
+ wl_shell_surface_set_toplevel(d->shell_surface);
+ }
+
+ if (!d->va_surface_wl) {
+ va_status = vaCreateSurfaceWL(va_dpy, d->surface, &d->va_surface_wl);
+ if (va_status != VA_STATUS_SUCCESS)
+ return 0;
+ }
+ return 1;
+}
+
+static VAStatus
+va_put_surface_wayland(
+ VADisplay va_dpy,
+ VASurfaceID surface,
+ const VARectangle *src_rect,
+ const VARectangle *dst_rect
+)
+{
+ struct display * const d = g_display;
+ VAStatus va_status;
+
+ if (!ensure_window(va_dpy, dst_rect->width, dst_rect->height))
+ return VA_STATUS_ERROR_ALLOCATION_FAILED;
+
+ va_status = vaAttachSurfaceWL(
+ va_dpy,
+ d->va_surface_wl,
+ surface,
+ VA_FRAME_PICTURE
+ );
+ if (va_status != VA_STATUS_SUCCESS)
+ return va_status;
+
+ wl_display_flush(d->display);
+ return VA_STATUS_SUCCESS;
+}
+
+const VADisplayHooks va_display_hooks_wayland = {
+ va_open_display_wayland,
+ va_close_display_wayland,
+ va_put_surface_wayland,
+};
--
1.7.5.4
More information about the Libva
mailing list