From: Seunghun Lee Date: Tue, 20 Aug 2024 08:40:05 +0000 (+0900) Subject: e_compositor: Add {buffer,surface}_damage_get X-Git-Tag: accepted/tizen/unified/20241206.132905~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c3759f6b90cd09af3debee8d4c9526001d9049d7;p=platform%2Fupstream%2Fenlightenment.git e_compositor: Add {buffer,surface}_damage_get This patch deprecates `damages` and `buffer_damage` of E_Comp_Wl_Surface_State. Change-Id: Iaadc6e4b827f5f9b977a111a94a6fb8f423a35cf --- diff --git a/src/bin/server/e_comp_wl.c b/src/bin/server/e_comp_wl.c index c633d54a1b..1f15022c1a 100644 --- a/src/bin/server/e_comp_wl.c +++ b/src/bin/server/e_comp_wl.c @@ -2371,11 +2371,10 @@ _e_comp_wl_evas_cb_focus_out(void *data, Evas *evas EINA_UNUSED, Evas_Object *ob } 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) @@ -2385,30 +2384,19 @@ _e_comp_wl_buffer_damage_set(E_Comp_Wl_Buffer *buffer, Eina_List *buffer_damages 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 @@ -2783,17 +2771,10 @@ 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; @@ -3059,8 +3040,14 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state) /* 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) && @@ -3076,31 +3063,50 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state) 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) diff --git a/src/bin/server/e_comp_wl_rsm.c b/src/bin/server/e_comp_wl_rsm.c index 195d564ead..d3454b0d25 100644 --- a/src/bin/server/e_comp_wl_rsm.c +++ b/src/bin/server/e_comp_wl_rsm.c @@ -2995,7 +2995,6 @@ _e_comp_wl_remote_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *st E_Comp_Wl_Remote_Provider *provider; E_Comp_Wl_Remote_Source *source; E_Comp_Wl_Remote_Surface *surface; - Eina_Rectangle *dmg; int x = 0, y = 0, sx = 0, sy = 0; E_Comp_Wl_Buffer *buffer; Eina_List *l; @@ -3044,13 +3043,6 @@ _e_comp_wl_remote_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *st state->frames); state->frames = NULL; - /* clear stored damages... */ - EINA_LIST_FREE(state->buffer_damages, dmg) - eina_rectangle_free(dmg); - - EINA_LIST_FREE(state->damages, dmg) - eina_rectangle_free(dmg); - state->buffer_viewport.changed = 0; wl_signal_emit(&cdata->state_commit_signal, &cdata->surface); diff --git a/src/bin/server/e_compositor.c b/src/bin/server/e_compositor.c index 49a7bbff05..ea53abaa36 100644 --- a/src/bin/server/e_compositor.c +++ b/src/bin/server/e_compositor.c @@ -621,6 +621,24 @@ e_surface_frame_done_send(E_Surface *surface) } } +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) { @@ -993,58 +1011,6 @@ _e_surface_pending_buffer_update(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) { @@ -1307,12 +1273,6 @@ _e_surface_pending_update(E_Surface *surface) 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); diff --git a/src/bin/server/e_compositor_intern.h b/src/bin/server/e_compositor_intern.h index 565f30f0ed..cf81934b99 100644 --- a/src/bin/server/e_compositor_intern.h +++ b/src/bin/server/e_compositor_intern.h @@ -6,6 +6,7 @@ #include "e_comp_wl_buffer_intern.h" #include +#include typedef struct _E_Surface E_Surface; typedef struct _E_Subsurface E_Subsurface; @@ -45,6 +46,8 @@ void e_surface_unmap(E_Surface *surface); Eina_Bool e_surface_is_mapped(E_Surface *surface); Eina_Bool e_surface_has_subsurfaces(E_Surface *surface); void e_surface_frame_done_send(E_Surface *surface); +pixman_region32_t *e_surface_buffer_damage_get(E_Surface *surface); +pixman_region32_t *e_surface_surface_damage_get(E_Surface *surface); E_Subsurface *e_subsurface_create(struct wl_resource *factory_resource, uint32_t id, E_Surface *surface, E_Surface *parent); E_Subsurface *e_subsurface_from_resource(struct wl_resource *resource); diff --git a/src/include/e_comp_wl.h b/src/include/e_comp_wl.h index 35ec8f4d9f..bb289a64a9 100644 --- a/src/include/e_comp_wl.h +++ b/src/include/e_comp_wl.h @@ -183,7 +183,8 @@ struct _E_Comp_Wl_Surface_State int bw, bh; E_Comp_Wl_Buffer *buffer; struct wl_listener buffer_destroy_listener; - Eina_List *damages, *buffer_damages, *frames; + EINA_DEPRECATED Eina_List *damages, *buffer_damages; + Eina_List *frames; Eina_Tiler *input, *opaque; E_Comp_Wl_Buffer_Viewport buffer_viewport; Eina_Bool new_attach : 1;