[PATCH xserver] xwayland: Queue Present events
Roman Gilg
subdiff at gmail.com
Mon Jan 29 17:15:51 UTC 2018
Add functionality for queuing events as requested by Present.
Signed-off-by: Roman Gilg <subdiff at gmail.com>
---
hw/xwayland/xwayland-present.c | 73 +++++++++++++++++++++++++++++-------------
1 file changed, 51 insertions(+), 22 deletions(-)
diff --git a/hw/xwayland/xwayland-present.c b/hw/xwayland/xwayland-present.c
index d08c39e..f8ac5a6 100644
--- a/hw/xwayland/xwayland-present.c
+++ b/hw/xwayland/xwayland-present.c
@@ -27,7 +27,7 @@
#include <present.h>
-#define FRAME_TIMER_IVAL 67 // ~15fps
+#define FRAME_TIMER_IVAL 33 // ~30fps
static struct xorg_list xwl_present_windows;
@@ -227,6 +227,21 @@ xwl_present_get_ust_msc(WindowPtr present_window, uint64_t *ust, uint64_t *msc)
return Success;
}
+static void
+xwl_present_reset_present_window(struct xwl_window *xwl_window, WindowPtr present_window)
+{
+ /* Do not reset if it is the same present_window. But this also means, that
+ * we always switch to another child window, if it wants to present.
+ */
+ if (xwl_window->present_window == present_window)
+ return;
+
+ if (xwl_window->present_window)
+ xwl_present_cleanup(xwl_window->present_window);
+ xwl_window->present_window = present_window;
+ xorg_list_add(&xwl_window->present_link, &xwl_present_windows);
+}
+
/*
* Queue an event to report back to the Present extension when the specified
* MSC has past
@@ -237,12 +252,38 @@ xwl_present_queue_vblank(WindowPtr present_window,
uint64_t event_id,
uint64_t msc)
{
- /*
- * Queuing events is not yet implemented.
- *
- */
- return BadRequest;
- /* */
+ struct xwl_window *xwl_window = xwl_window_of_top(present_window);
+ struct xwl_present_event *event;
+
+ if (!xwl_window)
+ return BadAlloc;
+
+ if (xwl_window->present_crtc_fake != crtc)
+ return BadRequest;
+
+ event = malloc(sizeof *event);
+ if (!event)
+ return BadAlloc;
+
+ xwl_present_reset_present_window(xwl_window, present_window);
+
+ event->event_id = event_id;
+ event->xwl_window = xwl_window;
+ event->buffer = NULL;
+ event->target_msc = msc;
+ event->pending = FALSE;
+ event->abort = FALSE;
+
+ xorg_list_add(&event->list, &xwl_window->present_event_list);
+
+ if (!xwl_window->present_frame_callback && !xwl_window->present_frame_timer_firing)
+ xwl_window->present_frame_timer = TimerSet(xwl_window->present_frame_timer,
+ 0,
+ FRAME_TIMER_IVAL,
+ &present_frame_timer_callback,
+ xwl_window);
+
+ return Success;
}
/*
@@ -255,6 +296,9 @@ xwl_present_abort_vblank(WindowPtr present_window, RRCrtcPtr crtc, uint64_t even
struct xwl_window *xwl_window = xwl_window_of_top(present_window);
struct xwl_present_event *event, *tmp;
+ if (!xwl_window || !crtc || xwl_window->present_crtc_fake != crtc)
+ return;
+
xorg_list_for_each_entry_safe(event, tmp, &xwl_window->present_event_list, list) {
if (event->event_id == event_id) {
xorg_list_del(&event->list);
@@ -309,21 +353,6 @@ xwl_present_check_flip(RRCrtcPtr crtc,
return TRUE;
}
-static void
-xwl_present_reset_present_window(struct xwl_window *xwl_window, WindowPtr present_window)
-{
- /* Do not reset if it is the same present_window. But this also means, that
- * we always switch to another child window, if it wants to present.
- */
- if (xwl_window->present_window == present_window)
- return;
-
- if (xwl_window->present_window)
- xwl_present_cleanup(xwl_window->present_window);
- xwl_window->present_window = present_window;
- xorg_list_add(&xwl_window->present_link, &xwl_present_windows);
-}
-
static Bool
xwl_present_flip(WindowPtr present_window,
RRCrtcPtr crtc,
--
2.7.4
More information about the xorg-devel
mailing list