[RFC weston] clients: Don't attach a buffer if mouse cursor surface is unchanged

Derek Foreman derekf at osg.samsung.com
Thu Feb 22 22:15:46 UTC 2018


Keep track of what cusor image buffer is attached to the cursor
surface and avoid re-attaching it if we don't have to.

This isn't just an obviously pointless optimization, it turns all
of toy toolkit into a test case for handling this properly.

Signed-off-by: Derek Foreman <derekf at osg.samsung.com>
---

Continuing my streak of posting unpopular patches, this patch breaks
weston, so I'm not pushing for inclusion, but I think we need to
resolve why it breaks, and fix either weston or wayland documentation
to reflect expected behaviour.

I think this can be attributed to a weston bug, and we should be able to
expect that the compositor will be able to redisplay the surface without
needing to attach a new buffer, and that if the compositor has released
the buffer then it has a kept copy somewhere...

Any other opinions?

 clients/window.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index 15a86e15..81417bd2 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -353,6 +353,7 @@ struct input {
 	bool cursor_timer_running;
 	struct task cursor_task;
 	struct wl_surface *pointer_surface;
+	struct wl_buffer *current_cursor_buffer;
 	uint32_t modifiers;
 	uint32_t pointer_enter_serial;
 	uint32_t cursor_serial;
@@ -3769,10 +3770,14 @@ input_set_pointer_image_index(struct input *input, int index)
 	if (!buffer)
 		return;
 
-	wl_surface_attach(input->pointer_surface, buffer, 0, 0);
-	wl_surface_damage(input->pointer_surface, 0, 0,
-			  image->width, image->height);
-	wl_surface_commit(input->pointer_surface);
+	if (buffer != input->current_cursor_buffer) {
+		wl_surface_attach(input->pointer_surface, buffer, 0, 0);
+		wl_surface_damage(input->pointer_surface, 0, 0,
+				  image->width, image->height);
+		wl_surface_commit(input->pointer_surface);
+	}
+
+	input->current_cursor_buffer = buffer;
 	wl_pointer_set_cursor(input->pointer, input->pointer_enter_serial,
 			      input->pointer_surface,
 			      image->hotspot_x, image->hotspot_y);
-- 
2.14.3



More information about the wayland-devel mailing list