Merge pull request #957 from emersion/output-damage-max-rects

output-damage: limit the number of damaged rectangles
This commit is contained in:
Drew DeVault 2018-05-07 08:08:38 -04:00 committed by GitHub
commit 7c2241a556
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 10 additions and 0 deletions

View file

@ -23,6 +23,7 @@
*/ */
struct wlr_output_damage { struct wlr_output_damage {
struct wlr_output *output; struct wlr_output *output;
int max_rects; // max number of damaged rectangles
pixman_region32_t current; // in output-local coordinates pixman_region32_t current; // in output-local coordinates

View file

@ -58,6 +58,7 @@ struct wlr_output_damage *wlr_output_damage_create(struct wlr_output *output) {
} }
output_damage->output = output; output_damage->output = output;
output_damage->max_rects = 20;
wl_signal_init(&output_damage->events.frame); wl_signal_init(&output_damage->events.frame);
wl_signal_init(&output_damage->events.destroy); wl_signal_init(&output_damage->events.destroy);
@ -125,6 +126,14 @@ bool wlr_output_damage_make_current(struct wlr_output_damage *output_damage,
int j = (idx + i) % WLR_OUTPUT_DAMAGE_PREVIOUS_LEN; int j = (idx + i) % WLR_OUTPUT_DAMAGE_PREVIOUS_LEN;
pixman_region32_union(damage, damage, &output_damage->previous[j]); pixman_region32_union(damage, damage, &output_damage->previous[j]);
} }
// Check the number of rectangles
int n_rects = pixman_region32_n_rects(damage);
if (n_rects > output_damage->max_rects) {
pixman_box32_t *extents = pixman_region32_extents(damage);
pixman_region32_union_rect(damage, damage, extents->x1, extents->y1,
extents->x2 - extents->x1, extents->y2 - extents->y1);
}
} }
*needs_swap = output->needs_swap || pixman_region32_not_empty(damage); *needs_swap = output->needs_swap || pixman_region32_not_empty(damage);