[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 :|