e_hwc_windows: update video if norender execpt video is pushed 20/249520/2 accepted/tizen/6.0/unified/20201215.112448 submit/tizen_6.0/20201214.110245
authorChangyeon Lee <cyeon.lee@samsung.com>
Fri, 11 Dec 2020 10:04:36 +0000 (19:04 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Mon, 14 Dec 2020 09:19:09 +0000 (18:19 +0900)
tv product wants to call commit of video even if norender is pushed
so we add norender_except_video and update only video window.

Change-Id: I2f47f158d094444524f9ba76bf46c8169826577b

src/bin/e_hwc_windows.c

index 2a0991eab0ecd4e58b6eb18cdfe4568e6a68c165..8b68b9f1b9ad9844432b4a141a2890689a24e12e 100644 (file)
@@ -1753,9 +1753,13 @@ _e_hwc_windows_transition_check(E_Hwc *hwc)
         if (hwc_window->transition_failures > target_hwc_window->max_transition_failures)
           continue;
 
-        if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
-            (((E_Hwc_Window *)target_hwc_window)->buffer.tsurface))
-          return EINA_TRUE;
+        /* if norender except video is pushed, buffer of target_window can't be updated */
+        if (e_hwc_norender_get_except_video(hwc) <= 0)
+          {
+             if ((((E_Hwc_Window *)target_hwc_window)->display.buffer.tsurface) ==
+                 (((E_Hwc_Window *)target_hwc_window)->buffer.tsurface))
+               return EINA_TRUE;
+          }
 
         /* DEVICE -> CLIENT */
         if ((hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE) &&
@@ -2170,6 +2174,67 @@ _e_hwc_windows_visible_windows_update(E_Hwc *hwc)
    return EINA_TRUE;
 }
 
+static Eina_Bool
+_e_hwc_windows_visible_video_windows_update(E_Hwc *hwc)
+{
+   E_Hwc_Window *hwc_window;
+   Eina_List *l, *ll;
+   Eina_List *visible_windows;
+   Eina_Bool update_changes = EINA_FALSE;
+   int zpos = 0;
+   int add_num = 0, remove_num = 0;
+
+   /* get the visible windows */
+   visible_windows = _e_hwc_windows_visible_windows_list_get(hwc);
+   if (!visible_windows && !hwc->visible_windows)
+     return EINA_FALSE;
+
+   /* remove hide video windows */
+   EINA_LIST_FOREACH_SAFE(hwc->visible_windows, l, ll, hwc_window)
+     {
+        if (!e_hwc_window_is_video(hwc_window)) continue;
+        if (eina_list_data_find(visible_windows, hwc_window)) continue;
+
+        hwc->visible_windows = eina_list_remove(hwc->visible_windows, hwc_window);
+        e_object_unref(E_OBJECT(hwc_window));
+
+        e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE, EINA_TRUE);
+        remove_num++;
+        update_changes = EINA_TRUE;
+     }
+
+   /* add show video windows */
+   EINA_LIST_FOREACH_SAFE(visible_windows, l, ll, hwc_window)
+     {
+        if (!e_hwc_window_is_video(hwc_window)) continue;
+        if (eina_list_data_find(hwc->visible_windows, hwc_window)) continue;
+
+        hwc->visible_windows = eina_list_append(hwc->visible_windows, hwc_window);
+        e_object_ref(E_OBJECT(hwc_window));
+
+        e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_VIDEO, EINA_TRUE);
+        add_num++;
+        update_changes = EINA_TRUE;
+     }
+
+   if (!update_changes)
+     {
+        eina_list_free(visible_windows);
+        return EINA_FALSE;
+     }
+
+   hwc->num_visible_windows += add_num;
+   hwc->num_visible_windows -= remove_num;
+
+   /* use the reverse iteration for assgining the zpos */
+   EINA_LIST_REVERSE_FOREACH(hwc->visible_windows, l, hwc_window)
+     e_hwc_window_zpos_set(hwc_window, zpos++);
+
+   eina_list_free(visible_windows);
+
+   return EINA_TRUE;
+}
+
 static Eina_Bool
 _e_hwc_windows_device_state_available_update(E_Hwc *hwc)
 {
@@ -2315,6 +2380,52 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
    return update_changes;
 }
 
+static Eina_Bool
+_e_hwc_windows_video_changes_update(E_Hwc *hwc)
+{
+   E_Hwc_Window *hwc_window = NULL;
+   Eina_Bool update_changes = EINA_FALSE;
+   const Eina_List *l;
+   Eina_Bool ret = EINA_FALSE;
+
+   if (_e_hwc_windows_visible_video_windows_update(hwc))
+     update_changes = EINA_TRUE;
+
+   EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
+     {
+        if (!e_hwc_window_is_video(hwc_window)) continue;
+
+        /* fetch the window buffer */
+        ret = e_hwc_window_buffer_fetch(hwc_window);
+        if (ret)
+          update_changes = EINA_TRUE;
+        else
+          {
+             /* sometimes client add frame cb without buffer attach */
+             if ((hwc_window->ec) &&
+                 (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE))
+               {
+                  if ((hwc_window->ec->pixmap) &&
+                      (e_pixmap_type_get(hwc_window->ec->pixmap) == E_PIXMAP_TYPE_WL))
+                    e_pixmap_image_clear(hwc_window->ec->pixmap, 1);
+               }
+          }
+
+        /* update the window's info */
+        if (e_hwc_window_info_update(hwc_window))
+          update_changes = EINA_TRUE;
+
+        /* update the window's props */
+        if (e_hwc_window_prop_update(hwc_window))
+          update_changes = EINA_TRUE;
+
+        if (e_hwc_window_device_state_available_update(hwc_window))
+          update_changes = EINA_TRUE;
+     }
+
+   return update_changes;
+}
+
 static void
 _e_hwc_windows_target_state_set(E_Hwc_Window_Target *target_hwc_window, E_Hwc_Window_State state)
 {
@@ -2664,12 +2775,6 @@ _e_hwc_windows_evaluate(E_Hwc *hwc, E_Output_Display_Mode display_mode)
         goto re_evaluate;
      }
 
-   if (e_hwc_norender_get(hwc) > 0)
-     {
-        EHWSTRACE(" Not accpet validation NoRender get.", NULL, hwc);
-        goto re_evaluate;
-     }
-
    if (hwc_mode == E_HWC_MODE_FULL)
      {
         if (((E_Hwc_Window *)hwc->target_hwc_window)->buffer.tsurface)
@@ -2935,6 +3040,12 @@ e_hwc_windows_render(E_Hwc *hwc)
         return EINA_TRUE;
      }
 
+   if (e_hwc_norender_get_except_video(hwc) > 0)
+     {
+        EHWSTRACE("NoRender Except Video get. Do not ecore_evas_manual_render.", NULL, hwc);
+        return EINA_TRUE;
+     }
+
    if (e_hwc_window_queue_buffer_can_dequeue(target_window->queue))
      {
         TRACE_DS_BEGIN(MANUAL RENDER);
@@ -3182,10 +3293,25 @@ e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode)
 
    if (hwc->wait_commit) return EINA_TRUE;
 
+   if (e_hwc_norender_get(hwc) > 0)
+     {
+        EHWSTRACE("No Render get.", NULL, hwc);
+        return EINA_TRUE;
+     }
+
    if (hwc->primary_output)
      {
-        if (!_e_hwc_windows_changes_update(hwc))
-          goto update_done;
+        if (e_hwc_norender_get_except_video(hwc) > 0)
+          {
+             EHWSTRACE("No Render Except Video get", NULL, hwc);
+             if (!_e_hwc_windows_video_changes_update(hwc))
+               goto update_done;
+          }
+        else
+          {
+             if (!_e_hwc_windows_changes_update(hwc))
+               goto update_done;
+          }
      }
    else
      {