[PATCH weston] compositor: Fix partial repaints

Kristian Høgsberg hoegsberg at gmail.com
Tue Oct 30 10:55:47 PDT 2012


On Tue, Oct 30, 2012 at 05:44:01PM +0200, Ander Conselvan de Oliveira wrote:
> Partial repaints have been broken since the introduction of the atomic
> surface updates. The problem was that surface_commit would set the
> geometry dirty flag unconditionally, causing transform updates on every
> frame which would in turn cause weston_surface_damage_below() to damage
> the whole surface area.
> 
> This patch changes this so that flag is only set if the pending buffer
> has a different size, the location of the surface changed or the opaque
> region changed.
> 
> Note that changing the opaque region will cause a full repaint of the
> affected surface, because of the transform update.

Thanks, that looks good, committed.  I added the Bugzilla URL for
56538 to the commit message.

Kristian

> ---
>  src/compositor.c |   22 +++++++++++++++++-----
>  1 file changed, 17 insertions(+), 5 deletions(-)
> 
> diff --git a/src/compositor.c b/src/compositor.c
> index 3597cf7..56474a5 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1234,6 +1234,13 @@ static void
>  surface_commit(struct wl_client *client, struct wl_resource *resource)
>  {
>  	struct weston_surface *surface = resource->data;
> +	pixman_region32_t opaque;
> +
> +	if (surface->pending.sx || surface->pending.sy ||
> +	    (surface->pending.buffer &&
> +	     (surface->pending.buffer->width != surface->geometry.width ||
> +	      surface->pending.buffer->height != surface->geometry.height)))
> +		surface->geometry.dirty = 1;
>  
>  	/* wl_surface.attach */
>  	if (surface->pending.buffer || surface->pending.remove_contents)
> @@ -1249,13 +1256,18 @@ surface_commit(struct wl_client *client, struct wl_resource *resource)
>  	empty_region(&surface->pending.damage);
>  
>  	/* wl_surface.set_opaque_region */
> -	pixman_region32_fini(&surface->opaque);
> -	pixman_region32_init_rect(&surface->opaque, 0, 0,
> +	pixman_region32_init_rect(&opaque, 0, 0,
>  				  surface->geometry.width,
>  				  surface->geometry.height);
> -	pixman_region32_intersect(&surface->opaque,
> -				  &surface->opaque, &surface->pending.opaque);
> -	surface->geometry.dirty = 1;
> +	pixman_region32_intersect(&opaque,
> +				  &opaque, &surface->pending.opaque);
> +
> +	if (!pixman_region32_equal(&opaque, &surface->opaque)) {
> +		pixman_region32_copy(&surface->opaque, &opaque);
> +		surface->geometry.dirty = 1;
> +	}
> +
> +	pixman_region32_fini(&opaque);
>  
>  	/* wl_surface.set_input_region */
>  	pixman_region32_fini(&surface->input);
> -- 
> 1.7.10.4
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel


More information about the wayland-devel mailing list