[PATCH weston v2 1/3] compositor: remove redundant geometry dirtying
Kristian Høgsberg
hoegsberg at gmail.com
Mon Mar 18 19:21:08 PDT 2013
On Fri, Mar 08, 2013 at 02:56:48PM +0200, Pekka Paalanen wrote:
> Remove redundant geometry dirtying from surface_commit() to simplify
> further changes.
>
> This code was added in commit 5df8ecac5d31467122a9d8bda6241d5957ae6848
> "compositor: Fix partial repaints"
>
> as the fix to:
> https://bugs.freedesktop.org/show_bug.cgi?id=56538
>
> The issue fixed by that commit was making the geometry dirty on every
> attach, which caused full-surface repaints every time. The bug was
> probably introduced by the opaque region changes during implementing
> wl_surface.commit. The mentioned commit fixes the opaque handling by
> comparing the new and old regions.
>
> However, the commit also introduces additional checks that set
> geometry.dirty. In the current code base, this should be unnecessary.
>
> If the pending.sx or pending.sy are not zero, or if the surface size
> changes, the configure() hook is responsible for applying the new
> values, and so also marking the geometry dirty.
>
> The configure() hook is only called, if there has been a new
> wl_surface.attach. Nothing else can change these variables, so this
> should be enough.
>
> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> Cc: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
Yes, this should be fine. Worst case there's a couple of configure
handlers we need to fix if something breaks.
Kristian
> ---
>
> Tested only very quickly, I wonder if this breaks anything.
> I can fix the fallout in the various configure() implementations,
> of course, if there is something.
> ---
> src/compositor.c | 35 +++--------------------------------
> 1 file changed, 3 insertions(+), 32 deletions(-)
>
> diff --git a/src/compositor.c b/src/compositor.c
> index a2860fd..75ff035 100644
> --- a/src/compositor.c
> +++ b/src/compositor.c
> @@ -1372,31 +1372,6 @@ surface_set_input_region(struct wl_client *client,
> }
> }
>
> -static int
> -surface_pending_buffer_has_different_size(struct weston_surface *surface)
> -{
> - int width, height;
> -
> - switch (surface->pending.buffer_transform) {
> - case WL_OUTPUT_TRANSFORM_90:
> - case WL_OUTPUT_TRANSFORM_270:
> - case WL_OUTPUT_TRANSFORM_FLIPPED_90:
> - case WL_OUTPUT_TRANSFORM_FLIPPED_270:
> - height = surface->pending.buffer->width;
> - width = surface->pending.buffer->height;
> - break;
> - default:
> - width = surface->pending.buffer->width;
> - height = surface->pending.buffer->height;
> - }
> -
> - if (width == surface->geometry.width &&
> - height == surface->geometry.height)
> - return 0;
> - else
> - return 1;
> -}
> -
> static void
> surface_commit(struct wl_client *client, struct wl_resource *resource)
> {
> @@ -1405,11 +1380,6 @@ surface_commit(struct wl_client *client, struct wl_resource *resource)
> int buffer_width = 0;
> int buffer_height = 0;
>
> - if (surface->pending.sx || surface->pending.sy ||
> - (surface->pending.buffer &&
> - surface_pending_buffer_has_different_size(surface)))
> - surface->geometry.dirty = 1;
> -
> /* wl_surface.set_buffer_rotation */
> surface->buffer_transform = surface->pending.buffer_transform;
>
> @@ -1423,8 +1393,9 @@ surface_commit(struct wl_client *client, struct wl_resource *resource)
> }
>
> if (surface->configure && surface->pending.newly_attached)
> - surface->configure(surface, surface->pending.sx,
> - surface->pending.sy, buffer_width, buffer_height);
> + surface->configure(surface,
> + surface->pending.sx, surface->pending.sy,
> + buffer_width, buffer_height);
>
> if (surface->pending.buffer)
> wl_list_remove(&surface->pending.buffer_destroy_listener.link);
> --
> 1.7.12.4
>
More information about the wayland-devel
mailing list