e_hwc_windows: call presentation callback in case of window is hidden 32/271332/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 15 Feb 2022 08:54:12 +0000 (17:54 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Fri, 18 Feb 2022 02:16:22 +0000 (11:16 +0900)
if window is hided, window is not exist in rendered windows list.
but presentation callback should be called when window is hidding(show->hide)
this patch makes presentation callback is taken to comp_info if
window is hidden.

Change-Id: Ibe22490df8ef0301ad38899281e69abaf8b08850

src/bin/e_hwc_window.c
src/bin/e_hwc_window.h
src/bin/e_hwc_windows.c

index 3176959b58986a43efb3ba151d3e32bbfcf8af1a..1b864cd3fc62db8438e7cbc327b829d163729109 100644 (file)
@@ -3010,6 +3010,7 @@ e_hwc_window_unref(E_Hwc_Window *hwc_window)
 EINTERN Eina_Bool
 e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback *callback)
 {
+   E_Hwc_Window_Target *target_hwc_window;
    E_Hwc *hwc;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
@@ -3017,6 +3018,9 @@ e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_P
    hwc = hwc_window->hwc;
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
+   target_hwc_window = hwc->target_hwc_window;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
    if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_NONE) ||
        (hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT))
      e_hwc_windows_target_window_force_render(hwc->target_hwc_window);
@@ -3027,18 +3031,76 @@ e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_P
         return EINA_FALSE;
      }
 
+   if (!eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+     {
+        target_hwc_window->pending_presentation_cb_wins =
+          eina_list_append(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+        e_hwc_window_ref(hwc_window);
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_hwc_window_presentation_callback_pending_take_over(E_Hwc_Window *hwc_window,
+                                                     E_Hwc_Presentation_Callback_List *dst_list)
+{
+   E_Hwc_Window_Target *target_hwc_window;
+   E_Hwc *hwc;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(dst_list, EINA_FALSE);
+
+   hwc = hwc_window->hwc;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+   target_hwc_window = hwc->target_hwc_window;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
+   if (eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+     {
+        target_hwc_window->pending_presentation_cb_wins =
+          eina_list_remove(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+        e_hwc_window_unref(hwc_window);
+     }
+
+   e_hwc_presentation_callback_list_merge(dst_list,
+                                          &hwc_window->pending_presentation_callbacks);
+
    return EINA_TRUE;
 }
 
 EINTERN Eina_Bool
 e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window,
-                                        E_Hwc_Presentation_Callback_List *list)
+                                        E_Hwc_Presentation_Callback_List *src_list)
 {
+   E_Hwc_Window_Target *target_hwc_window;
+   E_Hwc *hwc;
+
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(list, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(src_list, EINA_FALSE);
+
+   hwc = hwc_window->hwc;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
+
+   target_hwc_window = hwc->target_hwc_window;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
+
+   if (&hwc_window->presentation_callbacks == src_list)
+     {
+        if (eina_list_data_find(target_hwc_window->pending_presentation_cb_wins, hwc_window))
+          {
+             target_hwc_window->pending_presentation_cb_wins =
+               eina_list_remove(target_hwc_window->pending_presentation_cb_wins, hwc_window);
+
+             e_hwc_window_unref(hwc_window);
+          }
+     }
 
    e_hwc_presentation_callback_list_merge(&hwc_window->presentation_callbacks,
-                                          list);
+                                          src_list);
 
    return EINA_TRUE;
 }
index 90be3a4f263d7fec9f2d6f6e530d4618ac77402a..22796098c5fed079a2f6dfba7cac179c2e68fcfa 100644 (file)
@@ -187,6 +187,7 @@ struct _E_Hwc_Window_Target
    E_Egl_Sync         *end_render_sync;
 
    Eina_List          *present_sync_windows;
+   Eina_List          *pending_presentation_cb_wins;
 };
 
 struct _E_Hwc_Window_Commit_Data {
@@ -267,7 +268,8 @@ EINTERN Eina_Bool                 e_hwc_window_pending_update_data_dequeue_cance
 EINTERN Eina_Bool                 e_hwc_window_pending_update_data_has(E_Hwc_Window *hwc_window);
 
 EINTERN Eina_Bool                 e_hwc_window_presentation_callback_pending_set(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback *callback);
-EINTERN Eina_Bool                 e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *list);
+EINTERN Eina_Bool                 e_hwc_window_presentation_callback_pending_take_over(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *dst_list);
+EINTERN Eina_Bool                 e_hwc_window_presentation_callback_take(E_Hwc_Window *hwc_window, E_Hwc_Presentation_Callback_List *src_list);
 EINTERN Eina_Bool                 e_hwc_window_presentation_callback_call(E_Hwc_Window *hwc_window);
 
 #endif // E_HWC_WINDOW_H
index 7adb68e59f6effde0a56f7951998aad59ec78ab9..3e18311dbf21b8cb9b3d019842f313a4b24e903f 100644 (file)
@@ -1588,6 +1588,37 @@ _e_hwc_windows_target_window_queue_set(E_Hwc_Window_Target *target_hwc_window)
    return EINA_FALSE;
 }
 
+static Eina_Bool
+_e_hwc_windows_presentation_callback_comp_take_over(E_Hwc_Window_Target *root_target_hwc_window,
+                                                    E_Hwc_Windows_Comp_Info *comp_info)
+{
+   E_Hwc_Window_Target *target_hwc_window;
+   E_Hwc_Window *hwc_window;
+   E_Output *output;
+   Eina_List *l, *l2, *ll2;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(comp_info, EINA_FALSE);
+
+   EINA_LIST_FOREACH(e_comp->e_comp_screen->outputs, l, output)
+     {
+        if (!output->hwc) continue;
+
+        target_hwc_window = output->hwc->target_hwc_window;
+        if (!target_hwc_window) continue;
+
+        EINA_LIST_FOREACH_SAFE(target_hwc_window->pending_presentation_cb_wins, l2, ll2, hwc_window)
+          {
+             if (!hwc_window->render_target) continue;
+
+             e_hwc_window_presentation_callback_pending_take_over(hwc_window,
+                                                                  &comp_info->presentation_callbacks);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
 static void
 _e_hwc_windows_target_window_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -1677,6 +1708,7 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
      }
 
    _e_hwc_windows_pending_update_data_dequeue(target_hwc_window, comp_info);
+   _e_hwc_windows_presentation_callback_comp_take_over(target_hwc_window, comp_info);
 
    visible_windows = _e_hwc_windows_visible_windows_list_get(NULL);
    EINA_LIST_FREE(visible_windows, hwc_window)
@@ -1698,9 +1730,6 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
 
         hwc_window->on_rendered_target = EINA_FALSE;
 
-        e_hwc_presentation_callback_list_merge(&comp_info->presentation_callbacks,
-                                               &hwc_window->pending_presentation_callbacks);
-
         ec = hwc_window->ec;
         if (!ec) continue;
 
@@ -1757,7 +1786,7 @@ static void
 _e_hwc_windows_target_window_free(E_Hwc_Window_Target *target_hwc_window)
 {
    E_Hwc_Window *hwc_window = (E_Hwc_Window *)target_hwc_window;
-   E_Hwc_Window *present_sync_window;
+   E_Hwc_Window *present_sync_window, *presentation_cb_window;
 
    if (target_hwc_window->evas)
      {
@@ -1783,6 +1812,9 @@ _e_hwc_windows_target_window_free(E_Hwc_Window_Target *target_hwc_window)
    EINA_LIST_FREE(target_hwc_window->present_sync_windows, present_sync_window)
      e_hwc_window_unref(present_sync_window);
 
+   EINA_LIST_FREE(target_hwc_window->pending_presentation_cb_wins, presentation_cb_window)
+     e_hwc_window_unref(presentation_cb_window);
+
    if (hwc_window->queue && hwc_window->queue->tqueue)
      tbm_surface_queue_destroy(hwc_window->queue->tqueue);