qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] vnc: detect and optimize pageflips


From: Daniel P . Berrangé
Subject: Re: [Qemu-devel] [PATCH] vnc: detect and optimize pageflips
Date: Wed, 16 Jan 2019 10:22:44 +0000
User-agent: Mutt/1.10.1 (2018-07-13)

On Wed, Jan 16, 2019 at 11:10:49AM +0100, Gerd Hoffmann wrote:
> When size and format of the display surface stays the same we can just
> tag the guest display as dirty and be done with it.
> 
> There is no need need to resize the vnc server display or to touch the
> vnc client dirty bits.  On the next refresh cycle
> vnc_refresh_server_surface() will check for actual display content
> changes and update the client dirty bits as needed.
> 
> The desktop resize and framebuffer format notifications to the vnc
> client will be skipped too.
> 
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
>  ui/vnc.c | 25 ++++++++++++++++++++++---
>  1 file changed, 22 insertions(+), 3 deletions(-)

Reviewed-by: Daniel P. Berrangé <address@hidden>


> 
> diff --git a/ui/vnc.c b/ui/vnc.c
> index 9e4b2beb71..6002d09407 100644
> --- a/ui/vnc.c
> +++ b/ui/vnc.c
> @@ -742,6 +742,17 @@ static void vnc_update_server_surface(VncDisplay *vd)
>                         width, height);
>  }
>  
> +static bool vnc_check_pageflip(DisplaySurface *s1,
> +                               DisplaySurface *s2)
> +{
> +    return (s1 != NULL &&
> +            s2 != NULL &&
> +            surface_width(s1) == surface_width(s2) &&
> +            surface_height(s1) == surface_height(s2) &&
> +            surface_format(s1) == surface_format(s2));
> +
> +}
> +
>  static void vnc_dpy_switch(DisplayChangeListener *dcl,
>                             DisplaySurface *surface)
>  {
> @@ -749,6 +760,7 @@ static void vnc_dpy_switch(DisplayChangeListener *dcl,
>          "Display output is not active.";
>      static DisplaySurface *placeholder;
>      VncDisplay *vd = container_of(dcl, VncDisplay, dcl);
> +    bool pageflip = vnc_check_pageflip(vd->ds, surface);
>      VncState *vs;
>  
>      if (surface == NULL) {
> @@ -761,14 +773,21 @@ static void vnc_dpy_switch(DisplayChangeListener *dcl,
>      vnc_abort_display_jobs(vd);
>      vd->ds = surface;
>  
> -    /* server surface */
> -    vnc_update_server_surface(vd);
> -
>      /* guest surface */
>      qemu_pixman_image_unref(vd->guest.fb);
>      vd->guest.fb = pixman_image_ref(surface->image);
>      vd->guest.format = surface->format;
>  
> +    if (pageflip) {
> +        vnc_set_area_dirty(vd->guest.dirty, vd, 0, 0,
> +                           surface_width(surface),
> +                           surface_height(surface));
> +        return;
> +    }
> +
> +    /* server surface */
> +    vnc_update_server_surface(vd);
> +
>      QTAILQ_FOREACH(vs, &vd->clients, next) {
>          vnc_colordepth(vs);
>          vnc_desktop_resize(vs);
> -- 
> 2.9.3
> 
> 

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]