From 49e167d835045348b10b615dcb201de17a4fc4a7 Mon Sep 17 00:00:00 2001 From: Taekyun Kim Date: Mon, 14 Sep 2015 18:20:41 +0900 Subject: [PATCH] pepper: Fix memory leak while accumulating plane clip region Change-Id: I0477b4b98fe3dcdfe666e5167327536ae098954e --- src/lib/pepper/output.c | 7 +------ src/lib/pepper/plane.c | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/lib/pepper/output.c b/src/lib/pepper/output.c index e7cb87d..2f539e8 100644 --- a/src/lib/pepper/output.c +++ b/src/lib/pepper/output.c @@ -97,16 +97,11 @@ output_accumulate_damage(pepper_output_t *output) { pepper_plane_t *plane; pixman_region32_t clip; - pixman_region32_t plane_clip; pixman_region32_init(&clip); pepper_list_for_each_reverse(plane, &output->plane_list, link) - { - pepper_plane_accumulate_damage(plane, &plane_clip); - pixman_region32_copy(&plane->clip_region, &clip); - pixman_region32_union(&clip, &clip, &plane_clip); - } + pepper_plane_accumulate_damage(plane, &clip); pixman_region32_fini(&clip); } diff --git a/src/lib/pepper/plane.c b/src/lib/pepper/plane.c index bc05e75..2029515 100644 --- a/src/lib/pepper/plane.c +++ b/src/lib/pepper/plane.c @@ -33,19 +33,21 @@ pepper_plane_accumulate_damage(pepper_plane_t *plane, pixman_region32_t *clip) int w = plane->output->geometry.w; int h = plane->output->geometry.h; pepper_plane_entry_t *entry; + pixman_region32_t plane_clip; - pixman_region32_init(clip); + pixman_region32_init(&plane_clip); pepper_list_for_each_reverse(entry, &plane->entry_list, link) { - pepper_view_t *view = (pepper_view_t *)entry->base.view; + pepper_view_t *view = (pepper_view_t *)entry->base.view; - pixman_region32_subtract(&entry->base.visible_region, &view->bounding_region, clip); + pixman_region32_subtract(&entry->base.visible_region, &view->bounding_region, &plane_clip); pixman_region32_translate(&entry->base.visible_region, -x, -y); pixman_region32_intersect_rect(&entry->base.visible_region, &entry->base.visible_region, 0, 0, w, h); - pixman_region32_union(clip, clip, &view->opaque_region); + /* Accumulate opaque region of this plane on plane_clip. */ + pixman_region32_union(&plane_clip, &plane_clip, &view->opaque_region); if (entry->need_damage) { @@ -57,8 +59,16 @@ pepper_plane_accumulate_damage(pepper_plane_t *plane, pixman_region32_t *clip) pepper_surface_flush_damage(view->surface); } - pixman_region32_translate(clip, -x, -y); - pixman_region32_intersect_rect(clip, clip, 0, 0, w, h); + /* Transform plane_clip to output local coordinate space. */ + pixman_region32_translate(&plane_clip, -x, -y); + pixman_region32_intersect_rect(&plane_clip, &plane_clip, 0, 0, w, h); + + /* Copy accumulated clip region obsecured by opaque regions of views in front of this plane. */ + pixman_region32_copy(&plane->clip_region, clip); + + /* Accumulate clip region for the below plane. */ + pixman_region32_union(clip, clip, &plane_clip); + pixman_region32_fini(&plane_clip); } PEPPER_API pepper_plane_t * -- 2.7.4