1*4882a593SmuzhiyunFrom 6769833f52639d0acd9831b174bd12a6941417b4 Mon Sep 17 00:00:00 2001 2*4882a593SmuzhiyunFrom: Jeffy Chen <jeffy.chen@rock-chips.com> 3*4882a593SmuzhiyunDate: Thu, 2 Jun 2022 18:22:38 +0800 4*4882a593SmuzhiyunSubject: [PATCH 14/79] compositor: Fix damage tracking error when overlapped 5*4882a593Smuzhiyun outputs 6*4882a593Smuzhiyun 7*4882a593SmuzhiyunSigned-off-by: Jeffy Chen <jeffy.chen@rock-chips.com> 8*4882a593Smuzhiyun--- 9*4882a593Smuzhiyun include/libweston/libweston.h | 2 ++ 10*4882a593Smuzhiyun libweston/compositor.c | 32 ++++++++++++++++++++++++++------ 11*4882a593Smuzhiyun 2 files changed, 28 insertions(+), 6 deletions(-) 12*4882a593Smuzhiyun 13*4882a593Smuzhiyundiff --git a/include/libweston/libweston.h b/include/libweston/libweston.h 14*4882a593Smuzhiyunindex 103c293b..984d5f3c 100644 15*4882a593Smuzhiyun--- a/include/libweston/libweston.h 16*4882a593Smuzhiyun+++ b/include/libweston/libweston.h 17*4882a593Smuzhiyun@@ -485,6 +485,8 @@ struct weston_output { 18*4882a593Smuzhiyun /** For cancelling the idle_repaint callback on output destruction. */ 19*4882a593Smuzhiyun struct wl_event_source *idle_repaint_source; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun+ pixman_region32_t damage; 22*4882a593Smuzhiyun+ 23*4882a593Smuzhiyun int dirty; 24*4882a593Smuzhiyun struct wl_signal frame_signal; 25*4882a593Smuzhiyun struct wl_signal destroy_signal; /**< sent when disabled */ 26*4882a593Smuzhiyundiff --git a/libweston/compositor.c b/libweston/compositor.c 27*4882a593Smuzhiyunindex 23316ef5..9f8282bc 100644 28*4882a593Smuzhiyun--- a/libweston/compositor.c 29*4882a593Smuzhiyun+++ b/libweston/compositor.c 30*4882a593Smuzhiyun@@ -1069,6 +1069,22 @@ weston_view_move_to_plane(struct weston_view *view, 31*4882a593Smuzhiyun weston_surface_damage(view->surface); 32*4882a593Smuzhiyun } 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun+static void 35*4882a593Smuzhiyun+weston_add_damage(struct weston_compositor *compositor, 36*4882a593Smuzhiyun+ struct weston_plane *plane, pixman_region32_t *damage) 37*4882a593Smuzhiyun+{ 38*4882a593Smuzhiyun+ struct weston_output *output; 39*4882a593Smuzhiyun+ 40*4882a593Smuzhiyun+ if (plane) 41*4882a593Smuzhiyun+ pixman_region32_union(&plane->damage, &plane->damage, damage); 42*4882a593Smuzhiyun+ 43*4882a593Smuzhiyun+ if (plane != &compositor->primary_plane) 44*4882a593Smuzhiyun+ return; 45*4882a593Smuzhiyun+ 46*4882a593Smuzhiyun+ wl_list_for_each(output, &compositor->output_list, link) 47*4882a593Smuzhiyun+ pixman_region32_union(&output->damage, &output->damage, damage); 48*4882a593Smuzhiyun+} 49*4882a593Smuzhiyun+ 50*4882a593Smuzhiyun /** Inflict damage on the plane where the view is visible. 51*4882a593Smuzhiyun * 52*4882a593Smuzhiyun * \param view The view that causes the damage. 53*4882a593Smuzhiyun@@ -1093,9 +1109,7 @@ weston_view_damage_below(struct weston_view *view) 54*4882a593Smuzhiyun pixman_region32_init(&damage); 55*4882a593Smuzhiyun pixman_region32_subtract(&damage, &view->transform.boundingbox, 56*4882a593Smuzhiyun &view->clip); 57*4882a593Smuzhiyun- if (view->plane) 58*4882a593Smuzhiyun- pixman_region32_union(&view->plane->damage, 59*4882a593Smuzhiyun- &view->plane->damage, &damage); 60*4882a593Smuzhiyun+ weston_add_damage(view->surface->compositor, view->plane, &damage); 61*4882a593Smuzhiyun pixman_region32_fini(&damage); 62*4882a593Smuzhiyun weston_view_schedule_repaint(view); 63*4882a593Smuzhiyun } 64*4882a593Smuzhiyun@@ -2853,6 +2867,7 @@ weston_output_damage(struct weston_output *output) 65*4882a593Smuzhiyun pixman_region32_union(&compositor->primary_plane.damage, 66*4882a593Smuzhiyun &compositor->primary_plane.damage, 67*4882a593Smuzhiyun &output->region); 68*4882a593Smuzhiyun+ pixman_region32_copy(&output->damage, &output->region); 69*4882a593Smuzhiyun weston_output_schedule_repaint(output); 70*4882a593Smuzhiyun } 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun@@ -2906,8 +2921,7 @@ view_accumulate_damage(struct weston_view *view, 73*4882a593Smuzhiyun pixman_region32_intersect(&damage, &damage, 74*4882a593Smuzhiyun &view->transform.boundingbox); 75*4882a593Smuzhiyun pixman_region32_subtract(&damage, &damage, opaque); 76*4882a593Smuzhiyun- pixman_region32_union(&view->plane->damage, 77*4882a593Smuzhiyun- &view->plane->damage, &damage); 78*4882a593Smuzhiyun+ weston_add_damage(view->surface->compositor, view->plane, &damage); 79*4882a593Smuzhiyun pixman_region32_fini(&damage); 80*4882a593Smuzhiyun pixman_region32_copy(&view->clip, opaque); 81*4882a593Smuzhiyun pixman_region32_union(opaque, opaque, &view->transform.opaque); 82*4882a593Smuzhiyun@@ -3280,7 +3294,7 @@ weston_output_repaint(struct weston_output *output) 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun pixman_region32_init(&output_damage); 85*4882a593Smuzhiyun pixman_region32_intersect(&output_damage, 86*4882a593Smuzhiyun- &ec->primary_plane.damage, &output->region); 87*4882a593Smuzhiyun+ &output->damage, &output->region); 88*4882a593Smuzhiyun pixman_region32_subtract(&output_damage, 89*4882a593Smuzhiyun &output_damage, &ec->primary_plane.clip); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun@@ -3289,6 +3303,10 @@ weston_output_repaint(struct weston_output *output) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyun r = output->repaint(output, &output_damage); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun+ /* Clear painted primary damage */ 96*4882a593Smuzhiyun+ pixman_region32_intersect(&output->damage, 97*4882a593Smuzhiyun+ &output->damage, &ec->primary_plane.damage); 98*4882a593Smuzhiyun+ 99*4882a593Smuzhiyun pixman_region32_fini(&output_damage); 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun output->repaint_needed = false; 102*4882a593Smuzhiyun@@ -7216,6 +7234,7 @@ weston_output_init(struct weston_output *output, 103*4882a593Smuzhiyun /* Can't use -1 on uint32_t and 0 is valid enum value */ 104*4882a593Smuzhiyun output->transform = UINT32_MAX; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun+ pixman_region32_init(&output->damage); 107*4882a593Smuzhiyun pixman_region32_init(&output->region); 108*4882a593Smuzhiyun wl_list_init(&output->mode_list); 109*4882a593Smuzhiyun } 110*4882a593Smuzhiyun@@ -7527,6 +7546,7 @@ weston_output_release(struct weston_output *output) 111*4882a593Smuzhiyun weston_color_profile_unref(output->color_profile); 112*4882a593Smuzhiyun assert(output->color_outcome == NULL); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun+ pixman_region32_fini(&output->damage); 115*4882a593Smuzhiyun pixman_region32_fini(&output->region); 116*4882a593Smuzhiyun wl_list_remove(&output->link); 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun-- 119*4882a593Smuzhiyun2.20.1 120*4882a593Smuzhiyun 121