Re: [PATCH] xwayland: Throttle our cursor surface updates with a frame callback
Rui Matos writes: > In some extreme cases with animated cursors at a high frame rate we > could end up filling the wl_display outgoing buffer and end up with > wl_display_flush() failing. > > In any case, using the frame callback to throttle ourselves is the > right thing to do. > > Signed-off-by: Rui Matos > --- > > > On Tue, May 26, 2015 at 10:58 PM, Keith Packard wrote: >> Looks like there have been some other updates in this area? Can I get >> one of you to build a patch on master? > > Sorry, my master branch was a couple of weeks old. Rebased. Merged. 806470b..cbb7eb7 master -> master -- -keith signature.asc Description: PGP signature ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH] xwayland: Throttle our cursor surface updates with a frame callback
In some extreme cases with animated cursors at a high frame rate we could end up filling the wl_display outgoing buffer and end up with wl_display_flush() failing. In any case, using the frame callback to throttle ourselves is the right thing to do. Signed-off-by: Rui Matos --- On Tue, May 26, 2015 at 10:58 PM, Keith Packard wrote: > Looks like there have been some other updates in this area? Can I get > one of you to build a patch on master? Sorry, my master branch was a couple of weeks old. Rebased. hw/xwayland/xwayland-cursor.c | 26 ++ hw/xwayland/xwayland-input.c | 2 ++ hw/xwayland/xwayland.h| 4 +++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c index 5a9d1fe..c137e1e 100644 --- a/hw/xwayland/xwayland-cursor.c +++ b/hw/xwayland/xwayland-cursor.c @@ -82,6 +82,23 @@ xwl_unrealize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) return xwl_shm_destroy_pixmap(pixmap); } +static void +frame_callback(void *data, + struct wl_callback *callback, + uint32_t time) +{ +struct xwl_seat *xwl_seat = data; +xwl_seat->cursor_frame_cb = NULL; +if (xwl_seat->cursor_needs_update) { +xwl_seat->cursor_needs_update = FALSE; +xwl_seat_set_cursor(xwl_seat); +} +} + +static const struct wl_callback_listener frame_listener = { +frame_callback +}; + void xwl_seat_set_cursor(struct xwl_seat *xwl_seat) { @@ -98,6 +115,11 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) return; } +if (xwl_seat->cursor_frame_cb) { +xwl_seat->cursor_needs_update = TRUE; +return; +} + cursor = xwl_seat->x_cursor; pixmap = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); stride = cursor->bits->width * 4; @@ -117,6 +139,10 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) wl_surface_damage(xwl_seat->cursor, 0, 0, xwl_seat->x_cursor->bits->width, xwl_seat->x_cursor->bits->height); + +xwl_seat->cursor_frame_cb = wl_surface_frame(xwl_seat->cursor); +wl_callback_add_listener(xwl_seat->cursor_frame_cb, &frame_listener, xwl_seat); + wl_surface_commit(xwl_seat->cursor); } diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 51a3379..af11c5b 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -559,6 +559,8 @@ xwl_seat_destroy(struct xwl_seat *xwl_seat) RemoveDevice(xwl_seat->keyboard, FALSE); wl_seat_destroy(xwl_seat->seat); wl_surface_destroy(xwl_seat->cursor); +if (xwl_seat->cursor_frame_cb) +wl_callback_destroy(xwl_seat->cursor_frame_cb); wl_array_release(&xwl_seat->keys); free(xwl_seat); } diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h index cfb343d..28b0c99 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -115,12 +115,14 @@ struct xwl_seat { struct wl_pointer *wl_pointer; struct wl_keyboard *wl_keyboard; struct wl_array keys; -struct wl_surface *cursor; struct xwl_window *focus_window; uint32_t id; uint32_t pointer_enter_serial; struct xorg_list link; CursorPtr x_cursor; +struct wl_surface *cursor; +struct wl_callback *cursor_frame_cb; +Bool cursor_needs_update; size_t keymap_size; char *keymap; -- 2.4.0 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH] xwayland: Throttle our cursor surface updates with a frame callback
Daniel Stone writes: >> Signed-off-by: Rui Matos > > Thanks! > > Reviewed-by: Daniel Stone > > Keith, please pull. Looks like there have been some other updates in this area? Can I get one of you to build a patch on master? -- -keith signature.asc Description: PGP signature ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
Re: [PATCH] xwayland: Throttle our cursor surface updates with a frame callback
Hi, On 26 May 2015 at 16:37, Rui Matos wrote: > In some extreme cases with animated cursors at a high frame rate we > could end up filling the wl_display outgoing buffer and end up with > wl_display_flush() failing. > > In any case, using the frame callback to throttle ourselves is the > right thing to do. > > Signed-off-by: Rui Matos Thanks! Reviewed-by: Daniel Stone Keith, please pull. Cheers, Daniel ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel
[PATCH] xwayland: Throttle our cursor surface updates with a frame callback
In some extreme cases with animated cursors at a high frame rate we could end up filling the wl_display outgoing buffer and end up with wl_display_flush() failing. In any case, using the frame callback to throttle ourselves is the right thing to do. Signed-off-by: Rui Matos --- v2: ensure that we don't lose cursor updates requested while a frame callback is pending hw/xwayland/xwayland-cursor.c | 26 ++ hw/xwayland/xwayland-input.c | 2 ++ hw/xwayland/xwayland.h| 4 +++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/hw/xwayland/xwayland-cursor.c b/hw/xwayland/xwayland-cursor.c index 5a9d1fe..c137e1e 100644 --- a/hw/xwayland/xwayland-cursor.c +++ b/hw/xwayland/xwayland-cursor.c @@ -82,6 +82,23 @@ xwl_unrealize_cursor(DeviceIntPtr device, ScreenPtr screen, CursorPtr cursor) return xwl_shm_destroy_pixmap(pixmap); } +static void +frame_callback(void *data, + struct wl_callback *callback, + uint32_t time) +{ +struct xwl_seat *xwl_seat = data; +xwl_seat->cursor_frame_cb = NULL; +if (xwl_seat->cursor_needs_update) { +xwl_seat->cursor_needs_update = FALSE; +xwl_seat_set_cursor(xwl_seat); +} +} + +static const struct wl_callback_listener frame_listener = { +frame_callback +}; + void xwl_seat_set_cursor(struct xwl_seat *xwl_seat) { @@ -98,6 +115,11 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) return; } +if (xwl_seat->cursor_frame_cb) { +xwl_seat->cursor_needs_update = TRUE; +return; +} + cursor = xwl_seat->x_cursor; pixmap = dixGetPrivate(&cursor->devPrivates, &xwl_cursor_private_key); stride = cursor->bits->width * 4; @@ -117,6 +139,10 @@ xwl_seat_set_cursor(struct xwl_seat *xwl_seat) wl_surface_damage(xwl_seat->cursor, 0, 0, xwl_seat->x_cursor->bits->width, xwl_seat->x_cursor->bits->height); + +xwl_seat->cursor_frame_cb = wl_surface_frame(xwl_seat->cursor); +wl_callback_add_listener(xwl_seat->cursor_frame_cb, &frame_listener, xwl_seat); + wl_surface_commit(xwl_seat->cursor); } diff --git a/hw/xwayland/xwayland-input.c b/hw/xwayland/xwayland-input.c index 5230d8c..a3142f4 100644 --- a/hw/xwayland/xwayland-input.c +++ b/hw/xwayland/xwayland-input.c @@ -586,6 +586,8 @@ xwl_seat_destroy(struct xwl_seat *xwl_seat) RemoveDevice(xwl_seat->keyboard, FALSE); wl_seat_destroy(xwl_seat->seat); wl_surface_destroy(xwl_seat->cursor); +if (xwl_seat->cursor_frame_cb) +wl_callback_destroy(xwl_seat->cursor_frame_cb); wl_array_release(&xwl_seat->keys); free(xwl_seat); } diff --git a/hw/xwayland/xwayland.h b/hw/xwayland/xwayland.h index bfffa71..a31c040 100644 --- a/hw/xwayland/xwayland.h +++ b/hw/xwayland/xwayland.h @@ -115,12 +115,14 @@ struct xwl_seat { struct wl_pointer *wl_pointer; struct wl_keyboard *wl_keyboard; struct wl_array keys; -struct wl_surface *cursor; struct xwl_window *focus_window; uint32_t id; uint32_t pointer_enter_serial; struct xorg_list link; CursorPtr x_cursor; +struct wl_surface *cursor; +struct wl_callback *cursor_frame_cb; +Bool cursor_needs_update; wl_fixed_t horizontal_scroll; wl_fixed_t vertical_scroll; -- 2.4.0 ___ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel