[PATCH weston 2/2] compositor: Move clearing of primary plane damage to the backends
Pekka Paalanen
ppaalanen at gmail.com
Fri Nov 23 05:40:18 PST 2012
On Thu, 22 Nov 2012 15:57:00 +0200
Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
wrote:
> Backends may move surfaces to different planes, in which case damage is
> generated in the primary plane. This damage is usually passed to the
> renderer, but in some cases the backend may decide to not render
> anything (that's the case when drm compositor scans out a client
> buffer). In that case the damage on the primary plane would be
> discarded, leading to artifacts later.
>
> This patch makes the backend's responsibility to clear the damage on
> the primary plane, so that unrendered damage is kept for as long as
> necessary.
> ---
>
> I tested this change with drm, x11 and wayland backends. Android and
> rpi are untested.
Tested on rpi, the same time I was testing my wl_buffer.release
changes. Seems to work ok for what I can see.
Though rpi backend always calls the renderer, even if there was nothing
to render. Maybe it should check in assign_planes, whether any planes
go to the primary plane, and if not, not call the renderer at all.
Thanks,
pq
> The wayland backend has some artifacts, but that happends because it
> is tripple buffering, while the renderer assumes that only two buffers
> are used.
>
> src/compositor-android.c | 4 ++++
> src/compositor-drm.c | 3 +++
> src/compositor-headless.c | 3 +++
> src/compositor-rpi.c | 4 ++++
> src/compositor-wayland.c | 4 ++++
> src/compositor-x11.c | 3 +++
> src/compositor.c | 2 --
> 7 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/src/compositor-android.c b/src/compositor-android.c
> index 2c75e8f..5e27071 100644
> --- a/src/compositor-android.c
> +++ b/src/compositor-android.c
> @@ -92,10 +92,14 @@ android_output_repaint(struct weston_output *base, pixman_region32_t *damage)
> {
> struct android_output *output = to_android_output(base);
> struct android_compositor *compositor = output->compositor;
> + struct weston_plane *primary_plane = &compositor->base.primary_plane;
> struct wl_event_loop *loop;
>
> compositor->base.renderer->repaint_output(&output->base, damage);
>
> + pixman_region32_subtract(&primary_plane->damage,
> + &primary_plane->damage, damage);
> +
> /* FIXME: does Android have a way to signal page flip done? */
> loop = wl_display_get_event_loop(compositor->base.wl_display);
> wl_event_loop_add_idle(loop, android_finish_frame, output);
> diff --git a/src/compositor-drm.c b/src/compositor-drm.c
> index 1ecd93c..417b67f 100644
> --- a/src/compositor-drm.c
> +++ b/src/compositor-drm.c
> @@ -357,6 +357,9 @@ drm_output_render(struct drm_output *output, pixman_region32_t *damage)
>
> c->base.renderer->repaint_output(&output->base, damage);
>
> + pixman_region32_subtract(&c->base.primary_plane.damage,
> + &c->base.primary_plane.damage, damage);
> +
> bo = gbm_surface_lock_front_buffer(output->surface);
> if (!bo) {
> weston_log("failed to lock front buffer: %m\n");
> diff --git a/src/compositor-headless.c b/src/compositor-headless.c
> index 55206b3..d23ee0a 100644
> --- a/src/compositor-headless.c
> +++ b/src/compositor-headless.c
> @@ -66,6 +66,9 @@ headless_output_repaint(struct weston_output *output_base,
>
> ec->renderer->repaint_output(&output->base, damage);
>
> + pixman_region32_subtract(&ec->primary_plane.damage,
> + &ec->primary_plane.damage, damage);
> +
> wl_event_source_timer_update(output->finish_frame_timer, 16);
>
> return;
> diff --git a/src/compositor-rpi.c b/src/compositor-rpi.c
> index 339032a..c75bcda 100644
> --- a/src/compositor-rpi.c
> +++ b/src/compositor-rpi.c
> @@ -914,6 +914,7 @@ rpi_output_repaint(struct weston_output *base, pixman_region32_t *damage)
> {
> struct rpi_output *output = to_rpi_output(base);
> struct rpi_compositor *compositor = output->compositor;
> + struct weston_plane *primary_plane = &compositor->base.primary_plane;
> struct rpi_element *element;
> DISPMANX_UPDATE_HANDLE_T update;
> int layer = 10000;
> @@ -942,6 +943,9 @@ rpi_output_repaint(struct weston_output *base, pixman_region32_t *damage)
> */
> compositor->base.renderer->repaint_output(&output->base, damage);
>
> + pixman_region32_subtract(&primary_plane->damage,
> + &primary_plane->damage, damage);
> +
> /* Move the list of elements into the old_element_list. */
> wl_list_insert_list(&output->old_element_list, &output->element_list);
> wl_list_init(&output->element_list);
> diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
> index 5376a20..24dccd1 100644
> --- a/src/compositor-wayland.c
> +++ b/src/compositor-wayland.c
> @@ -137,6 +137,10 @@ wayland_output_repaint(struct weston_output *output_base,
> wl_callback_add_listener(callback, &frame_listener, output);
>
> ec->renderer->repaint_output(&output->base, damage);
> +
> + pixman_region32_subtract(&ec->primary_plane.damage,
> + &ec->primary_plane.damage, damage);
> +
> }
>
> static void
> diff --git a/src/compositor-x11.c b/src/compositor-x11.c
> index ba18297..b26da09 100644
> --- a/src/compositor-x11.c
> +++ b/src/compositor-x11.c
> @@ -314,6 +314,9 @@ x11_output_repaint(struct weston_output *output_base,
>
> ec->renderer->repaint_output(output_base, damage);
>
> + pixman_region32_subtract(&ec->primary_plane.damage,
> + &ec->primary_plane.damage, damage);
> +
> wl_event_source_timer_update(output->finish_frame_timer, 10);
> }
>
> diff --git a/src/compositor.c b/src/compositor.c
> index 2ca48b8..6eb0b8c 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -985,8 +985,6 @@ weston_output_repaint(struct weston_output *output, uint32_t msecs)
> pixman_region32_init(&output_damage);
> pixman_region32_intersect(&output_damage,
> &ec->primary_plane.damage, &output->region);
> - pixman_region32_subtract(&ec->primary_plane.damage,
> - &ec->primary_plane.damage, &output->region);
>
> if (output->dirty)
> weston_output_update_matrix(output);
More information about the wayland-devel
mailing list