Re: [PATCH] xwayland: Throttle our cursor surface updates with a frame callback

2015-05-27 Thread Keith Packard
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

2015-05-27 Thread Rui Matos
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

2015-05-26 Thread Keith Packard
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

2015-05-26 Thread Daniel Stone
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

2015-05-26 Thread Rui Matos
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