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 <[email protected]> > --- > ui/vnc.c | 25 ++++++++++++++++++++++--- > 1 file changed, 22 insertions(+), 3 deletions(-)
Reviewed-by: Daniel P. Berrangé <[email protected]> > > 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 :|
