compositor: Move clearing of primary plane damage to the backends

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.
Ander Conselvan de Oliveira 12 years ago committed by Kristian Høgsberg
parent 7e918da36f
commit 0a887728ea
  1. 4
      src/compositor-android.c
  2. 3
      src/compositor-drm.c
  3. 3
      src/compositor-headless.c
  4. 4
      src/compositor-rpi.c
  5. 4
      src/compositor-wayland.c
  6. 3
      src/compositor-x11.c
  7. 2
      src/compositor.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);

@ -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");

@ -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;

@ -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);

@ -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

@ -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);
}

@ -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);

Loading…
Cancel
Save