[Spice-devel] [PATCH spice-gtk v2 9/8] main: don't update display timer for unchanged config

Marc-André Lureau marcandre.lureau at gmail.com
Wed Mar 23 17:02:41 UTC 2016


With virgl, set_monitor_ready() may be called each time the scanout is
updated to set the monitor area. This will call
spice_main_update_display(), and keep the timer postponed even if the
monitor configuration didn't change. Treat unchanged configuration has a
no-op and keep configuration timer unchanged. This fixes monitor
autoconfig with virgl (when the display is regularly updated).

Signed-off-by: Marc-André Lureau <marcandre.lureau at gmail.com>
---
 src/channel-main.c | 29 ++++++++++++++++++-----------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/channel-main.c b/src/channel-main.c
index 1c19de1..b4875f6 100644
--- a/src/channel-main.c
+++ b/src/channel-main.c
@@ -121,6 +121,14 @@ typedef enum {
     DISPLAY_ENABLED,
 } SpiceDisplayState;
 
+typedef struct {
+    int                     x;
+    int                     y;
+    int                     width;
+    int                     height;
+    SpiceDisplayState       display_state;
+} SpiceDisplayConfig;
+
 struct _SpiceMainChannelPrivate  {
     enum SpiceMouseMode         mouse_mode;
     bool                        agent_connected;
@@ -140,13 +148,7 @@ struct _SpiceMainChannelPrivate  {
     guint                       agent_msg_pos;
     uint8_t                     agent_msg_size;
     uint32_t                    agent_caps[VD_AGENT_CAPS_SIZE];
-    struct {
-        int                     x;
-        int                     y;
-        int                     width;
-        int                     height;
-        SpiceDisplayState       display_state;
-    } display[MAX_DISPLAY];
+    SpiceDisplayConfig          display[MAX_DISPLAY];
     gint                        timer_id;
     GQueue                      *agent_msg_queue;
     GHashTable                  *file_xfer_tasks;
@@ -2686,10 +2688,15 @@ void spice_main_update_display(SpiceMainChannel *channel, int id,
 
     g_return_if_fail(id < SPICE_N_ELEMENTS(c->display));
 
-    c->display[id].x      = x;
-    c->display[id].y      = y;
-    c->display[id].width  = width;
-    c->display[id].height = height;
+    SpiceDisplayConfig display = {
+        .x = x, .y = y, .width = width, .height = height,
+        .display_state = c->display[id].display_state
+    };
+
+    if (memcmp(&display, &c->display[id], sizeof(SpiceDisplayConfig)) == 0)
+        return;
+
+    c->display[id] = display;
 
     if (update)
         update_display_timer(channel, 1);
-- 
2.5.5



More information about the Spice-devel mailing list