e_hwc_windows: refactor updating the changes of hwc and hwc_window 14/306014/4
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 23 Jan 2024 05:36:52 +0000 (14:36 +0900)
committerchangyeon lee <cyeon.lee@samsung.com>
Mon, 19 Feb 2024 05:51:42 +0000 (05:51 +0000)
Previously, the changes hwc and hwc_window was updated in every idle time
if wait_commit is false.
For reducing usage of cpu, this patch makes the changes of hwc and hwc_window
is updated when property, restriction, buffer, visible, geometry are changed.

Change-Id: I0833d3838e70b5a980e572e6bc63df7c024e08a6

src/bin/e_hwc.c
src/bin/e_hwc.h
src/bin/e_hwc_window.c
src/bin/e_hwc_window.h
src/bin/e_hwc_windows.c
src/bin/e_hwc_windows.h
src/bin/video/iface/e_video_hwc_windows.c

index ba716c8024ad87b8d9f2541908c729834fe015b3..2186798c700dfbaced6b1e61bcd19367329e7385 100644 (file)
@@ -910,6 +910,8 @@ e_hwc_property_set(E_Hwc *hwc, unsigned int id, hwc_value value)
 
    hwc->property_changed = EINA_TRUE;
 
+   e_hwc_windows_changed_set(hwc, E_HWC_WINS_CHANGED_PROPERTY);
+
    ecore_event_add(E_EVENT_HWC_PROPERTY_CHANGED, NULL, NULL, NULL);
 
    EHINF("Set property id:%u value:%u", hwc, id, (unsigned int)value.u32);
index 51afe873dec7a989b459066bc1655d95fbf678f4..67dbed0e2d9536f8de027182cc425072d2f1730e 100644 (file)
@@ -215,6 +215,8 @@ struct _E_Hwc
    Eina_Bool            comp_override;
 
    unsigned int         restriction;
+   unsigned int         changed;
+   Eina_List           *changed_windows;
 };
 
 E_API extern int E_EVENT_HWC_ACTIVE;
index e93286729ab358b808b43c6edc561fe2e361e1ec..ebc6fae144cd49557d6e04f6100c4f49c4438d7e 100644 (file)
@@ -601,6 +601,82 @@ _e_hwc_window_free(E_Hwc_Window *hwc_window)
    E_FREE(hwc_window);
 }
 
+static void
+_e_hwc_window_obj_cb_show(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   hwc_window->evas_visible = EINA_TRUE;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
+static void
+_e_hwc_window_obj_cb_hide(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   hwc_window->evas_visible = EINA_FALSE;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
+static void
+_e_hwc_window_obj_cb_move(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+   if (hwc_window->hwc_visible)
+     {
+        if (!e_hwc_window_client_geometry_visible_get(hwc_window))
+          e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+     }
+   else
+     {
+        if ((hwc_window->evas_visible) && (e_hwc_window_client_geometry_visible_get(hwc_window)))
+          e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+     }
+}
+
+static void
+_e_hwc_window_obj_cb_resize(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+   if (hwc_window->hwc_visible)
+     {
+        if (!e_hwc_window_client_geometry_visible_get(hwc_window))
+          e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+     }
+   else
+     {
+        if ((hwc_window->evas_visible) && (e_hwc_window_client_geometry_visible_get(hwc_window)))
+          e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+     }
+}
+
+static void
+_e_hwc_window_obj_cb_restack(void *data, Evas *evas EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
+{
+   E_Hwc_Window *hwc_window;
+
+   if (!(hwc_window = data)) return;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
 static void
 _e_hwc_window_del(E_Hwc_Window *hwc_window)
 {
@@ -613,6 +689,22 @@ _e_hwc_window_del(E_Hwc_Window *hwc_window)
    ec = hwc_window->ec;
    EINA_SAFETY_ON_NULL_RETURN(ec);
 
+   evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+                                       _e_hwc_window_obj_cb_show,
+                                       hwc_window);
+   evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+                                       _e_hwc_window_obj_cb_hide,
+                                       hwc_window);
+   evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+                                       _e_hwc_window_obj_cb_move,
+                                       hwc_window);
+   evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
+                                       _e_hwc_window_obj_cb_resize,
+                                       hwc_window);
+   evas_object_event_callback_del_full(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+                                       _e_hwc_window_obj_cb_restack,
+                                       hwc_window);
+
    ec->hwc_window = NULL;
    hwc_window->ec = NULL;
    hwc_window->is_deleted = EINA_TRUE;
@@ -650,9 +742,14 @@ _e_hwc_window_del(E_Hwc_Window *hwc_window)
    if (hwc_window->color_set_listener.notify)
      wl_list_remove(&hwc_window->color_set_listener.link);
 
+   if (hwc_window->color_visible_set_listener.notify)
+     wl_list_remove(&hwc_window->color_visible_set_listener.link);
+
    e_hwc_window_below_transparent_obj_set(hwc_window, EINA_FALSE);
    e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
 
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
    e_object_del(E_OBJECT(hwc_window));
 }
 
@@ -889,6 +986,16 @@ _e_hwc_window_restriction_init(E_Hwc_Window *hwc_window)
    _e_hwc_window_commit_restriction_update(hwc_window);
 }
 
+static void
+_e_hwc_window_cb_color_visible_set(struct wl_listener *listener, void *data)
+{
+   E_Hwc_Window *hwc_window;
+
+   hwc_window = container_of(listener, E_Hwc_Window, color_visible_set_listener);
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
 static E_Hwc_Window *
 _e_hwc_window_new(E_Hwc *hwc, E_Client *ec, E_Hwc_Window_State state)
 {
@@ -949,6 +1056,28 @@ _e_hwc_window_new(E_Hwc *hwc, E_Client *ec, E_Hwc_Window_State state)
    hwc_window->color_set_listener.notify = _e_hwc_window_cb_color_set;
    e_comp_object_color_set_listener_add(ec->frame, &hwc_window->color_set_listener);
 
+   hwc_window->color_visible_set_listener.notify = _e_hwc_window_cb_color_visible_set;
+   e_comp_object_color_visible_set_listener_add(ec->frame, &hwc_window->color_visible_set_listener);
+
+   evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_SHOW,
+                                  _e_hwc_window_obj_cb_show,
+                                  hwc_window);
+   evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_HIDE,
+                                  _e_hwc_window_obj_cb_hide,
+                                  hwc_window);
+   evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_MOVE,
+                                  _e_hwc_window_obj_cb_move,
+                                  hwc_window);
+   evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESIZE,
+                                  _e_hwc_window_obj_cb_resize,
+                                  hwc_window);
+   evas_object_event_callback_add(hwc_window->ec->frame, EVAS_CALLBACK_RESTACK,
+                                  _e_hwc_window_obj_cb_restack,
+                                  hwc_window);
+
+   if (evas_object_visible_get(hwc_window->ec->frame))
+     e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
    EHWINF("is created on eout:%p, video:%d cursor:%d",
           hwc_window->ec, hwc_window->hwc, hwc_window, hwc->output,
           hwc_window->is_video, hwc_window->is_cursor);
@@ -1049,6 +1178,11 @@ _e_hwc_window_client_cb_transform_change(void *data EINA_UNUSED, E_Client *ec)
    else
      e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_TRANSFORM);
 
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY);
+
+   if ((hwc_window->hwc_visible) && (!e_hwc_window_client_geometry_visible_get(hwc_window)))
+     e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
    if (!e_comp_wl_video_subsurface_has(ec) && !e_comp_wl_normal_subsurface_has(ec))
      return;
 
@@ -1169,6 +1303,34 @@ _e_hwc_window_cb_surface_commit(void *data, E_Client *ec)
    _e_hwc_window_commit_restriction_update(ec->hwc_window);
 }
 
+static void
+_e_hwc_window_cb_buffer_change(void *data, E_Client *ec)
+{
+   E_Hwc_Window *hwc_window;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   hwc_window = ec->hwc_window;
+   if (!hwc_window) return;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER);
+}
+
+static void
+_e_hwc_window_cb_alpha_change(void *data, E_Client *ec)
+{
+   E_Hwc_Window *hwc_window;
+
+   EINA_SAFETY_ON_NULL_RETURN(ec);
+
+   hwc_window = ec->hwc_window;
+   if (!hwc_window) return;
+
+   if (!hwc_window->hwc_visible) return;
+
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+}
+
 static Eina_Bool
 _e_hwc_window_cb_update_lock_set(void *data, E_Client *ec)
 {
@@ -1192,6 +1354,7 @@ _e_hwc_window_cb_update_lock_unset(void *data, E_Client *ec)
    if (!hwc_window) return EINA_TRUE;
 
    e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_RENDER_UPDATE_LOCK);
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER | E_HWC_WINS_CHANGED_WIN_GEOMETRY);
 
    return EINA_TRUE;
 }
@@ -1205,6 +1368,7 @@ _e_hwc_window_cb_effect_start(void *data, E_Client *ec)
    if (!hwc_window) return EINA_TRUE;
 
    e_hwc_window_restriction_set(hwc_window, E_HWC_WINDOW_RESTRICTION_EFFECT);
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
 
    return EINA_TRUE;
 }
@@ -1218,6 +1382,7 @@ _e_hwc_window_cb_effect_end(void *data, E_Client *ec)
    if (!hwc_window) return EINA_TRUE;
 
    e_hwc_window_restriction_unset(hwc_window, E_HWC_WINDOW_RESTRICTION_EFFECT);
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
 
    return EINA_TRUE;
 }
@@ -1233,8 +1398,9 @@ _e_hwc_window_cb_pixmap_buffer_clear_done(void *data EINA_UNUSED, E_Pixmap *cp)
 
    hwc_window = ec->hwc_window;
    if (!hwc_window) return;
-   
+
    e_hwc_window_restriction_set(hwc_window, E_HWC_WINDOW_RESTRICTION_BUFFER);
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_BUFFER);
 }
 
 EINTERN Eina_Bool
@@ -1250,6 +1416,10 @@ e_hwc_window_init(void)
                          _e_hwc_window_cb_subsurface_synchronized_commit, NULL);
    E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_CLIENT_SURFACE_COMMIT,
                          _e_hwc_window_cb_surface_commit, NULL);
+   E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_BUFFER_CHANGE,
+                         _e_hwc_window_cb_buffer_change, NULL);
+   E_COMP_WL_HOOK_APPEND(hwc_window_comp_wl_hooks, E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE,
+                         _e_hwc_window_cb_alpha_change, NULL);
    E_PIXMAP_HOOK_APPEND(hwc_window_pixmap_hooks, E_PIXMAP_HOOK_BUFFER_CLEAR_DONE,
                         _e_hwc_window_cb_pixmap_buffer_clear_done, NULL);
    E_COMP_COMP_HOOK_APPEND(hwc_window_comp_object_hooks, E_COMP_OBJECT_HOOK_RENDER_UPDATE_LOCK_SET,
@@ -2343,6 +2513,8 @@ e_hwc_window_restriction_set(E_Hwc_Window *hwc_window, E_Hwc_Window_Restriction
 
    hwc_window->restriction |= restriction;
 
+   e_hwc_windows_changed_set(hwc_window->hwc, E_HWC_WINS_CHANGED_WIN_RESTRICTION);
+
    EHWTRACE("restriction set:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, restriction);
 }
 
@@ -2355,6 +2527,8 @@ e_hwc_window_restriction_unset(E_Hwc_Window *hwc_window, E_Hwc_Window_Restrictio
 
    hwc_window->restriction &= ~restriction;
 
+   e_hwc_windows_changed_set(hwc_window->hwc, E_HWC_WINS_CHANGED_WIN_RESTRICTION);
+
    EHWTRACE("restriction unset:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, restriction);
 }
 
@@ -2710,6 +2884,8 @@ e_hwc_window_set_property(E_Hwc_Window *hwc_window, unsigned int id, const char
                  hwc_window->ec, hwc_window->hwc, hwc_window,
                  prop->name, (unsigned int)value.u32,
                  e_hwc_window_name_get(hwc_window));
+
+        e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_PROPERTY);
      }
 
    return EINA_TRUE;
@@ -3357,5 +3533,87 @@ e_hwc_window_visible_skip_set(E_Hwc_Window *hwc_window, Eina_Bool set)
 
    hwc_window->visible_skip = set;
 
+   e_hwc_window_changed_set(hwc_window, E_HWC_WINS_CHANGED_WIN_VISIBLE);
+
+   return EINA_TRUE;
+}
+
+EINTERN void
+e_hwc_window_changed_set(E_Hwc_Window *hwc_window, E_Hwc_Wins_Changed changed)
+{
+   EINA_SAFETY_ON_NULL_RETURN(hwc_window);
+   EINA_SAFETY_ON_NULL_RETURN(hwc_window->hwc);
+
+   e_hwc_windows_changed_set(hwc_window->hwc, changed);
+
+   if (hwc_window->changed & changed) return;
+
+   if (!hwc_window->changed)
+     {
+        hwc_window->hwc->changed_windows = eina_list_append(hwc_window->hwc->changed_windows, hwc_window);
+        e_hwc_window_ref(hwc_window);
+     }
+
+   hwc_window->changed |= changed;
+
+   EHWTRACE("changed set:0x%x", hwc_window->ec, hwc_window->hwc, hwc_window, changed);
+}
+
+EINTERN Eina_Bool
+e_hwc_window_changed_get(E_Hwc_Window *hwc_window)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+   return hwc_window->changed;
+}
+
+EINTERN void
+e_hwc_window_changed_clear(E_Hwc_Window *hwc_window)
+{
+   EINA_SAFETY_ON_NULL_RETURN(hwc_window);
+
+   if (hwc_window->changed == E_HWC_WINS_CHANGED_NONE)
+     return;
+
+   hwc_window->changed = E_HWC_WINS_CHANGED_NONE;
+}
+
+EINTERN Eina_Bool
+e_hwc_window_client_geometry_visible_get(E_Hwc_Window *hwc_window)
+{
+   E_Client *ec;
+   int x, y, w, h;
+   int ee_w, ee_h;
+   int x1, x2, y1, y2;
+   E_Map *map;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+   ec = hwc_window->ec;
+   if (!ec) return EINA_FALSE;
+
+   ecore_evas_geometry_get(e_comp->ee, NULL, NULL, &ee_w, &ee_h);
+   evas_object_geometry_get(ec->frame, &x, &y, &w, &h);
+
+   if ((ec->is_cursor) && (evas_object_map_enable_get(ec->frame)))
+     {
+        map = e_client_map_get(ec);
+        if (map)
+          {
+             e_map_point_coord_get(map, 0, &x1, &y1, NULL);
+             e_map_point_coord_get(map, 2, &x2, &y2, NULL);
+
+             x = MIN(x1, x2);
+             y = MIN(y1, y2);
+             w = MAX(x1, x2) - x;
+             h = MAX(y1, y2) - y;
+
+             e_map_free(map);
+          }
+     }
+
+   if (!E_INTERSECTS(0, 0, ee_w, ee_h, x, y, w, h))
+     return EINA_FALSE;
+
    return EINA_TRUE;
 }
index 094faffc5e9ea95ae3f3deb2caa96c1983a0c27c..a1ce1c616fc710ef5ab30d76c3e940198d6299fe 100644 (file)
@@ -18,6 +18,18 @@ typedef void (*E_Hwc_Window_Hook_Cb) (void *data, E_Hwc_Window *hwc_window);
 #define EHW_C(b,m)              (b ? ((b) >> (m)) & 0xFF : ' ')
 #define EHW_FOURCC_STR(id)      EHW_C(id,0), EHW_C(id,8), EHW_C(id,16), EHW_C(id,24)
 
+typedef enum
+{
+   E_HWC_WINS_CHANGED_NONE = 0,
+   E_HWC_WINS_CHANGED_PROPERTY = (1 << 0),
+   E_HWC_WINS_CHANGED_RISTRICTION = (1 << 1),
+   E_HWC_WINS_CHANGED_WIN_VISIBLE = (1 << 2),
+   E_HWC_WINS_CHANGED_WIN_BUFFER = (1 << 3),
+   E_HWC_WINS_CHANGED_WIN_GEOMETRY = (1 << 4),
+   E_HWC_WINS_CHANGED_WIN_RESTRICTION = (1 << 5),
+   E_HWC_WINS_CHANGED_WIN_PROPERTY = (1 << 6),
+} E_Hwc_Wins_Changed;
+
 typedef enum _E_Hwc_Window_State
 {
    E_HWC_WINDOW_STATE_NONE,
@@ -175,6 +187,12 @@ struct _E_Hwc_Window
    struct wl_listener             render_op_set_listener;
    struct wl_listener             content_type_set_listener;
    struct wl_listener             color_set_listener;
+   struct wl_listener             color_visible_set_listener;
+
+   Eina_Bool                      evas_visible;
+   Eina_Bool                      hwc_visible;
+
+   Eina_Bool                      changed;
 };
 
 struct _E_Hwc_Window_Target
@@ -287,5 +305,11 @@ EINTERN void                      e_hwc_window_restriction_set(E_Hwc_Window *hwc
 EINTERN void                      e_hwc_window_restriction_unset(E_Hwc_Window *hwc_window, E_Hwc_Window_Restriction restriction);
 EINTERN unsigned int              e_hwc_window_restriction_get(E_Hwc_Window *hwc_window);
 
+EINTERN void                      e_hwc_window_changed_set(E_Hwc_Window *hwc_window, E_Hwc_Wins_Changed cahnged);
+EINTERN Eina_Bool                 e_hwc_window_changed_get(E_Hwc_Window *hwc_window);
+EINTERN void                      e_hwc_window_changed_clear(E_Hwc_Window *hwc_window);
+
+EINTERN Eina_Bool                 e_hwc_window_client_geometry_visible_get(E_Hwc_Window *hwc_window);
+
 #endif // E_HWC_WINDOW_H
 #endif
index 1a996e25885072b22486fa80714bdccf39d9a2d7..eff92c90586f392a0e3f2e87edbed4f9384183cc 100644 (file)
@@ -898,11 +898,10 @@ _e_hwc_windows_visible_windows_list_get(E_Hwc *hwc)
    E_Zone *zone;
    Evas_Object *o;
    int ee_w, ee_h;
-   int x, y, w, h, x1, x2, y1, y2;
+   int x, y, w, h;
    int ui_skip = EINA_FALSE;
    Eina_Bool effect_client;
    Evas_Render_Op render_op;
-   E_Map *map;
    Eina_Bool qps_visible;
 
    ecore_evas_geometry_get(e_comp->ee, NULL, NULL, &ee_w, &ee_h);
@@ -954,23 +953,6 @@ _e_hwc_windows_visible_windows_list_get(E_Hwc *hwc)
 
         e_client_geometry_get(ec, &x, &y, &w, &h);
 
-        if ((ec->is_cursor) && (evas_object_map_enable_get(ec->frame)))
-          {
-             map = e_client_map_get(ec);
-             if (map)
-               {
-                  e_map_point_coord_get(map, 0, &x1, &y1, NULL);
-                  e_map_point_coord_get(map, 2, &x2, &y2, NULL);
-                  
-                  x = MIN(x1, x2);
-                  y = MIN(y1, y2);
-                  w = MAX(x1, x2) - x;
-                  h = MAX(y1, y2) - y;
-
-                  e_map_free(map);
-               }
-          }
-
         if ((!effect_client) && (!e_comp_object_color_visible_get(ec->frame)))
           {
              e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
@@ -988,7 +970,7 @@ _e_hwc_windows_visible_windows_list_get(E_Hwc *hwc)
           }
 
         // check geometry if located out of screen such as quick panel
-        if (!E_INTERSECTS(0, 0, ee_w, ee_h, x, y, w, h))
+        if (!e_hwc_window_client_geometry_visible_get(hwc_window))
           {
              e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
              continue;
@@ -2192,7 +2174,10 @@ _e_hwc_windows_visible_windows_update(E_Hwc *hwc)
   if (eina_list_count(hwc->visible_windows))
     {
        EINA_LIST_FREE(hwc->visible_windows, hwc_window)
-         e_hwc_window_unref(hwc_window);
+         {
+            hwc_window->hwc_visible = EINA_FALSE;
+            e_hwc_window_unref(hwc_window);
+         }
     }
 
    /* store the current visible windows and the number of them */
@@ -2203,6 +2188,7 @@ _e_hwc_windows_visible_windows_update(E_Hwc *hwc)
    EINA_LIST_REVERSE_FOREACH(hwc->visible_windows, l, hwc_window)
      {
         /* assign zpos */
+        hwc_window->hwc_visible = EINA_TRUE;
         e_hwc_window_zpos_set(hwc_window, zpos++);
         e_hwc_window_ref(hwc_window);
      }
@@ -2262,42 +2248,41 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
 {
    E_Hwc_Window *hwc_window;
    Eina_Bool update_changes = EINA_FALSE;
-   const Eina_List *l, *ll;
+   unsigned int changed;
 
-   if (hwc->property_changed)
+   changed = e_hwc_windows_changed_get(hwc);
+   if (changed)
+     update_changes = EINA_TRUE;
+
+   if (changed & E_HWC_WINS_CHANGED_WIN_VISIBLE)
      {
-        hwc->property_changed = EINA_FALSE;
-        update_changes = EINA_TRUE;
+        if (_e_hwc_windows_visible_windows_update(hwc))
+          update_changes = EINA_TRUE;
      }
 
-   /* update the the visible windows */
-   if (_e_hwc_windows_visible_windows_update(hwc))
-     update_changes = EINA_TRUE;
-
-   EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
+   EINA_LIST_FREE(hwc->changed_windows, hwc_window)
      {
-        if (e_hwc_window_is_target(hwc_window)) continue;
+        if (changed & E_HWC_WINS_CHANGED_WIN_BUFFER)
+          {
+             if (e_hwc_window_buffer_fetch(hwc_window))
+               update_changes = EINA_TRUE;
+          }
 
-        /* fetch the window buffer */
-        if (e_hwc_window_buffer_fetch(hwc_window))
-          update_changes = EINA_TRUE;
-        else
+        if ((changed & E_HWC_WINS_CHANGED_WIN_BUFFER) ||
+            (changed & E_HWC_WINS_CHANGED_WIN_GEOMETRY))
           {
-             /* sometimes client add frame cb without buffer attach */
-             if ((hwc_window->ec) &&
-                 (hwc_window->ec->pixmap) &&
-                 (e_pixmap_type_get(hwc_window->ec->pixmap) == E_PIXMAP_TYPE_WL) &&
-                 (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE))
-               e_pixmap_image_clear(hwc_window->ec->pixmap, 1);
+             if (e_hwc_window_info_update(hwc_window))
+               update_changes = EINA_TRUE;
           }
 
-        /* update the window's info */
-        if (e_hwc_window_info_update(hwc_window))
-          update_changes = EINA_TRUE;
+        if (changed & E_HWC_WINS_CHANGED_WIN_PROPERTY)
+          {
+             if (e_hwc_window_prop_update(hwc_window))
+               update_changes = EINA_TRUE;
+          }
 
-        /* update the window's props */
-        if (e_hwc_window_prop_update(hwc_window))
-          update_changes = EINA_TRUE;
+        e_hwc_window_changed_clear(hwc_window);
+        e_hwc_window_unref(hwc_window);
      }
 
    if (hwc->primary_output)
@@ -2320,6 +2305,8 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
         _e_hwc_windows_visible_windows_states_update(hwc);
      }
 
+   e_hwc_windows_changed_clear(hwc);
+
    return update_changes;
 }
 
@@ -4132,6 +4119,37 @@ e_hwc_windows_presentation_time_feedback_and_callback_take(E_Hwc *hwc, tbm_surfa
      }
 }
 
+EINTERN void
+e_hwc_windows_changed_set(E_Hwc *hwc, E_Hwc_Wins_Changed changed)
+{
+   EINA_SAFETY_ON_NULL_RETURN(hwc);
+
+   if (hwc->changed & changed) return;
+
+   hwc->changed |= changed;
+
+   EHWSTRACE("changed set:0x%x", NULL, hwc, changed);
+}
+
+EINTERN Eina_Bool
+e_hwc_windows_changed_get(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+   return hwc->changed;
+}
+
+EINTERN void
+e_hwc_windows_changed_clear(E_Hwc *hwc)
+{
+   EINA_SAFETY_ON_NULL_RETURN(hwc);
+
+   if (hwc->changed == E_HWC_WINS_CHANGED_NONE)
+     return;
+
+   hwc->changed = E_HWC_WINS_CHANGED_NONE;
+}
+
 EINTERN void
 e_hwc_windows_comp_override_set(E_Hwc *hwc, Eina_Bool set)
 {
@@ -4156,6 +4174,8 @@ e_hwc_windows_restriction_set(E_Hwc *hwc, E_Hwc_Windows_Restriction restriction)
 
    hwc->restriction |= restriction;
 
+   e_hwc_windows_changed_set(hwc, E_HWC_WINS_CHANGED_RISTRICTION);
+
    EHWSTRACE("restriction set:0x%x", NULL, hwc, restriction);
 }
 
@@ -4168,6 +4188,8 @@ e_hwc_windows_restriction_unset(E_Hwc *hwc, E_Hwc_Windows_Restriction restrictio
 
    hwc->restriction &= ~restriction;
 
+   e_hwc_windows_changed_set(hwc, E_HWC_WINS_CHANGED_RISTRICTION);
+
    EHWSTRACE("restriction set:0x%x", NULL, hwc, restriction);
 }
 
index 7c6b52b00f93fc45ed3b1f1792a95860b48f5203..3b859e98ebd2b4188f1994090798b8daa44d3bdc 100644 (file)
@@ -79,6 +79,10 @@ EINTERN void                 e_hwc_windows_pp_unset(E_Hwc *hwc);
 
 EINTERN void                 e_hwc_windows_presentation_time_feedback_and_callback_take(E_Hwc *hwc, tbm_surface_h tsurface);
 
+EINTERN void                 e_hwc_windows_changed_set(E_Hwc *hwc, E_Hwc_Wins_Changed cahnged);
+EINTERN Eina_Bool            e_hwc_windows_changed_get(E_Hwc *hwc);
+EINTERN void                 e_hwc_windows_changed_clear(E_Hwc *hwc);
+
 EINTERN void                 e_hwc_windows_comp_override_set(E_Hwc *hwc, Eina_Bool set);
 
 EINTERN void                 e_hwc_windows_restriction_set(E_Hwc *hwc, E_Hwc_Windows_Restriction restriction);
index f0258dede0fb54934a8a3420d120f045c9198e0e..9136309a0aa1bb981f4fc97c34607b080cee6e41 100644 (file)
@@ -77,6 +77,8 @@ end:
     * frame buffer. */
    evhw->commit_data.wait_release = EINA_TRUE;
 
+   e_hwc_window_changed_set(evhw->hwc_window, E_HWC_WINS_CHANGED_WIN_GEOMETRY|E_HWC_WINS_CHANGED_WIN_BUFFER);
+
    DBG("Client(%s):PID(%d), Buffer(%p, refcnt:%d) is shown."
        "Geometry details are : buffer size(%dx%d) src(%d,%d, %dx%d)"
        " dst(%d,%d, %dx%d), transform(%d)",