compositor, clients: make damage double-buffered

This change depends on the Wayland commit
"protocol: double-buffered state for wl_surface".

Implement double-buffering of damage in the compositor as required by
the new protocol.

Ensure all Weston demo clients call wl_surface_commit() after
wl_surface_damage().

Mesa does not need a fix for this, as the patch adding
wl_surface_commit() call to Mesa already takes care of damage, too;
Mesa commit: "wayland: use wl_surface_commit()"

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
Pekka Paalanen 12 years ago committed by Kristian Høgsberg
parent c9e00c06e9
commit 8e159180cc
  1. 4
      clients/simple-touch.c
  2. 1
      clients/smoke.c
  3. 15
      src/compositor.c
  4. 3
      src/compositor.h

@ -142,6 +142,10 @@ touch_paint(struct touch *touch, int32_t x, int32_t y, int32_t id)
p[2] = c; p[2] = c;
wl_surface_damage(touch->surface, x - 2, y - 2, 5, 5); wl_surface_damage(touch->surface, x - 2, y - 2, 5, 5);
/* todo: We could queue up more damage before committing, if there
* are more input events to handle.
*/
wl_surface_commit(touch->surface);
} }
static void static void

@ -223,6 +223,7 @@ redraw_handler(struct widget *widget, void *data)
callback = wl_surface_frame(window_get_wl_surface(smoke->window)); callback = wl_surface_frame(window_get_wl_surface(smoke->window));
wl_callback_add_listener(callback, &listener, smoke); wl_callback_add_listener(callback, &listener, smoke);
wl_surface_commit(window_get_wl_surface(smoke->window));
} }
static int static int

@ -274,6 +274,7 @@ weston_surface_create(struct weston_compositor *compositor)
surface->pending.buffer_destroy_listener.notify = surface->pending.buffer_destroy_listener.notify =
surface_handle_pending_buffer_destroy; surface_handle_pending_buffer_destroy;
pixman_region32_init(&surface->pending.damage);
return surface; return surface;
} }
@ -780,6 +781,8 @@ destroy_surface(struct wl_resource *resource)
if (weston_surface_is_mapped(surface)) if (weston_surface_is_mapped(surface))
weston_surface_unmap(surface); weston_surface_unmap(surface);
pixman_region32_fini(&surface->pending.damage);
if (surface->pending.buffer) if (surface->pending.buffer)
wl_list_remove(&surface->pending.buffer_destroy_listener.link); wl_list_remove(&surface->pending.buffer_destroy_listener.link);
@ -1166,11 +1169,11 @@ surface_damage(struct wl_client *client,
struct wl_resource *resource, struct wl_resource *resource,
int32_t x, int32_t y, int32_t width, int32_t height) int32_t x, int32_t y, int32_t width, int32_t height)
{ {
struct weston_surface *es = resource->data; struct weston_surface *surface = resource->data;
pixman_region32_union_rect(&es->damage, &es->damage, pixman_region32_union_rect(&surface->pending.damage,
&surface->pending.damage,
x, y, width, height); x, y, width, height);
weston_surface_schedule_repaint(es);
} }
static void static void
@ -1265,6 +1268,12 @@ surface_commit(struct wl_client *client, struct wl_resource *resource)
if (surface->buffer && surface->configure) if (surface->buffer && surface->configure)
surface->configure(surface, surface->pending.sx, surface->configure(surface, surface->pending.sx,
surface->pending.sy); surface->pending.sy);
/* wl_surface.damage */
pixman_region32_union(&surface->damage, &surface->damage,
&surface->pending.damage);
empty_region(&surface->pending.damage);
weston_surface_schedule_repaint(surface);
} }
static const struct wl_surface_interface surface_interface = { static const struct wl_surface_interface surface_interface = {

@ -474,6 +474,9 @@ struct weston_surface {
struct wl_listener buffer_destroy_listener; struct wl_listener buffer_destroy_listener;
int32_t sx; int32_t sx;
int32_t sy; int32_t sy;
/* wl_surface.damage */
pixman_region32_t damage;
} pending; } pending;
/* /*

Loading…
Cancel
Save