[PATCH v3 8/9] main: don't update display timer for unchanged config

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 as a
no-op and keep configuration timer unchanged. This fixes monitor
autoconfig with virgl (when the display is regularly updated).

It also solves/avoids problems with a guest running on wayland when the
"resize-guest" property is TRUE.

Fixes:
https://bugzilla.redhat.com/show_bug.cgi?id=1266484

Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxx>
---
 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

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]