e_compositor: Add {buffer,surface}_damage_get
authorSeunghun Lee <shiin.lee@samsung.com>
Tue, 20 Aug 2024 08:40:05 +0000 (17:40 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Thu, 29 Aug 2024 06:50:57 +0000 (15:50 +0900)
This patch deprecates `damages` and `buffer_damage` of
E_Comp_Wl_Surface_State.

src/bin/server/e_comp_wl.c
src/bin/server/e_comp_wl_rsm.c
src/bin/server/e_compositor.c
src/bin/server/e_compositor_intern.h
src/include/e_comp_wl.h

index 4cf7ef044cf473db990e42e500a06514b4ff7ff3..d43b1b5fcca0d12a3d1de14ebccdf52cc5133cf8 100644 (file)
@@ -2210,11 +2210,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)
@@ -2224,30 +2223,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
@@ -2618,17 +2606,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;
 
@@ -2908,8 +2889,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) &&
@@ -2925,31 +2912,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));
+                    }
+               }
 
              EINA_LIST_FREE(damages, dmg)
                {
index 21672e9a798d83c74a605d386c3fa37550f6bbdc..7a7d90c53895e4306f9b8f085840e666da58f9f2 100644 (file)
@@ -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);
index af9bb8ccc1fc02ecc690062b507baabb1e5e6270..f37d6fceaaf8f9e24dedadd81c21d54438df84bc 100644 (file)
@@ -620,6 +620,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)
 {
@@ -978,58 +996,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)
 {
@@ -1295,12 +1261,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);
 
index 8dcdf02852d13f62a558188027fd9b2b0087c5ba..d1b0f7e3674d33cde9ac7eae071b1c36157aa00a 100644 (file)
@@ -6,6 +6,7 @@
 #include "e_comp_wl_buffer_intern.h"
 
 #include <wayland-server.h>
+#include <pixman.h>
 
 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);
index 80459ab750f22b3d5715bb2d8bf8d6458f63b6ca..76e9f62553d5e91da061b42b520b626695bf3891 100644 (file)
@@ -179,7 +179,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;