cogland: Handle damage events for non-shm buffers too

When a Wayland compositor gets a commit it only needs to redraw the
region specified by the pending damage event. Previously Cogland was
ignoring damage events for non-shm buffers and just always queuing a
redraw after a commit event. This patch changes it to queue a redraw
only in response to a damage event. In practice this doesn't really
make much difference because Cogland doesn't do anything clever to
handle updating a sub-region of the screen, but it more costly matches
the model a compositor should use.

Reviewed-by: Robert Bragg <robert@linux.intel.com>

(cherry picked from commit 15f00609e41f689234ee8d5b2f9e95fb74612d12)
This commit is contained in:
Neil Roberts 2013-04-11 16:41:17 +01:00
parent efa3bd03c5
commit 20d64cbb39

View File

@ -336,15 +336,16 @@ cogland_queue_redraw (CoglandCompositor *compositor)
} }
static void static void
shm_buffer_damaged (CoglandSurface *surface, surface_damaged (CoglandSurface *surface,
int32_t x, int32_t x,
int32_t y, int32_t y,
int32_t width, int32_t width,
int32_t height) int32_t height)
{ {
struct wl_buffer *wayland_buffer = surface->buffer; struct wl_buffer *wayland_buffer = surface->buffer;
if (surface->texture) if (surface->texture &&
wl_buffer_is_shm (surface->buffer))
{ {
CoglPixelFormat format; CoglPixelFormat format;
int stride = wl_shm_buffer_get_stride (wayland_buffer); int stride = wl_shm_buffer_get_stride (wayland_buffer);
@ -381,6 +382,8 @@ shm_buffer_damaged (CoglandSurface *surface,
stride, stride,
data); data);
} }
cogland_queue_redraw (surface->compositor);
} }
static void static void
@ -558,7 +561,6 @@ cogland_surface_commit (struct wl_client *client,
/* wl_surface.damage */ /* wl_surface.damage */
if (surface->buffer && if (surface->buffer &&
wl_buffer_is_shm (surface->buffer) &&
surface->texture && surface->texture &&
!region_is_empty (&surface->pending.damage)) !region_is_empty (&surface->pending.damage))
{ {
@ -574,11 +576,11 @@ cogland_surface_commit (struct wl_client *client,
if (region->y1 < 0) if (region->y1 < 0)
region->y1 = 0; region->y1 = 0;
shm_buffer_damaged (surface, surface_damaged (surface,
region->x1, region->x1,
region->y1, region->y1,
region->x2 - region->x1, region->x2 - region->x1,
region->y2 - region->y1); region->y2 - region->y1);
} }
region_init (&surface->pending.damage); region_init (&surface->pending.damage);
@ -586,8 +588,6 @@ cogland_surface_commit (struct wl_client *client,
wl_list_insert_list (&compositor->frame_callbacks, wl_list_insert_list (&compositor->frame_callbacks,
&surface->pending.frame_callback_list); &surface->pending.frame_callback_list);
wl_list_init (&surface->pending.frame_callback_list); wl_list_init (&surface->pending.frame_callback_list);
cogland_queue_redraw (compositor);
} }
static void static void