screen-cast-monitor-stream-src: Only send cursor bitmap when it changes

To avoid unnecessary pixel copying, only send the cursor bitmap when it
changes. This also allows the receiver to know when the cursor bitmap
actually changed.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/357
This commit is contained in:
Jonas Ådahl 2019-01-03 16:51:08 +01:00 committed by Ray Strode
parent ffa30f50f2
commit a7f2145965

View File

@ -40,6 +40,8 @@ struct _MetaScreenCastMonitorStreamSrc
{ {
MetaScreenCastStreamSrc parent; MetaScreenCastStreamSrc parent;
gboolean cursor_bitmap_invalid;
gulong actors_painted_handler_id; gulong actors_painted_handler_id;
gulong paint_handler_id; gulong paint_handler_id;
gulong cursor_moved_handler_id; gulong cursor_moved_handler_id;
@ -194,6 +196,7 @@ static void
cursor_changed (MetaCursorTracker *cursor_tracker, cursor_changed (MetaCursorTracker *cursor_tracker,
MetaScreenCastMonitorStreamSrc *monitor_src) MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
monitor_src->cursor_bitmap_invalid = TRUE;
sync_cursor_state (monitor_src); sync_cursor_state (monitor_src);
} }
@ -452,6 +455,16 @@ meta_screen_cast_monitor_stream_src_set_cursor_metadata (MetaScreenCastStreamSrc
spa_meta_cursor->id = 1; spa_meta_cursor->id = 1;
spa_meta_cursor->position.x = (int32_t) roundf (cursor_position.x); spa_meta_cursor->position.x = (int32_t) roundf (cursor_position.x);
spa_meta_cursor->position.y = (int32_t) roundf (cursor_position.y); spa_meta_cursor->position.y = (int32_t) roundf (cursor_position.y);
if (!monitor_src->cursor_bitmap_invalid)
{
spa_meta_cursor->hotspot.x = 0;
spa_meta_cursor->hotspot.y = 0;
spa_meta_cursor->bitmap_offset = 0;
return;
}
monitor_src->cursor_bitmap_invalid = FALSE;
spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor); spa_meta_cursor->bitmap_offset = sizeof (struct spa_meta_cursor);
spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor, spa_meta_bitmap = SPA_MEMBER (spa_meta_cursor,
@ -551,6 +564,7 @@ meta_screen_cast_monitor_stream_src_new (MetaScreenCastMonitorStream *monitor_s
static void static void
meta_screen_cast_monitor_stream_src_init (MetaScreenCastMonitorStreamSrc *monitor_src) meta_screen_cast_monitor_stream_src_init (MetaScreenCastMonitorStreamSrc *monitor_src)
{ {
monitor_src->cursor_bitmap_invalid = TRUE;
} }
static void static void