compositor: ignore views on other outputs during compositor_accumulate_damage()
compositor_accumulate_damage() is called for each output during repaint. The DRM backend will only set keep_buffer for the surfaces that are visible on the current output. So a buffer_ref is released that may still be needed. When the output that shows the surface is repainted, the buffer_ref is gone and the surface cannot be put on a plane. Ignore all surfaces that are not visible on the current output to avoid this. Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
This commit is contained in:
committed by
Daniel Stone
parent
b7e5f10bf4
commit
c5ea495f7a
@@ -2491,8 +2491,9 @@ view_accumulate_damage(struct weston_view *view,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
compositor_accumulate_damage(struct weston_compositor *ec)
|
output_accumulate_damage(struct weston_output *output)
|
||||||
{
|
{
|
||||||
|
struct weston_compositor *ec = output->compositor;
|
||||||
struct weston_plane *plane;
|
struct weston_plane *plane;
|
||||||
struct weston_view *ev;
|
struct weston_view *ev;
|
||||||
pixman_region32_t opaque, clip;
|
pixman_region32_t opaque, clip;
|
||||||
@@ -2521,6 +2522,9 @@ compositor_accumulate_damage(struct weston_compositor *ec)
|
|||||||
ev->surface->touched = false;
|
ev->surface->touched = false;
|
||||||
|
|
||||||
wl_list_for_each(ev, &ec->view_list, link) {
|
wl_list_for_each(ev, &ec->view_list, link) {
|
||||||
|
/* Ignore views not visible on the current output */
|
||||||
|
if (!(ev->output_mask & (1u << output->id)))
|
||||||
|
continue;
|
||||||
if (ev->surface->touched)
|
if (ev->surface->touched)
|
||||||
continue;
|
continue;
|
||||||
ev->surface->touched = true;
|
ev->surface->touched = true;
|
||||||
@@ -2763,7 +2767,7 @@ weston_output_repaint(struct weston_output *output, void *repaint_data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compositor_accumulate_damage(ec);
|
output_accumulate_damage(output);
|
||||||
|
|
||||||
pixman_region32_init(&output_damage);
|
pixman_region32_init(&output_damage);
|
||||||
pixman_region32_intersect(&output_damage,
|
pixman_region32_intersect(&output_damage,
|
||||||
|
|||||||
Reference in New Issue
Block a user