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

Pavel Grunt pgrunt at redhat.com
Wed Mar 23 19:39:13 UTC 2016


Hi,

So the timer is the main problem ?

It also solves/avoids problems with a guest running on wayland when the
"resize-guest" property is TRUE.
See bug https://bugzilla.redhat.com/show_bug.cgi?id=1266484 
It avoids destroying the primary surface when the display configuration
has not changed

I would like to hear from Jonathon what he thinks about it. There were
some concerns / discussion whether it should be compared to the "real"
state of displays in the guest.
https://lists.freedesktop.org/archives/spice-devel/2015-October/022785.
html

Maybe some check should be done on the server side because it is
"closer" to the guest.

Pavel

On Wed, 2016-03-23 at 18:02 +0100, Marc-André Lureau wrote:
> 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);


More information about the Spice-devel mailing list