From fc8ce137471227f5e40dcea5a9752762efbf5265 Mon Sep 17 00:00:00 2001 From: Philipp Zabel Date: Wed, 1 Feb 2023 08:53:42 +0100 Subject: [PATCH] backend-vnc: track damage on output while not repainting While not repainting, all buffers are damaged exactly the same. Avoid unnecessary work by tracking this damage separately on struct vnc_output. Signed-off-by: Philipp Zabel --- libweston/backend-vnc/vnc.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c index 7439148fe..bacac58a9 100644 --- a/libweston/backend-vnc/vnc.c +++ b/libweston/backend-vnc/vnc.c @@ -81,6 +81,8 @@ struct vnc_output { struct nvnc_display *display; struct nvnc_fb_pool *fb_pool; + /* damage accumulated while not repainting */ + pixman_region32_t damage; struct wl_list peers; struct wl_list fb_side_data_list; @@ -497,6 +499,11 @@ vnc_update_buffer(struct nvnc_display *display, struct pixman_region32 *damage) pixman_region16_t local_damage; struct nvnc_fb *fb; + /* Accumulate damage in all buffers */ + wl_list_for_each(fb_side_data, &output->fb_side_data_list, link) + pixman_region32_union(&fb_side_data->damage, + &fb_side_data->damage, damage); + fb = nvnc_fb_pool_acquire(output->fb_pool); assert(fb); @@ -635,6 +642,7 @@ vnc_output_enable(struct weston_output *base) output->display = nvnc_display_new(0, 0); + pixman_region32_init(&output->damage); wl_list_init(&output->fb_side_data_list); nvnc_add_display(backend->server, output->display); @@ -662,6 +670,8 @@ vnc_output_disable(struct weston_output *base) if (!output->base.enabled) return 0; + pixman_region32_fini(&output->damage); + nvnc_display_unref(output->display); nvnc_fb_pool_unref(output->fb_pool); @@ -791,16 +801,15 @@ vnc_output_repaint(struct weston_output *base, pixman_region32_t *damage) assert(output); if (pixman_region32_not_empty(damage)) { - struct fb_side_data *fb_side_data; - - /* Accumulate damage in all buffers */ - wl_list_for_each(fb_side_data, &output->fb_side_data_list, link) - pixman_region32_union(&fb_side_data->damage, - &fb_side_data->damage, damage); + /* Accumulate damage for the next repaint */ + pixman_region32_union(&output->damage, + &output->damage, damage); /* Only repaint when a client is connected */ - if (!wl_list_empty(&output->peers)) - vnc_update_buffer(output->display, damage); + if (!wl_list_empty(&output->peers)) { + vnc_update_buffer(output->display, &output->damage); + pixman_region32_clear(&output->damage); + } pixman_region32_subtract(&ec->primary_plane.damage, &ec->primary_plane.damage, damage); @@ -942,6 +951,7 @@ vnc_handle_output_move(struct wl_listener *listener, void *data) wl_list_for_each(fb_side_data, &output->fb_side_data_list, link) pixman_region32_translate(&fb_side_data->damage, base->move_x, base->move_y); + pixman_region32_translate(&output->damage, base->move_x, base->move_y); } static int