From 0a2083fa89b24d11f14c5ecb0eef6ab232ae09c7 Mon Sep 17 00:00:00 2001 From: Jeffy Chen Date: Thu, 2 Jun 2022 18:22:38 +0800 Subject: [PATCH 67/74] compositor: Fix damage tracking error when overlapped outputs Signed-off-by: Jeffy Chen --- include/libweston/libweston.h | 2 ++ libweston/compositor.c | 32 ++++++++++++++++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index 74dec9d..26804e2 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -326,6 +326,8 @@ struct weston_output { /** For cancelling the idle_repaint callback on output destruction. */ struct wl_event_source *idle_repaint_source; + pixman_region32_t damage; + struct weston_output_zoom zoom; int dirty; struct wl_signal frame_signal; diff --git a/libweston/compositor.c b/libweston/compositor.c index 7db212f..fc8cef3 100644 --- a/libweston/compositor.c +++ b/libweston/compositor.c @@ -1113,6 +1113,22 @@ weston_view_move_to_plane(struct weston_view *view, weston_surface_damage(view->surface); } +static void +weston_add_damage(struct weston_compositor *compositor, + struct weston_plane *plane, pixman_region32_t *damage) +{ + struct weston_output *output; + + if (plane) + pixman_region32_union(&plane->damage, &plane->damage, damage); + + if (plane != &compositor->primary_plane) + return; + + wl_list_for_each(output, &compositor->output_list, link) + pixman_region32_union(&output->damage, &output->damage, damage); +} + /** Inflict damage on the plane where the view is visible. * * \param view The view that causes the damage. @@ -1137,9 +1153,7 @@ weston_view_damage_below(struct weston_view *view) pixman_region32_init(&damage); pixman_region32_subtract(&damage, &view->transform.boundingbox, &view->clip); - if (view->plane) - pixman_region32_union(&view->plane->damage, - &view->plane->damage, &damage); + weston_add_damage(view->surface->compositor, view->plane, &damage); pixman_region32_fini(&damage); weston_view_schedule_repaint(view); } @@ -2611,6 +2625,7 @@ weston_output_damage(struct weston_output *output) pixman_region32_union(&compositor->primary_plane.damage, &compositor->primary_plane.damage, &output->region); + pixman_region32_copy(&output->damage, &output->region); weston_output_schedule_repaint(output); } @@ -2649,8 +2664,7 @@ view_accumulate_damage(struct weston_view *view, pixman_region32_intersect(&damage, &damage, &view->transform.boundingbox); pixman_region32_subtract(&damage, &damage, opaque); - pixman_region32_union(&view->plane->damage, - &view->plane->damage, &damage); + weston_add_damage(view->surface->compositor, view->plane, &damage); pixman_region32_fini(&damage); pixman_region32_copy(&view->clip, opaque); pixman_region32_union(opaque, opaque, &view->transform.opaque); @@ -3017,7 +3031,7 @@ weston_output_repaint(struct weston_output *output, void *repaint_data) pixman_region32_init(&output_damage); pixman_region32_intersect(&output_damage, - &ec->primary_plane.damage, &output->region); + &output->damage, &output->region); pixman_region32_subtract(&output_damage, &output_damage, &ec->primary_plane.clip); @@ -3027,6 +3041,10 @@ weston_output_repaint(struct weston_output *output, void *repaint_data) output->repaint_needed = false; r = output->repaint(output, &output_damage, repaint_data); + /* Clear painted primary damage */ + pixman_region32_intersect(&output->damage, + &output->damage, &ec->primary_plane.damage); + pixman_region32_fini(&output_damage); if (output->repaint_needed) @@ -6767,6 +6785,7 @@ weston_output_init(struct weston_output *output, output->down_scale = 1.0f; + pixman_region32_init(&output->damage); pixman_region32_init(&output->region); wl_list_init(&output->mode_list); } @@ -7082,6 +7101,7 @@ weston_output_release(struct weston_output *output) weston_color_profile_unref(output->color_profile); + pixman_region32_fini(&output->damage); pixman_region32_fini(&output->region); wl_list_remove(&output->link); -- 2.20.1