e_hwc_window: add e_hwc_window_pp_commit_data_acquire API for pp zoom 71/202071/3
authorJunkyeong Kim <jk0430.kim@samsung.com>
Fri, 22 Mar 2019 08:01:14 +0000 (17:01 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 1 Apr 2019 06:55:37 +0000 (06:55 +0000)
e_hwc_window_buffer_fetch: do not execute tdm set. tdm set execute after pp done.
e_hwc_window_pp_commit_data_acquire: if pp_hwc_mode set, it means there is only 1 visible hwc_window.
in this case do not execute compositor, get commit data from this client type hwc_window.

Change-Id: Icfdc0629a71c166614ddb9d05dda29ea96fe277e
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/bin/e_hwc_window.c
src/bin/e_hwc_window.h
src/bin/e_hwc_windows.c

index 9839d5f..b363ff2 100644 (file)
@@ -573,6 +573,30 @@ done:
    E_FREE(hwc_window);
 }
 
+static E_Hwc_Window_Commit_Data *
+_e_hwc_window_commit_data_acquire_device(E_Hwc_Window *hwc_window)
+{
+   E_Hwc_Window_Commit_Data *commit_data = NULL;
+   EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, NULL);
+
+   commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, NULL);
+
+   _e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface,
+                            hwc_window->buffer.queue);
+
+   tbm_surface_internal_ref(commit_data->buffer.tsurface);
+
+   _e_hwc_window_update_fps(hwc_window);
+
+   if (!e_hwc_window_is_target(hwc_window) &&
+       !e_hwc_window_is_video(hwc_window))
+     e_comp_wl_buffer_reference(&commit_data->buffer_ref,
+                                _e_hwc_window_comp_wl_buffer_get(hwc_window));
+
+   return commit_data;
+}
+
 EINTERN Eina_Bool
 e_hwc_window_init(E_Hwc *hwc)
 {
@@ -896,7 +920,7 @@ e_hwc_window_info_update(E_Hwc_Window *hwc_window)
 }
 
 EINTERN Eina_Bool
-e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
+e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window, Eina_Bool tdm_set)
 {
    tbm_surface_h tsurface = NULL;
    tdm_hwc_window *thwc_window = NULL;
@@ -987,7 +1011,8 @@ e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window)
    else
      _e_hwc_window_buffer_set(&hwc_window->buffer, NULL, NULL);
 
-   error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface);
+   if (tdm_set)
+     error = tdm_hwc_window_set_buffer(thwc_window, hwc_window->buffer.tsurface);
    EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
 
    return EINA_TRUE;
@@ -1033,20 +1058,8 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
             (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info))))
           return EINA_FALSE;
 
-        commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
+        commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window);
         EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
-
-        _e_hwc_window_buffer_set(&commit_data->buffer, hwc_window->buffer.tsurface,
-                                 hwc_window->buffer.queue);
-
-        tbm_surface_internal_ref(commit_data->buffer.tsurface);
-
-        _e_hwc_window_update_fps(hwc_window);
-
-        if (!e_hwc_window_is_target(hwc_window) &&
-            !e_hwc_window_is_video(hwc_window))
-          e_comp_wl_buffer_reference(&commit_data->buffer_ref,
-                                     _e_hwc_window_comp_wl_buffer_get(hwc_window));
      }
    else
      {
@@ -1567,7 +1580,7 @@ _e_hwc_window_client_recover(E_Hwc_Window *hwc_window)
    /* force update */
    e_comp_wl_surface_attach(ec, recover_buffer);
 
-   e_hwc_window_buffer_fetch(hwc_window);
+   e_hwc_window_buffer_fetch(hwc_window, EINA_TRUE);
 }
 
 static Eina_Bool
@@ -1940,4 +1953,63 @@ e_hwc_window_pp_rendered_window_update(E_Hwc_Window *hwc_window)
      e_pointer_hwc_set(pointer, EINA_TRUE);
 
    return EINA_TRUE;
-}
\ No newline at end of file
+}
+
+EINTERN Eina_Bool
+e_hwc_window_pp_commit_data_acquire(E_Hwc_Window *hwc_window, Eina_Bool pp_hwc_mode)
+{
+   E_Hwc_Window_Commit_Data *commit_data = NULL;
+
+   /* if pp_hwc_mode, there is only 1 client state window */
+   if (pp_hwc_mode)
+     {
+        if (!hwc_window->buffer.tsurface) return EINA_FALSE;
+        if ((hwc_window->buffer.tsurface == hwc_window->display.buffer.tsurface) &&
+            (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info))))
+          return EINA_FALSE;
+        if (hwc_window->state != E_HWC_WINDOW_STATE_CLIENT)
+          {
+             if (hwc_window->state != E_HWC_WINDOW_STATE_VIDEO)
+               return EINA_FALSE;
+          }
+
+        commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
+     }
+   else
+     {
+        if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_DEVICE ||/* composited buffer */
+             hwc_window->accepted_state == E_HWC_WINDOW_STATE_VIDEO)
+          {
+             if (!hwc_window->buffer.tsurface) return EINA_FALSE;
+             if ((hwc_window->buffer.tsurface == hwc_window->display.buffer.tsurface) &&
+                 (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info))))
+               return EINA_FALSE;
+
+             commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window);
+             EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
+          }
+        else
+          {
+             if (!hwc_window->display.buffer.tsurface) return EINA_FALSE;
+
+             commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
+             EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
+
+             _e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
+          }
+     }
+
+   EHWTRACE("COM ts:%10p ------- {%25s}, state:%s, zpos:%d, deleted:%s",
+            hwc_window->ec, hwc_window,
+            commit_data->buffer.tsurface,
+            e_hwc_window_name_get(hwc_window),
+            e_hwc_window_state_string_get(hwc_window->state),
+            hwc_window->zpos, (hwc_window->is_deleted ? "yes" : "no"));
+
+   e_object_ref(E_OBJECT(hwc_window));
+
+   hwc_window->commit_data = commit_data;
+
+   return EINA_TRUE;
+}
index 196da8b..489afaf 100644 (file)
@@ -170,7 +170,7 @@ EINTERN Eina_Bool               e_hwc_window_zpos_set(E_Hwc_Window *hwc_window,
 EINTERN int                     e_hwc_window_zpos_get(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_composition_update(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_info_update(E_Hwc_Window *hwc_window);
-EINTERN Eina_Bool               e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool               e_hwc_window_buffer_fetch(E_Hwc_Window *hwc_window, Eina_Bool tdm_set);
 EINTERN Eina_Bool               e_hwc_window_prop_update(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_is_target(E_Hwc_Window *hwc_window);
 EINTERN Eina_Bool               e_hwc_window_is_video(E_Hwc_Window *hwc_window);
@@ -211,6 +211,7 @@ EINTERN void                    e_hwc_window_commit_data_buffer_dump(E_Hwc_Windo
 EINTERN Eina_Bool               e_hwc_window_fps_get(E_Hwc_Window *hwc_window, double *fps);
 
 EINTERN Eina_Bool               e_hwc_window_pp_rendered_window_update(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool               e_hwc_window_pp_commit_data_acquire(E_Hwc_Window *hwc_window, Eina_Bool pp_hwc_mode);
 
 #endif // E_HWC_WINDOW_H
 #endif
index 8ec7bfc..3182fcb 100644 (file)
@@ -1925,7 +1925,7 @@ _e_hwc_windows_changes_update(E_Hwc *hwc)
         if (e_hwc_window_is_target(hwc_window)) continue;
 
         /* fetch the window buffer */
-        if (e_hwc_window_buffer_fetch(hwc_window))
+        if (e_hwc_window_buffer_fetch(hwc_window, EINA_TRUE))
           update_changes = EINA_TRUE;
         else
           {