}
static void
-_e_comp_wl_buffer_damage_set(E_Comp_Wl_Buffer *buffer, Eina_List *buffer_damages)
+_e_comp_wl_buffer_damage_set(E_Comp_Wl_Buffer *buffer, pixman_region32_t *buffer_damages)
{
- Eina_Rectangle *damage_rect = NULL;
- Eina_Rectangle *dmg = NULL;
- Eina_List *l = NULL;
+ pixman_box32_t *dmg;
+ Eina_Rectangle damage_rect;
if (buffer->type != E_COMP_WL_BUFFER_TYPE_NATIVE &&
buffer->type != E_COMP_WL_BUFFER_TYPE_TBM)
if (buffer_damages)
{
- EINA_LIST_FOREACH(buffer_damages, l, dmg)
- {
- if (!damage_rect)
- {
- damage_rect = eina_rectangle_new(dmg->x, dmg->y, dmg->w, dmg->h);
- EINA_SAFETY_ON_FALSE_RETURN(damage_rect);
- }
- else
- eina_rectangle_union(damage_rect, dmg);
- }
+ dmg = pixman_region32_extents(buffer_damages);
+ EINA_RECTANGLE_SET(&damage_rect, dmg->x1, dmg->y1, (dmg->x2 - dmg->x1), (dmg->y2 - dmg->y1));
}
else
{
- damage_rect = eina_rectangle_new(0, 0, buffer->w, buffer->h);
- EINA_SAFETY_ON_FALSE_RETURN(damage_rect);
+ EINA_RECTANGLE_SET(&damage_rect, 0, 0, buffer->w, buffer->h);
}
tbm_surface_internal_set_damage(buffer->tbm_surface,
- damage_rect->x,
- damage_rect->y,
- damage_rect->w,
- damage_rect->h);
-
- eina_rectangle_free(damage_rect);
+ damage_rect.x,
+ damage_rect.y,
+ damage_rect.w,
+ damage_rect.h);
}
static void
_e_comp_wl_surface_state_finish(E_Comp_Wl_Surface_State *state)
{
struct wl_resource *cb;
- Eina_Rectangle *dmg;
EINA_LIST_FREE(state->frames, cb)
wl_resource_destroy(cb);
- EINA_LIST_FREE(state->damages, dmg)
- eina_rectangle_free(dmg);
-
- EINA_LIST_FREE(state->buffer_damages, dmg)
- eina_rectangle_free(dmg);
-
if (state->opaque) eina_tiler_free(state->opaque);
state->opaque = NULL;
/* put state damages into surface */
if (e_client_view_get(ec))
{
+ pixman_region32_t *buffer_damage, *surface_damage;
+
+ buffer_damage = e_surface_buffer_damage_get(surface);
+ surface_damage = e_surface_surface_damage_get(surface);
+
/* FIXME: workaround for bad wayland egl driver which doesn't send damage request */
- if (!eina_list_count(state->damages) && !eina_list_count(state->buffer_damages))
+ if ((!buffer_damage || !pixman_region32_not_empty(buffer_damage)) &&
+ (!surface_damage || !pixman_region32_not_empty(surface_damage)))
{
E_Comp_Wl_Buffer *comp_buffer = e_surface_buffer_try_get(surface);
if ((comp_buffer) &&
else
{
Eina_List *damages = NULL;
+ pixman_box32_t *rects;
+ int nrects, i;
+ int32_t x, y, w, h;
if (buffer)
- _e_comp_wl_buffer_damage_set(buffer, state->buffer_damages);
+ _e_comp_wl_buffer_damage_set(buffer, buffer_damage);
- if (eina_list_count(state->buffer_damages))
+ if (buffer_damage)
{
- EINA_LIST_FREE(state->buffer_damages, dmg)
+ rects = pixman_region32_rectangles(buffer_damage, &nrects);
+ for (i = 0; i < nrects; i++)
{
if (buffer)
{
int32_t bw, bh;
+ x = rects[i].x1;
+ y = rects[i].y1;
+ w = rects[i].x2 - x;
+ h = rects[i].y2 - y;
+
e_comp_wl_buffer_size_get(buffer, &bw, &bh);
e_comp_wl_rect_convert_inverse(bw, bh,
e_comp_wl_output_buffer_transform_get(ec),
e_surface_buffer_scale_get(surface),
- dmg->x, dmg->y, dmg->w, dmg->h,
- &dmg->x, &dmg->y, &dmg->w, &dmg->h);
+ x, y, w, h,
+ &x, &y, &w, &h);
}
- damages = eina_list_append(damages, dmg);
+ damages = eina_list_append(damages, eina_rectangle_new(x, y, w, h));
}
}
- EINA_LIST_FREE(state->damages, dmg)
- damages = eina_list_append(damages, dmg);
+ if (surface_damage)
+ {
+ rects = pixman_region32_rectangles(surface_damage, &nrects);
+ for (i = 0; i < nrects; i++)
+ {
+ x = rects[i].x1;
+ y = rects[i].y1;
+ w = rects[i].x2 - x;
+ h = rects[i].y2 - y;
+ damages = eina_list_append(damages, eina_rectangle_new(x, y, w, h));
+ }
+ }
comp_wl = e_comp_wl_get();
EINA_LIST_FREE(damages, dmg)
}
}
+EINTERN pixman_region32_t *
+e_surface_buffer_damage_get(E_Surface *surface)
+{
+ if (!surface->ds_surface)
+ return NULL;
+
+ return &surface->ds_surface->current.buffer_damage;
+}
+
+EINTERN pixman_region32_t *
+e_surface_surface_damage_get(E_Surface *surface)
+{
+ if (!surface->ds_surface)
+ return NULL;
+
+ return &surface->ds_surface->current.surface_damage;
+}
+
EINTERN E_Subsurface *
e_subsurface_try_from_surface(E_Surface *surface)
{
ds_surface->current.dy);
}
-static void
-_e_surface_pending_surface_damage_update(E_Surface *surface)
-{
- struct ds_surface *ds_surface = surface->ds_surface;
- pixman_box32_t *rects;
- int32_t x, y, w, h;
- int nrects, i;
- Eina_Rectangle *dmg;
-
- rects = pixman_region32_rectangles(&ds_surface->current.surface_damage, &nrects);
- for (i = 0; i < nrects; i++)
- {
- x = rects[i].x1;
- y = rects[i].y1;
- w = rects[i].x2 - x;
- h = rects[i].y2 - y;
-
- dmg = eina_rectangle_new(x, y, w, h);
- if (dmg)
- {
- surface->base.pending.damages =
- eina_list_append(surface->base.pending.damages, dmg);
- }
- }
-}
-
-static void
-_e_surface_pending_buffer_damage_update(E_Surface *surface)
-{
- struct ds_surface *ds_surface = surface->ds_surface;
- pixman_box32_t *rects;
- int32_t x, y, w, h;
- int nrects, i;
- Eina_Rectangle *dmg;
-
- rects = pixman_region32_rectangles(&ds_surface->current.buffer_damage, &nrects);
- for (i = 0; i < nrects; i++)
- {
- x = rects[i].x1;
- y = rects[i].y1;
- w = rects[i].x2 - x;
- h = rects[i].y2 - y;
-
- dmg = eina_rectangle_new(x, y, w, h);
- if (dmg)
- {
- surface->base.pending.buffer_damages =
- eina_list_append(surface->base.pending.buffer_damages, dmg);
- }
- }
-}
-
static void
_region_area_check(Eina_Tiler *tiler, int32_t x, int32_t y, int32_t w, int32_t h)
{
if (ds_surface->current.committed & DS_SURFACE_STATE_BUFFER)
_e_surface_pending_buffer_update(surface);
- if (ds_surface->current.committed & DS_SURFACE_STATE_SURFACE_DAMAGE)
- _e_surface_pending_surface_damage_update(surface);
-
- if (ds_surface->current.committed & DS_SURFACE_STATE_BUFFER_DAMAGE)
- _e_surface_pending_buffer_damage_update(surface);
-
if (ds_surface->current.committed & DS_SURFACE_STATE_OPAQUE_REGION)
_e_surface_pending_opaque_region_update(surface);