1From 4ad42486d8c95f316c25d3c0c5d7b7bd16a71e81 Mon Sep 17 00:00:00 2001 2From: Jeffy Chen <jeffy.chen@rock-chips.com> 3Date: Thu, 2 Jun 2022 18:22:38 +0800 4Subject: [PATCH 67/79] compositor: Fix damage tracking error when overlapped 5 outputs 6 7Signed-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 8--- 9 include/libweston/libweston.h | 2 ++ 10 libweston/compositor.c | 32 ++++++++++++++++++++++++++------ 11 2 files changed, 28 insertions(+), 6 deletions(-) 12 13diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h 14index 74dec9d..26804e2 100644 15--- a/include/libweston/libweston.h 16+++ b/include/libweston/libweston.h 17@@ -326,6 +326,8 @@ struct weston_output { 18 /** For cancelling the idle_repaint callback on output destruction. */ 19 struct wl_event_source *idle_repaint_source; 20 21+ pixman_region32_t damage; 22+ 23 struct weston_output_zoom zoom; 24 int dirty; 25 struct wl_signal frame_signal; 26diff --git a/libweston/compositor.c b/libweston/compositor.c 27index 7db212f..fc8cef3 100644 28--- a/libweston/compositor.c 29+++ b/libweston/compositor.c 30@@ -1113,6 +1113,22 @@ weston_view_move_to_plane(struct weston_view *view, 31 weston_surface_damage(view->surface); 32 } 33 34+static void 35+weston_add_damage(struct weston_compositor *compositor, 36+ struct weston_plane *plane, pixman_region32_t *damage) 37+{ 38+ struct weston_output *output; 39+ 40+ if (plane) 41+ pixman_region32_union(&plane->damage, &plane->damage, damage); 42+ 43+ if (plane != &compositor->primary_plane) 44+ return; 45+ 46+ wl_list_for_each(output, &compositor->output_list, link) 47+ pixman_region32_union(&output->damage, &output->damage, damage); 48+} 49+ 50 /** Inflict damage on the plane where the view is visible. 51 * 52 * \param view The view that causes the damage. 53@@ -1137,9 +1153,7 @@ weston_view_damage_below(struct weston_view *view) 54 pixman_region32_init(&damage); 55 pixman_region32_subtract(&damage, &view->transform.boundingbox, 56 &view->clip); 57- if (view->plane) 58- pixman_region32_union(&view->plane->damage, 59- &view->plane->damage, &damage); 60+ weston_add_damage(view->surface->compositor, view->plane, &damage); 61 pixman_region32_fini(&damage); 62 weston_view_schedule_repaint(view); 63 } 64@@ -2611,6 +2625,7 @@ weston_output_damage(struct weston_output *output) 65 pixman_region32_union(&compositor->primary_plane.damage, 66 &compositor->primary_plane.damage, 67 &output->region); 68+ pixman_region32_copy(&output->damage, &output->region); 69 weston_output_schedule_repaint(output); 70 } 71 72@@ -2649,8 +2664,7 @@ view_accumulate_damage(struct weston_view *view, 73 pixman_region32_intersect(&damage, &damage, 74 &view->transform.boundingbox); 75 pixman_region32_subtract(&damage, &damage, opaque); 76- pixman_region32_union(&view->plane->damage, 77- &view->plane->damage, &damage); 78+ weston_add_damage(view->surface->compositor, view->plane, &damage); 79 pixman_region32_fini(&damage); 80 pixman_region32_copy(&view->clip, opaque); 81 pixman_region32_union(opaque, opaque, &view->transform.opaque); 82@@ -3017,7 +3031,7 @@ weston_output_repaint(struct weston_output *output, void *repaint_data) 83 84 pixman_region32_init(&output_damage); 85 pixman_region32_intersect(&output_damage, 86- &ec->primary_plane.damage, &output->region); 87+ &output->damage, &output->region); 88 pixman_region32_subtract(&output_damage, 89 &output_damage, &ec->primary_plane.clip); 90 91@@ -3027,6 +3041,10 @@ weston_output_repaint(struct weston_output *output, void *repaint_data) 92 output->repaint_needed = false; 93 r = output->repaint(output, &output_damage, repaint_data); 94 95+ /* Clear painted primary damage */ 96+ pixman_region32_intersect(&output->damage, 97+ &output->damage, &ec->primary_plane.damage); 98+ 99 pixman_region32_fini(&output_damage); 100 101 if (output->repaint_needed) 102@@ -6767,6 +6785,7 @@ weston_output_init(struct weston_output *output, 103 104 output->down_scale = 1.0f; 105 106+ pixman_region32_init(&output->damage); 107 pixman_region32_init(&output->region); 108 wl_list_init(&output->mode_list); 109 } 110@@ -7082,6 +7101,7 @@ weston_output_release(struct weston_output *output) 111 112 weston_color_profile_unref(output->color_profile); 113 114+ pixman_region32_fini(&output->damage); 115 pixman_region32_fini(&output->region); 116 wl_list_remove(&output->link); 117 118-- 1192.20.1 120 121