e_hwc_windows: remove rendered_windows in the E_Hwc_Windows_Comp_Info 02/306202/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 10 Jan 2024 11:24:55 +0000 (20:24 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Mon, 19 Feb 2024 04:12:41 +0000 (13:12 +0900)
use e_hwc_windows_present_sync for sychronizing gl and hwc compositing

Change-Id: Iecd09fa3be23aa00fa23aca05bef5edf2de20c21

src/bin/e_hwc_window.c
src/bin/e_hwc_window_intern.h
src/bin/e_hwc_windows.c
src/include/e_hwc.h
src/include/e_hwc_window.h

index b31638e..ab83cde 100644 (file)
@@ -322,6 +322,8 @@ _e_hwc_window_buffer_queue_unset(E_Hwc_Window *hwc_window)
 EINTERN void
 e_hwc_window_constraints_reset(E_Hwc_Window *hwc_window)
 {
+   if (hwc_window->is_target) return;
+
    _e_hwc_window_buffer_queue_unset(hwc_window);
 
    hwc_window->constraints = TDM_HWC_WIN_CONSTRAINT_NONE;
@@ -2029,6 +2031,10 @@ e_hwc_window_state_set(E_Hwc_Window *hwc_window, E_Hwc_Window_State state, Eina_
 
    if (hwc_window->state == state) return EINA_TRUE;
 
+   if (((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) && (state == E_HWC_WINDOW_STATE_CLIENT)) ||
+       ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) && (state == E_HWC_WINDOW_STATE_NONE)))
+     e_hwc_window_constraints_reset(hwc_window);
+
    hwc_window->state = state;
 
    /* update the composition type */
@@ -2334,39 +2340,6 @@ finish:
 }
 
 EINTERN Eina_Bool
-e_hwc_window_transition_set(E_Hwc_Window *hwc_window, E_Hwc_Window_Transition transition)
-{
-   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
-
-   if (hwc_window->transition == transition) return EINA_TRUE;
-
-   hwc_window->transition = transition;
-
-   if (transition == E_HWC_WINDOW_TRANSITION_NONE_TO_NONE)
-     hwc_window->transition_failures = 0;
-
-   if ((transition == E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT) ||
-       (transition == E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE))
-     e_hwc_window_constraints_reset(hwc_window);
-
-   if (transition)
-     EHWINF(" [%s] is on TRANSITION [%s -> %s]",
-            hwc_window->ec, hwc_window->hwc, hwc_window, e_hwc_window_name_get(hwc_window),
-            e_hwc_window_state_string_get(hwc_window->accepted_state),
-            e_hwc_window_state_string_get(hwc_window->state));
-
-   return EINA_TRUE;
-}
-
-EINTERN E_Hwc_Window_Transition
-e_hwc_window_transition_get(E_Hwc_Window *hwc_window)
-{
-   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, E_HWC_WINDOW_STATE_NONE);
-
-   return hwc_window->transition;
-}
-
-EINTERN Eina_Bool
 e_hwc_window_constraints_update(E_Hwc_Window *hwc_window)
 {
    tdm_error terror;
@@ -2504,6 +2477,8 @@ _e_hwc_window_rendered_window_set(E_Hwc_Window *hwc_window, Eina_Bool set)
              if (!ret)
                e_comp_object_render_update_del(ec->frame);
 
+             e_hwc_windows_present_sync(hwc_window->hwc);
+
              EHWTRACE("Redirect - {%s}",
                       hwc_window->ec, hwc_window->hwc, hwc_window, e_hwc_window_name_get(hwc_window));
           }
@@ -2517,6 +2492,8 @@ _e_hwc_window_rendered_window_set(E_Hwc_Window *hwc_window, Eina_Bool set)
           {
              e_comp_object_redirected_set(ec->frame, EINA_FALSE);
 
+             e_hwc_windows_present_sync(hwc_window->hwc);
+
              EHWTRACE("Unredirect - {%s}",
                       hwc_window->ec, hwc_window->hwc, hwc_window, e_hwc_window_name_get(hwc_window));
           }
@@ -2605,44 +2582,6 @@ e_hwc_window_state_string_get(E_Hwc_Window_State hwc_window_state)
 }
 
 EINTERN const char*
-e_hwc_window_transition_string_get(E_Hwc_Window_Transition transition)
-{
-   switch (transition)
-    {
-     case E_HWC_WINDOW_TRANSITION_NONE_TO_NONE:
-       return "NOtoNO";
-     case E_HWC_WINDOW_TRANSITION_NONE_TO_CLIENT:
-       return "NOtoCL";
-     case E_HWC_WINDOW_TRANSITION_NONE_TO_DEVICE:
-       return "NOtoDV";
-     case E_HWC_WINDOW_TRANSITION_NONE_TO_CURSOR:
-       return "NOtoCS";
-     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE:
-       return "CLtoNO";
-     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_CLIENT:
-       return "CLtoCL";
-     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_DEVICE:
-       return "CLtoDV";
-     case E_HWC_WINDOW_TRANSITION_CLIENT_TO_CURSOR:
-       return "CLtoCS";
-     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE:
-       return "DVtoNO";
-     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT:
-       return "DVtoCL";
-     case E_HWC_WINDOW_TRANSITION_DEVICE_TO_DEVICE:
-       return "DVtoDV";
-     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_NONE:
-       return "CStoNO";
-     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_CLIENT:
-       return "CStoCL";
-     case E_HWC_WINDOW_TRANSITION_CURSOR_TO_CURSOR:
-       return "CStoCS";
-     default:
-       return "UNKNOWN";
-    }
-}
-
-EINTERN const char*
 e_hwc_window_restriction_string_get(E_Hwc_Window *hwc_window)
 {
    if (!hwc_window) return "UNKNOWN";
index 759c619..b155ad3 100644 (file)
@@ -62,9 +62,6 @@ EINTERN Eina_Bool               e_hwc_window_accepted_state_set(E_Hwc_Window *hw
 EINTERN E_Hwc_Window_State      e_hwc_window_accepted_state_get(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_device_state_available_update(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_device_state_available_get(E_Hwc_Window *hwc_window);
-EINTERN Eina_Bool               e_hwc_window_transition_set(E_Hwc_Window *hwc_window, E_Hwc_Window_Transition transition);
-EINTERN E_Hwc_Window_Transition e_hwc_window_transition_get(E_Hwc_Window *hwc_window);
-EINTERN const char*             e_hwc_window_transition_string_get(E_Hwc_Window_Transition transition);
 EINTERN const char*             e_hwc_window_restriction_string_get(E_Hwc_Window *hwc_window);
 
 EINTERN Eina_Bool               e_hwc_window_constraints_update(E_Hwc_Window *hwc_window);
index 59f2f2b..bf727be 100644 (file)
@@ -25,7 +25,6 @@
 #define E_HWC_WINDOW_COMMIT_HANDLER_LOG_TIMEOUT 5.0
 
 #define DBG_EVALUATE 1
-#define DEFAULT_MAX_TRANSITION_FAILURES 3;
 
 #ifndef CLEAR
 #define CLEAR(x) memset(&(x), 0, sizeof (x))
@@ -72,7 +71,6 @@ struct _E_Hwc_Windows_Comp_Info
 
    E_Comp_Wl_Tizen_Hwc_Feedback_List feedback_list;
 
-   Eina_List *rendered_windows;
    Eina_List *rendered_buffers;
 };
 
@@ -219,29 +217,6 @@ _e_hwc_windows_comp_info_rendered_buffers_set(E_Hwc_Windows_Comp_Info *comp_info
 }
 
 static void
-_e_hwc_windows_comp_info_rendered_windows_set(E_Hwc_Windows_Comp_Info *comp_info,
-                                              Eina_List *rendered_windows)
-{
-   E_Hwc_Window *hwc_window;
-
-   EINA_SAFETY_ON_NULL_RETURN(comp_info);
-
-   if (comp_info->rendered_windows == rendered_windows)
-     return;
-
-   if (comp_info->rendered_windows)
-     {
-        if (eina_list_count(comp_info->rendered_windows))
-          {
-             EINA_LIST_FREE(comp_info->rendered_windows, hwc_window)
-               e_hwc_window_unref(hwc_window);
-          }
-     }
-
-   comp_info->rendered_windows = rendered_windows;
-}
-
-static void
 _e_hwc_windows_comp_info_free(void *data EINA_UNUSED, void *event)
 {
    E_Hwc_Windows_Comp_Info *comp_info;
@@ -253,7 +228,6 @@ _e_hwc_windows_comp_info_free(void *data EINA_UNUSED, void *event)
    EINA_LIST_FREE(comp_info->pending_update_list, update)
      e_hwc_window_pending_update_data_dequeue_cancel(update->hwc_window, update);
 
-   _e_hwc_windows_comp_info_rendered_windows_set(comp_info, NULL);
    _e_hwc_windows_comp_info_rendered_buffers_set(comp_info, NULL);
 
    e_presentation_time_container_finish(&comp_info->presentation_container);
@@ -395,10 +369,6 @@ _e_hwc_windows_commit_data_release(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_c
                                                         tv_usec);
         e_hwc_window_presentation_callback_call(hwc_window);
 
-        /* it is possible that other hwc_window is freed in
-         * _e_hwc_windows_rendered_windows_free.
-         * we must don't call commit_data_release of target_window in list.
-         */
         e_hwc_window_commit_data_release(hwc_window, wins_commit_data->target_commit_data);
      }
 
@@ -595,10 +565,6 @@ _e_hwc_windows_offscreen_commit(E_Hwc *hwc)
              e_hwc_window_presentation_time_feedback_discard(hwc_window_target);
              e_hwc_window_presentation_callback_call(hwc_window_target);
 
-             /* it is possible that other hwc_window is freed in
-              * _e_hwc_windows_rendered_windows_free.
-              * we must don't call commit_data_release of target_window in list.
-              */
              EHWSTRACE("!!!!!!!! HWC OffScreen Commit !!!!!!!!", NULL, hwc);
              e_hwc_window_commit_data_release(hwc_window_target, commit_data);
           }
@@ -638,19 +604,6 @@ _e_hwc_windows_offscreen_commit(E_Hwc *hwc)
      }
 }
 
-static Eina_List *
-_e_hwc_windows_target_window_rendered_windows_get(tbm_surface_h target_tsurface)
-{
-   E_Hwc_Windows_Comp_Info *comp_info;
-
-   if (!target_tsurface) return NULL;
-
-   comp_info = _e_hwc_windows_comp_info_get(target_tsurface);
-   if (!comp_info) return NULL;
-
-   return comp_info->rendered_windows;
-}
-
 EINTERN void
 e_hwc_windows_target_window_force_render(E_Hwc_Window_Target *target_hwc_window)
 {
@@ -734,15 +687,11 @@ static Eina_Bool
 _e_hwc_windows_root_target_buffer_fetch(E_Hwc *hwc)
 {
    E_Hwc_Window_Target *target_hwc_window;
-   E_Hwc_Window *hwc_window, *hw;
+   E_Hwc_Window *hwc_window;
    tbm_surface_h tsurface;
-   Eina_List *rendered_windows;
    E_Hwc_Window_Queue_Buffer *queue_buffer;
    E_Hwc_Windows_Comp_Info *comp_info;
    E_Hwc_Window_Queue *queue;
-   uint32_t n_thw = 0;
-   const Eina_List *l;
-   int i;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
@@ -783,31 +732,6 @@ _e_hwc_windows_root_target_buffer_fetch(E_Hwc *hwc)
         e_hwc_window_queue_buffer_reference(&hwc_window->current.queue_buffer_ref, queue_buffer);
         e_hwc_window_buffer_set(&hwc_window->current.buffer, tsurface, queue, 0);
         e_hwc_window_info_update(hwc_window);
-
-        if (ehws_trace)
-          {
-             rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(hwc_window->current.buffer.tsurface);
-             n_thw = eina_list_count(rendered_windows);
-             if (n_thw)
-               {
-                  EHWSTRACE("FET {%s} ts:%p state:%s has hwc_windows to render below",
-                           NULL, hwc, e_hwc_window_name_get(hwc_window), hwc_window->current.buffer.tsurface,
-                           e_hwc_window_state_string_get(hwc_window->state));
-
-                  i = 0;
-                  EINA_LIST_FOREACH(rendered_windows, l, hw)
-                    {
-                       EHWSTRACE("  (%d) ehw:%p ts:%p - {%s} state:%s zpos:%d deleted:%s",
-                                hwc_window->ec, hwc, i++, hw, hw->current.buffer.tsurface, e_hwc_window_name_get(hw),
-                                e_hwc_window_state_string_get(hw->state), hwc_window->zpos,
-                                (hwc_window->is_deleted ? "yes" : "no"));
-                    }
-                }
-              else
-                EHWSTRACE("FET {%s} ts:%p state:%s has no hwc_windows to render",
-                         NULL, hwc, e_hwc_window_name_get(hwc_window), hwc_window->current.buffer.tsurface,
-                         e_hwc_window_state_string_get(hwc_window->state));
-          }
      }
    else
      {
@@ -914,142 +838,6 @@ _e_hwc_windows_target_buffer_fetch(E_Hwc *hwc)
    return EINA_TRUE;
 }
 
-static Eina_Bool
-_e_hwc_windows_target_window_rendered_windows_find(Eina_List *rendered_windows, E_Hwc_Window *hwc_window)
-{
-   E_Hwc_Window *hw;
-   int n_thw;
-   const Eina_List *l;
-
-   if (!rendered_windows) return EINA_FALSE;
-   if (!hwc_window) return EINA_FALSE;
-
-   n_thw = eina_list_count(rendered_windows);
-   if (!n_thw) return EINA_FALSE;
-
-   EINA_LIST_FOREACH(rendered_windows, l, hw)
-     {
-       if (hw == hwc_window)
-         return EINA_TRUE;
-     }
-
-   return EINA_FALSE;
-}
-
-static Eina_Bool
-_e_hwc_windows_target_window_rendered_window_has_no(E_Hwc *hwc, E_Hwc_Window *hwc_window, Eina_Bool all_target)
-{
-   Eina_List *rendered_windows;
-   E_Hwc_Window_Target *target_hwc_window, *root_target_hwc_window;
-   E_Hwc_Window *target_window;
-   tbm_surface_h target_tsurface;
-   const Eina_List *l;
-
-   target_hwc_window = hwc->target_hwc_window;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
-
-   root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
-
-   target_window = (E_Hwc_Window *)target_hwc_window;
-   if (e_hwc_window_state_get(target_window) != E_HWC_WINDOW_STATE_DEVICE) return EINA_FALSE;
-
-   target_tsurface = target_hwc_window->hwc_window.current.buffer.tsurface;
-   if (!target_tsurface) return EINA_FALSE;
-
-   if (all_target)
-     {
-        rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-        if (!_e_hwc_windows_target_window_rendered_windows_find(rendered_windows, hwc_window))
-          return EINA_TRUE;
-
-        EINA_LIST_FOREACH(root_target_hwc_window->rendering_tsurfaces, l, target_tsurface)
-          {
-             rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-             if (!_e_hwc_windows_target_window_rendered_windows_find(rendered_windows, hwc_window))
-               return EINA_TRUE;
-          }
-     }
-   else
-     {
-        rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-        if (!_e_hwc_windows_target_window_rendered_windows_find(rendered_windows, hwc_window))
-          return EINA_TRUE;
-     }
-
-   return EINA_FALSE;
-}
-
-static Eina_Bool
-_e_hwc_windows_target_window_rendered_window_has(E_Hwc *hwc, E_Hwc_Window *hwc_window, Eina_Bool all_target)
-{
-   Eina_List *rendered_windows, *new_list;
-   E_Hwc_Window_Target *target_hwc_window, *root_target_hwc_window;;
-   E_Hwc_Window *target_window;
-   E_Hwc_Window *hw;
-   tbm_surface_h target_tsurface;
-   const Eina_List *l, *ll;
-   int n_thw;
-
-   target_hwc_window = hwc->target_hwc_window;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
-
-   root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
-
-   target_window = (E_Hwc_Window *)target_hwc_window;
-   if (e_hwc_window_state_get(target_window) != E_HWC_WINDOW_STATE_DEVICE) return EINA_FALSE;
-
-   target_tsurface = target_hwc_window->hwc_window.current.buffer.tsurface;
-   if (!target_tsurface) return EINA_FALSE;
-
-   if (all_target)
-     {
-        rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-
-        new_list = eina_list_clone(rendered_windows);
-
-        EINA_LIST_FOREACH(root_target_hwc_window->rendering_tsurfaces, l, target_tsurface)
-          {
-             rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-
-             EINA_LIST_FOREACH(rendered_windows, ll, hw)
-               {
-                  if (!eina_list_data_find(new_list, hw))
-                    new_list = eina_list_append(new_list, hw);
-               }
-          }
-
-        n_thw = eina_list_count(new_list);
-        if (n_thw)
-          {
-             EINA_LIST_FOREACH(new_list, l, hw)
-               {
-                  if (hw == hwc_window)
-                    {
-                       eina_list_free(new_list);
-                       return EINA_TRUE;
-                    }
-               }
-          }
-
-        eina_list_free(new_list);
-     }
-   else
-     {
-        rendered_windows = _e_hwc_windows_target_window_rendered_windows_get(target_tsurface);
-
-        n_thw = eina_list_count(rendered_windows);
-        if (n_thw)
-          {
-             EINA_LIST_FOREACH(rendered_windows, l, hw)
-               if (hw == hwc_window) return EINA_TRUE;
-          }
-     }
-
-   return EINA_FALSE;
-}
-
 static E_Client *
 _e_hwc_windows_client_get_from_object(Evas_Object *o, Eina_Bool *effect_client)
 {
@@ -1454,7 +1242,6 @@ _e_hwc_windows_target_window_surface_queue_trace_cb(tbm_surface_queue_h surface_
           {
              comp_info->skip = EINA_FALSE;
              _e_hwc_windows_comp_info_rendered_buffers_set(comp_info, NULL);
-             _e_hwc_windows_comp_info_rendered_windows_set(comp_info, NULL);
           }
      }
 }
@@ -1570,7 +1357,6 @@ static Eina_Bool
 _e_hwc_windows_target_window_tbm_surface_queue_set(E_Hwc_Window_Target *target_hwc_window, tbm_surface_queue_h tqueue)
 {
    E_Hwc_Window_Queue *queue;
-   int queue_size = 0;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(tqueue, EINA_FALSE);
 
@@ -1583,17 +1369,6 @@ _e_hwc_windows_target_window_tbm_surface_queue_set(E_Hwc_Window_Target *target_h
    ((E_Hwc_Window *)target_hwc_window)->queue_destroy_listener.notify = _e_hwc_windows_target_cb_queue_destroy;
    ((E_Hwc_Window *)target_hwc_window)->queue = queue;
 
-   queue_size = e_hwc_window_queue_size_get(queue);
-   if (queue_size)
-     {
-        target_hwc_window->max_transition_failures =
-           e_hwc_window_queue_size_get(((E_Hwc_Window *)target_hwc_window)->queue);
-     }
-   else
-     {
-        target_hwc_window->max_transition_failures = DEFAULT_MAX_TRANSITION_FAILURES;
-     }
-
    /* as evas_renderer has finished its work (to provide a composited buffer) it enqueues
     * the result buffer into this queue and acquirable cb gets called; this cb does nothing
     * except the writing into the event_fd object, this writing causes the new ecore_main loop
@@ -1629,8 +1404,6 @@ _e_hwc_windows_target_window_gbm_surface_set(E_Hwc_Window_Target *target_hwc_win
    ((E_Hwc_Window *)target_hwc_window)->queue_destroy_listener.notify = _e_hwc_windows_target_cb_queue_destroy;
    ((E_Hwc_Window *)target_hwc_window)->queue = queue;
 
-   target_hwc_window->max_transition_failures = DEFAULT_MAX_TRANSITION_FAILURES;
-
    return EINA_TRUE;
 }
 
@@ -1750,9 +1523,7 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
    E_Comp_Wl_Buffer *buffer;
    E_Hwc_Windows_Comp_Info *comp_info;
    Eina_List *rendered_buffers = NULL;
-   Eina_List *rendered_windows;
    Eina_List *visible_windows;
-   Eina_List *l;
    Eina_Bool fence_enabled;
    E_Hwc_Window_Queue_Type queue_type;
    E_Client *ec;
@@ -1802,14 +1573,22 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
 
    fence_enabled = e_hwc_windows_fence_enabled_get(target_hwc_window->hwc);
 
-   EINA_LIST_FOREACH(target_hwc_window->rendered_windows, l, hwc_window)
+   EINA_LIST_FREE(target_hwc_window->rendered_windows, hwc_window)
      {
-        if (!hwc_window->on_rendered_target) continue;
+        if (!hwc_window->on_rendered_target)
+          {
+             e_hwc_window_unref(hwc_window);
+             continue;
+          }
 
         hwc_window->on_rendered_target = EINA_FALSE;
 
         ec = hwc_window->ec;
-        if (!ec) continue;
+        if (!ec)
+          {
+             e_hwc_window_unref(hwc_window);
+             continue;
+          }
 
         cdata = e_client_cdata_get(ec);
         if (cdata)
@@ -1820,13 +1599,21 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
         if (!buffer)
           buffer = _e_hwc_windows_comp_wl_buffer_get(hwc_window);
 
-        if (!buffer) continue;
+        if (!buffer)
+          {
+             e_hwc_window_unref(hwc_window);
+             continue;
+          }
 
         /* if reference buffer created by server, server deadlock is occurred.
            beacause tbm_surface_internal_unref is called in user_data delete callback.
            tbm_surface doesn't allow it.
          */
-        if (!buffer->resource) continue;
+        if (!buffer->resource)
+          {
+             e_hwc_window_unref(hwc_window);
+             continue;
+          }
 
         if ((fence_enabled) && (buffer->buffer_release) && (target_hwc_window->end_render_sync))
           {
@@ -1838,6 +1625,7 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
                   if (!e_explicit_sync_buffer_release_fence_fd_set(buffer->buffer_release, fence_fd))
                     close(fence_fd);
 
+                  e_hwc_window_unref(hwc_window);
                   continue;
                }
              else
@@ -1845,17 +1633,20 @@ _e_hwc_windows_target_window_render_flush_post_cb(void *data, Evas *e EINA_UNUSE
           }
 
         buffer_ref = E_NEW(E_Comp_Wl_Buffer_Ref, 1);
-        if (!buffer_ref) continue;
+        if (!buffer_ref)
+          {
+             e_hwc_window_unref(hwc_window);
+             continue;
+          }
 
         e_comp_wl_buffer_reference(buffer_ref, buffer);
         rendered_buffers = eina_list_append(rendered_buffers, buffer_ref);
+
+        e_hwc_window_unref(hwc_window);
      }
 
-   rendered_windows = eina_list_clone(target_hwc_window->rendered_windows);
-   _e_hwc_windows_comp_info_rendered_windows_set(comp_info, rendered_windows);
    _e_hwc_windows_comp_info_rendered_buffers_set(comp_info, rendered_buffers);
 
-   eina_list_free(target_hwc_window->rendered_windows);
    target_hwc_window->rendered_windows = NULL;
    target_hwc_window->dequeued_tsurface = NULL;
 }
@@ -2131,186 +1922,10 @@ _e_hwc_windows_window_state_get(tdm_hwc_window_composition composition_type)
 }
 
 static Eina_Bool
-_e_hwc_windows_transition_check(E_Hwc *hwc)
-{
-   E_Hwc_Window *hwc_window;
-   E_Hwc_Window_Target *target_hwc_window, *root_target_hwc_window;
-   Eina_Bool transition = EINA_FALSE;
-   const Eina_List *l;
-   Eina_Bool display_state_changed = EINA_FALSE;
-   Eina_Bool target_window_changed = EINA_FALSE;
-   Eina_Bool client_to_none_transition = EINA_FALSE;
-   E_Hwc_Window_Queue_Type queue_type;
-
-   target_hwc_window = hwc->target_hwc_window;
-   EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
-
-   root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc);
-   EINA_SAFETY_ON_NULL_RETURN_VAL(root_target_hwc_window, EINA_FALSE);
-
-   queue_type = e_hwc_window_queue_type_get(((E_Hwc_Window *)root_target_hwc_window)->queue);
-   if (queue_type == E_HWC_WINDOW_QUEUE_TYPE_GBM_SURFACE) return EINA_FALSE;
-
-   EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
-     {
-        E_Hwc_Window_Transition window_transition = E_HWC_WINDOW_TRANSITION_NONE_TO_NONE;
-
-        if (e_hwc_window_is_target(hwc_window)) continue;
-        if (e_hwc_window_is_video(hwc_window)) continue;
-
-        if ((hwc_window->state == hwc_window->accepted_state) &&
-            (e_hwc_window_transition_get(hwc_window) == E_HWC_WINDOW_TRANSITION_NONE_TO_NONE))
-          continue;
-
-        if (hwc_window->transition_failures > root_target_hwc_window->max_transition_failures)
-          continue;
-
-        if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
-            (((E_Hwc_Window *)target_hwc_window)->current.buffer.tsurface))
-          transition = EINA_TRUE;
-        else
-          target_window_changed = EINA_TRUE;
-
-        /* DEVICE -> CLIENT */
-        if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) &&
-            (hwc_window->state == E_HWC_WINDOW_STATE_CLIENT))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT);
-
-             if (!_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_FALSE))
-               window_transition = E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* DEVICE -> NONE */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_NONE))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* CURSOR -> CLIENT */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_CURSOR) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_CLIENT))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_CURSOR_TO_CLIENT);
-
-             if (!_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_FALSE))
-               window_transition = E_HWC_WINDOW_TRANSITION_CURSOR_TO_CLIENT;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* CURSOR -> NONE */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_CURSOR) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_NONE))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_CURSOR_TO_NONE);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_CURSOR_TO_NONE;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* CLIENT -> DEVICE */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_DEVICE))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_CLIENT_TO_DEVICE);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_CLIENT_TO_DEVICE;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* CLIENT -> CURSOR */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_CURSOR))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_CLIENT_TO_CURSOR);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_CLIENT_TO_CURSOR;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* NONE -> DEVICE */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_NONE) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_DEVICE))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_NONE_TO_DEVICE);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_NONE_TO_DEVICE;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* NONE -> CURSOR */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_NONE) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_CURSOR))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_NONE_TO_CURSOR);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_NONE_TO_CURSOR;
-
-             display_state_changed = EINA_TRUE;
-          }
-        /* CLIENT -> NONE */
-        else if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_CLIENT) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_NONE))
-          {
-             e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE);
-
-             if (_e_hwc_windows_target_window_rendered_window_has(hwc, hwc_window, EINA_TRUE))
-               window_transition = E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE;
-          }
-        else if ((e_hwc_window_transition_get(hwc_window) != E_HWC_WINDOW_TRANSITION_NONE_TO_NONE) &&
-                 (hwc_window->state == E_HWC_WINDOW_STATE_CLIENT))
-          {
-             if (_e_hwc_windows_target_window_rendered_window_has_no(hwc, hwc_window, EINA_TRUE))
-               {
-                  window_transition = e_hwc_window_transition_get(hwc_window);
-                  transition = EINA_TRUE;
-               }
-          }
-
-        if (window_transition)
-          {
-             if (target_window_changed)
-               {
-                  hwc_window->transition_failures++;
-                  EHWSINF("Increase hwc_window:%p transition failures:%d",
-                          hwc_window->ec, hwc, hwc_window, hwc_window->transition_failures);
-               }
-
-             if (window_transition == E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE)
-               {
-                  client_to_none_transition = EINA_TRUE;
-                  continue;
-               }
-
-             transition = EINA_TRUE;
-          }
-     }
-
-    if ((display_state_changed) && (client_to_none_transition))
-      transition = EINA_TRUE;
-
-    if (transition && target_window_changed)
-      EHWSINF("hwc transition display_state_change:%d client_to_none_transition:%d",
-              NULL, hwc, display_state_changed, client_to_none_transition);
-
-    return transition;
-}
-
-static Eina_Bool
 _e_hwc_windows_present_sync_check(E_Hwc *hwc)
 {
    E_Hwc_Window_Target *target_hwc_window;
+   E_Hwc_Window_Target *root_target_hwc_window;
 
    if (!hwc->present_sync) return EINA_FALSE;
 
@@ -2321,7 +1936,16 @@ _e_hwc_windows_present_sync_check(E_Hwc *hwc)
      {
         if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
             (((E_Hwc_Window *)target_hwc_window)->current.buffer.tsurface))
-          return EINA_TRUE;
+          {
+             root_target_hwc_window = _e_hwc_windows_root_target_hwc_window_get(hwc);
+             if (root_target_hwc_window)
+               {
+                  if (!eina_list_count(root_target_hwc_window->rendering_tsurfaces))
+                    e_hwc_windows_target_window_force_render(target_hwc_window);
+               }
+
+             return EINA_TRUE;
+          }
      }
 
     hwc->present_sync = EINA_FALSE;
@@ -2414,7 +2038,6 @@ _e_hwc_windows_accept(E_Hwc *hwc)
         /* update the accepted_state */
         state = e_hwc_window_state_get(hwc_window);
         e_hwc_window_accepted_state_set(hwc_window, state);
-        e_hwc_window_transition_set(hwc_window, E_HWC_WINDOW_TRANSITION_NONE_TO_NONE);
 
         /* notify the hwc_window that it will be displayed on hw layer */
         if (!hwc_window->queue && !e_hwc_window_is_video(hwc_window))
@@ -2734,13 +2357,6 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
      {
         if (e_hwc_window_is_target(hwc_window)) continue;
 
-        e_hwc_window_ref(hwc_window);
-     }
-
-   EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
-     {
-        if (e_hwc_window_is_target(hwc_window)) continue;
-
         /* fetch the window buffer */
         if (e_hwc_window_buffer_fetch(hwc_window))
           update_changes = EINA_TRUE;
@@ -2766,13 +2382,6 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
           update_changes = EINA_TRUE;
      }
 
-   EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
-     {
-        if (e_hwc_window_is_target(hwc_window)) continue;
-
-        e_hwc_window_unref(hwc_window);
-     }
-
    if (hwc->primary_output)
      _e_hwc_windows_root_target_buffer_fetch(hwc);
 
@@ -3143,22 +2752,6 @@ _e_hwc_windows_evaluate(E_Hwc *hwc, E_Output_Display_Mode display_mode)
 
    _e_hwc_windows_below_transparent_window_update(hwc);
 
-   /* skip the target_buffer when the window is on trainsition of the composition */
-   if ((hwc_mode != E_HWC_MODE_FULL) &&
-       (!hwc->pp_set) && (display_mode != E_OUTPUT_DISPLAY_MODE_MIRROR) &&
-       (_e_hwc_windows_transition_check(hwc)))
-     {
-        _e_hwc_windows_target_window_buffer_skip(hwc);
-
-        if (!hwc->transition)
-          {
-             e_hwc_windows_target_window_force_render(hwc->target_hwc_window);
-             hwc->transition = EINA_TRUE;
-          }
-
-        goto re_evaluate;
-     }
-
    if (_e_hwc_windows_present_sync_check(hwc))
      {
         EHWSTRACE(" Not accpet display sync", NULL, hwc);
@@ -3178,7 +2771,6 @@ _e_hwc_windows_evaluate(E_Hwc *hwc, E_Output_Display_Mode display_mode)
         goto re_evaluate;
      }
 
-   hwc->transition = EINA_FALSE;
    hwc->re_evaluate = EINA_FALSE;
 
    return EINA_TRUE;
@@ -4191,8 +3783,8 @@ _e_hwc_windows_window_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug
         if (!output->hwc) continue;
 
         snprintf(info_str, sizeof(info_str),
-                 "HWC:%p mode:%d wait_commit:%d deactive:%d transition:%d norender:%d mirror_source:%d",
-                 hwc, hwc->hwc_mode, hwc->wait_commit, hwc->hwc_deactive, hwc->transition, hwc->norender,
+                 "HWC:%p mode:%d wait_commit:%d deactive:%d norender:%d mirror_source:%d",
+                 hwc, hwc->hwc_mode, hwc->wait_commit, hwc->hwc_deactive, hwc->norender,
                  eina_list_count(hwc->mirror_dst_hwc) ? 1 : 0);
         eldbus_message_iter_basic_append(line_array, 's', info_str);
 
@@ -4200,7 +3792,7 @@ _e_hwc_windows_window_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug
         "==========================================================================================="
         "===============================================================================================");
         eldbus_message_iter_basic_append(line_array, 's',
-        " No   Win_ID    Hwc_win    zpos  ST   AC_ST  ACTI TRANSI  tsurface  src_size        src_pos"
+        " No   Win_ID    Hwc_win    zpos  ST   AC_ST  ACTI tsurface  src_size        src_pos"
         "       FMT       dst_pos        TRANSF DP_tsurface   Queue    wl_tbm_queue vis_skip restriction");
         eldbus_message_iter_basic_append(line_array, 's',
         "==========================================================================================="
@@ -4242,7 +3834,7 @@ _e_hwc_windows_window_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug
                flip = ' ';
 
              snprintf(info_str, sizeof(info_str),
-                      "%3d 0x%08zx 0x%08zx %4d   %s    %s     %s   %s 0x%08zx %04dx%04d %04dx%04d+%04d+%04d"
+                      "%3d 0x%08zx 0x%08zx %4d   %s    %s     %s   0x%08zx %04dx%04d %04dx%04d+%04d+%04d"
                       " %4s %04dx%04d+%04d+%04d  %c%3d  0x%08zx  0x%08zx 0x%08zx   %6s   %s",
                       ++idx,
                       e_client_util_win_get(hwc_window->ec),
@@ -4251,7 +3843,6 @@ _e_hwc_windows_window_debug_info_get(Eldbus_Message_Iter *iter, E_Hwc_Wins_Debug
                       e_hwc_window_state_string_get(hwc_window->state),
                       e_hwc_window_state_string_get(hwc_window->accepted_state),
                       hwc_window->accepted_state ? "A" : "D",
-                      e_hwc_window_transition_string_get(hwc_window->transition),
                       (uintptr_t)hwc_window->current.buffer.tsurface,
                       hwc_window->current.info.src_config.size.h,
                       hwc_window->current.info.src_config.size.v,
@@ -4355,8 +3946,8 @@ _e_hwc_windows_window_debug_commit_info_get(Eldbus_Message_Iter *iter, E_Hwc_Win
         if (!output->hwc) continue;
 
         snprintf(info_str, sizeof(info_str),
-                 "HWC:%p mode:%d wait_commit:%d deactive:%d transition:%d norender:%d mirror_source:%d",
-                 hwc, hwc->hwc_mode, hwc->wait_commit, hwc->hwc_deactive, hwc->transition, hwc->norender,
+                 "HWC:%p mode:%d wait_commit:%d deactive:%d norender:%d mirror_source:%d",
+                 hwc, hwc->hwc_mode, hwc->wait_commit, hwc->hwc_deactive, hwc->norender,
                  eina_list_count(hwc->mirror_dst_hwc) ? 1 : 0);
         eldbus_message_iter_basic_append(line_array, 's', info_str);
 
@@ -4516,6 +4107,8 @@ e_hwc_windows_present_sync(E_Hwc *hwc)
 
    _e_hwc_windows_target_window_buffer_skip(hwc);
 
+   e_hwc_windows_target_window_force_render(hwc->target_hwc_window);
+
    EHWSINF("Present sync", NULL, hwc);
 
    return EINA_TRUE;
index c357f26..a6abc74 100644 (file)
@@ -107,7 +107,6 @@ struct _E_Hwc
    Eina_List           *visible_windows;
    int                  num_visible_windows;
    Eina_Bool            device_state_available;
-   Eina_Bool            transition;
    Eina_Bool            re_evaluate;
    Eina_Bool            property_changed;
 
index 8f72914..8871f7c 100644 (file)
@@ -29,24 +29,6 @@ typedef enum _E_Hwc_Window_Activation_State
    E_HWC_WINDOW_ACTIVATION_STATE_ACTIVATED,
 } E_Hwc_Window_Activation_State;
 
-typedef enum _E_Hwc_Window_Transition
-{
-   E_HWC_WINDOW_TRANSITION_NONE_TO_NONE,
-   E_HWC_WINDOW_TRANSITION_NONE_TO_CLIENT,
-   E_HWC_WINDOW_TRANSITION_NONE_TO_DEVICE,
-   E_HWC_WINDOW_TRANSITION_NONE_TO_CURSOR,
-   E_HWC_WINDOW_TRANSITION_CLIENT_TO_NONE,
-   E_HWC_WINDOW_TRANSITION_CLIENT_TO_CLIENT,
-   E_HWC_WINDOW_TRANSITION_CLIENT_TO_DEVICE,
-   E_HWC_WINDOW_TRANSITION_CLIENT_TO_CURSOR,
-   E_HWC_WINDOW_TRANSITION_DEVICE_TO_NONE,
-   E_HWC_WINDOW_TRANSITION_DEVICE_TO_CLIENT,
-   E_HWC_WINDOW_TRANSITION_DEVICE_TO_DEVICE,
-   E_HWC_WINDOW_TRANSITION_CURSOR_TO_NONE,
-   E_HWC_WINDOW_TRANSITION_CURSOR_TO_CLIENT,
-   E_HWC_WINDOW_TRANSITION_CURSOR_TO_CURSOR
-} E_Hwc_Window_Transition;
-
 struct _E_Hwc_Window
 {
    E_Object                       e_obj_inherit;
@@ -68,8 +50,6 @@ struct _E_Hwc_Window
 
    E_Hwc_Window_State             state;
    E_Hwc_Window_State             accepted_state;
-   E_Hwc_Window_Transition        transition;
-   int                            transition_failures;
 
    E_Hwc_Window_Update_Data       current;
    Eina_List                     *pending_update_list;
@@ -148,7 +128,6 @@ struct _E_Hwc_Window_Target
    Eina_List          *rendering_tsurfaces;
    Eina_List          *rendered_windows;
    Eina_Bool           is_rendering;
-   int                 max_transition_failures;
 
    E_Hwc_Window_Queue *pp_queue;
    struct wl_listener  pp_queue_destroy_listener;