mirror of
https://github.com/brl/mutter.git
synced 2024-11-29 11:30:45 -05:00
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:
parent
efa3bd03c5
commit
20d64cbb39
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user