[Piglit] [PATCH] util: implement eventloop for wayland platform

Tapani Pälli tapani.palli at intel.com
Mon Oct 24 11:31:25 UTC 2016


Signed-off-by: Tapani Pälli <tapani.palli at intel.com>
---
 .../util/piglit-framework-gl/piglit_wl_framework.c | 137 +++++++++++++++++++--
 1 file changed, 129 insertions(+), 8 deletions(-)

diff --git a/tests/util/piglit-framework-gl/piglit_wl_framework.c b/tests/util/piglit-framework-gl/piglit_wl_framework.c
index 78ffea6..6b832f6 100644
--- a/tests/util/piglit-framework-gl/piglit_wl_framework.c
+++ b/tests/util/piglit-framework-gl/piglit_wl_framework.c
@@ -24,14 +24,136 @@
 #include <assert.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <poll.h>
 
 #include "piglit-util-gl.h"
 #include "piglit_wl_framework.h"
 
+#include <wayland-client.h>
+#include <waffle_wayland.h>
+#include <linux/input-event-codes.h>
+
+static struct wl_seat *seat = NULL;
+static struct wl_keyboard *keyboard = NULL;
+
+static void keymap(void *data,
+	struct wl_keyboard *wl_keyboard,
+	uint32_t format,
+	int32_t fd,
+	uint32_t size)
+{
+}
+
+static void enter(void *data,
+	struct wl_keyboard *wl_keyboard,
+	uint32_t serial,
+	struct wl_surface *surface,
+	struct wl_array *keys)
+{
+}
+
+static void leave(void *data,
+	struct wl_keyboard *wl_keyboard,
+	uint32_t serial,
+	struct wl_surface *surface)
+{
+}
+
+static void key(void *data,
+	struct wl_keyboard *wl_keyboard,
+	uint32_t serial,
+	uint32_t time,
+	uint32_t key,
+	uint32_t state)
+{
+	struct piglit_winsys_framework *winsys_fw =
+		(struct piglit_winsys_framework *) data;
+
+	winsys_fw->need_redisplay = true;
+
+	switch (key) {
+	case KEY_ESC:
+                if (winsys_fw->user_keyboard_func)
+			winsys_fw->user_keyboard_func(27, 0, 0);
+		break;
+	}
+}
+
+static void modifiers(void *data,
+	struct wl_keyboard *wl_keyboard,
+	uint32_t serial,
+	uint32_t mods_depressed,
+	uint32_t mods_latched,
+	uint32_t mods_locked,
+	uint32_t group)
+{
+}
+
+static const struct wl_keyboard_listener keyboard_listener = {
+	keymap,
+	enter,
+	leave,
+	key,
+	modifiers
+};
+
+static void
+process_events(struct wl_display *dpy)
+{
+	struct pollfd fds = {
+		.fd = wl_display_get_fd(dpy),
+		.events = POLLIN,
+		.revents = 0
+	};
+
+	wl_display_sync(dpy);
+
+	while (1) {
+		poll(&fds, 1, -1);
+		if (wl_display_dispatch(dpy) < 0)
+			break;
+	}
+}
+
+static void global(void *data,
+	struct wl_registry *wl_registry,
+	uint32_t name,
+	const char *interface,
+	uint32_t version)
+{
+	if (strcmp(interface, "wl_seat") != 0)
+		return;
+
+	seat = wl_registry_bind(wl_registry, name, &wl_seat_interface, 1);
+	keyboard = wl_seat_get_keyboard(seat);
+
+	if (keyboard)
+		wl_keyboard_add_listener(keyboard, &keyboard_listener, data);
+}
+
+static void global_remove(void *data,
+	struct wl_registry *wl_registry,
+	uint32_t name)
+{
+}
+
+static const struct wl_registry_listener registry_listener = {
+	global,
+	global_remove
+};
+
 static void
 enter_event_loop(struct piglit_winsys_framework *winsys_fw)
 {
-	const struct piglit_gl_test_config *test_config = winsys_fw->wfl_fw.gl_fw.test_config;
+	const struct piglit_gl_test_config *test_config =
+		winsys_fw->wfl_fw.gl_fw.test_config;
+	union waffle_native_window *n_window =
+		waffle_window_get_native(winsys_fw->wfl_fw.window);
+	struct wl_display *dpy = n_window->wayland->display.wl_display;
+	struct wl_registry *registry = wl_display_get_registry(dpy);
+	enum piglit_result result = PIGLIT_PASS;
+
+	wl_registry_add_listener(registry, &registry_listener, winsys_fw);
 
 	/* The Wayland window fails to appear on the first call to
 	 * swapBuffers (which occured in display_cb above). This is
@@ -40,14 +162,13 @@ enter_event_loop(struct piglit_winsys_framework *winsys_fw)
 	 * redraw as a workaround.
 	 */
 	if (test_config->display)
-		test_config->display();
+		result = test_config->display();
 
-	/* FINISHME: Write event loop for Wayland.
-	 *
-	 * Until we have proper Wayland support, give the user enough time
-	 * to view the window by sleeping.
-	 */
-	sleep(8);
+	/* Do not proceed to event loop in case of piglit_automatic. */
+	if (piglit_automatic)
+		piglit_report_result(result);
+
+	process_events(dpy);
 }
 
 static void
-- 
2.7.4



More information about the Piglit mailing list