e_hwc_windows: support multiple hwc_commit_data 04/241304/6
authorChangyeon Lee <cyeon.lee@samsung.com>
Wed, 19 Aug 2020 04:49:20 +0000 (13:49 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Tue, 25 Aug 2020 05:27:08 +0000 (14:27 +0900)
e_hwc and e_hwc_window has list of commit_data

Change-Id: Icee275fcb791a9d46e993432841550f823a3d873

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

index 093324690b62bd4a2f0ce550027a7cebab9833d4..7890bbf6d8902c4d2e3c42cb0cbd4102e29c975a 100644 (file)
@@ -145,6 +145,8 @@ struct _E_Hwc
    Eina_Bool            tdm_hwc_fence;
    int                  commit_fence_fd;
    Ecore_Timer         *commit_handler_timer;
+
+   Eina_List           *wins_commit_data_list;
 };
 
 E_API extern int E_EVENT_HWC_ACTIVE;
index d64fe0fe7cede0e508aaadfc43aed50f0b88dc63..51bcd9d28c13fdc8348b83d4513a15f2a5eb5ddd 100644 (file)
@@ -1261,6 +1261,8 @@ EINTERN Eina_Bool
 e_hwc_window_display_or_commit_buffer_check(E_Hwc_Window *hwc_window, tbm_surface_h tsurface)
 {
    E_Hwc *hwc;
+   E_Hwc_Window_Commit_Data *commit_data;
+   Eina_List *l;
 
    hwc = hwc_window->hwc;
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
@@ -1269,8 +1271,11 @@ e_hwc_window_display_or_commit_buffer_check(E_Hwc_Window *hwc_window, tbm_surfac
 
    if (hwc_window->display.buffer.tsurface == tsurface) return EINA_TRUE;
 
-   if (!hwc_window->commit_data) return EINA_FALSE;
-   if (hwc_window->commit_data->buffer.tsurface == tsurface) return EINA_TRUE;
+   EINA_LIST_FOREACH(hwc_window->commit_data_list, l, commit_data)
+     {
+        if (commit_data->buffer.tsurface == tsurface)
+          return EINA_TRUE;
+     }
 
    if (hwc->pp_buffer.tsurface == tsurface)
      return EINA_TRUE;
@@ -1405,17 +1410,17 @@ e_hwc_window_prop_update(E_Hwc_Window *hwc_window)
    return ret;
 }
 
-EINTERN Eina_Bool
+EINTERN E_Hwc_Window_Commit_Data *
 e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
 {
    E_Hwc_Window_Commit_Data *commit_data = NULL;
 
    if (hwc_window->accepted_state == E_HWC_WINDOW_STATE_CURSOR)
      {
-        if (!hwc_window->cursor.buffer) return EINA_FALSE;
-        if ((hwc_window->cursor.buffer == hwc_window->display.buffer_ref.buffer) &&
-            (!memcmp(&hwc_window->info, &hwc_window->display.info, sizeof(tdm_hwc_window_info))))
-          return EINA_FALSE;
+        if (!hwc_window->cursor.buffer) return NULL;
+        if ((hwc_window->cursor.buffer == hwc_window->commit.buffer_ref.buffer) &&
+            (!memcmp(&hwc_window->info, &hwc_window->commit.info, sizeof(tdm_hwc_window_info))))
+          return NULL;
 
         commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
         EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
@@ -1428,28 +1433,28 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
             (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;
+        if ((hwc_window->buffer.tsurface == hwc_window->commit.buffer.tsurface) &&
+            (!memcmp(&hwc_window->info, &hwc_window->commit.info, sizeof(tdm_hwc_window_info))))
+          return NULL;
 
         commit_data = _e_hwc_window_commit_data_acquire_device(hwc_window);
-        EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, NULL);
      }
    else
      {
         if (e_hwc_window_is_cursor(hwc_window))
           {
-             if (!hwc_window->display.buffer_ref.buffer)
-               return EINA_FALSE;
+             if (!hwc_window->commit.buffer_ref.buffer)
+               return NULL;
           }
         else
           {
-             if (!hwc_window->display.buffer.tsurface)
-               return EINA_FALSE;
+             if (!hwc_window->commit.buffer.tsurface)
+               return NULL;
           }
 
         commit_data = E_NEW(E_Hwc_Window_Commit_Data, 1);
-        EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, EINA_FALSE);
+        EINA_SAFETY_ON_NULL_RETURN_VAL(commit_data, NULL);
 
         e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
      }
@@ -1461,11 +1466,17 @@ e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window)
             e_hwc_window_state_string_get(hwc_window->state),
             hwc_window->zpos, (hwc_window->is_deleted ? "yes" : "no"));
 
+   commit_data->hwc_window = hwc_window;
    e_object_ref(E_OBJECT(hwc_window));
 
-   hwc_window->commit_data = commit_data;
+   /* set latest commit_data */
+   memcpy(&hwc_window->commit.info, &commit_data->info, sizeof(tdm_hwc_window_info));
+   e_comp_wl_buffer_reference(&hwc_window->commit.buffer_ref, commit_data->buffer_ref.buffer);
+   e_hwc_window_buffer_set(&hwc_window->commit.buffer, commit_data->buffer.tsurface, commit_data->buffer.queue);
 
-   return EINA_TRUE;
+   hwc_window->commit_data_list = eina_list_append(hwc_window->commit_data_list, commit_data);
+
+   return commit_data;
 }
 
 EINTERN void
@@ -1526,17 +1537,24 @@ e_hwc_window_presentation_time_feedback_discard(E_Hwc_Window *hwc_window)
 }
 
 EINTERN Eina_Bool
-e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window)
+e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_Data *commit_data)
 {
    tbm_surface_h tsurface = NULL;
    E_Hwc_Window_Queue *queue = NULL;
    E_Hwc_Window_Queue_Buffer *queue_buffer = NULL;
 
    /* we don't have data to release */
-   if (!hwc_window->commit_data) return EINA_FALSE;
+   if (!commit_data) return EINA_FALSE;
+
+   if (!eina_list_data_find(hwc_window->commit_data_list, commit_data))
+     {
+        EHWERR("failed to find commit_data:%p in commit_data_list",
+               hwc_window->ec, hwc_window->hwc, hwc_window, commit_data);
+        return EINA_FALSE;
+     }
 
-   tsurface = hwc_window->commit_data->buffer.tsurface;
-   queue = hwc_window->commit_data->buffer.queue;
+   tsurface = commit_data->buffer.tsurface;
+   queue = commit_data->buffer.queue;
 
    EHWTRACE("DON ts:%10p ------- {%25s}, state:%s, zpos:%d, deleted:%s (Window)",
             hwc_window->ec, hwc_window->hwc, hwc_window,
@@ -1546,11 +1564,11 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window)
 
    if (e_hwc_window_is_cursor(hwc_window))
      {
-        if (hwc_window->commit_data->buffer_ref.buffer)
+        if (commit_data->buffer_ref.buffer)
           {
              e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref,
-                                        hwc_window->commit_data->buffer_ref.buffer);
-             memcpy(&hwc_window->display.info, &hwc_window->commit_data->info, sizeof(tdm_hwc_window_info));
+                                        commit_data->buffer_ref.buffer);
+             memcpy(&hwc_window->display.info, &commit_data->info, sizeof(tdm_hwc_window_info));
           }
         else
           {
@@ -1558,9 +1576,9 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window)
              CLEAR(hwc_window->display.info);
           }
 
-        e_comp_wl_buffer_reference(&hwc_window->commit_data->buffer_ref, NULL);
-        free(hwc_window->commit_data);
-        hwc_window->commit_data = NULL;
+        e_comp_wl_buffer_reference(&commit_data->buffer_ref, NULL);
+        hwc_window->commit_data_list = eina_list_remove(hwc_window->commit_data_list, commit_data);
+        free(commit_data);
         e_object_unref(E_OBJECT(hwc_window));
 
         return EINA_TRUE;
@@ -1605,22 +1623,22 @@ e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window)
              e_object_unref(E_OBJECT(hwc_window));
           }
 
-        if (hwc_window->commit_data->buffer_ref.buffer)
+        if (commit_data->buffer_ref.buffer)
           e_comp_wl_buffer_reference(&hwc_window->display.buffer_ref,
-                                     hwc_window->commit_data->buffer_ref.buffer);
+                                     commit_data->buffer_ref.buffer);
         /* update hwc_window display info */
         e_hwc_window_buffer_set(&hwc_window->display.buffer, tsurface, queue);
 
-        memcpy(&hwc_window->display.info, &hwc_window->commit_data->info, sizeof(tdm_hwc_window_info));
+        memcpy(&hwc_window->display.info, &commit_data->info, sizeof(tdm_hwc_window_info));
 
         e_object_ref(E_OBJECT(hwc_window));
      }
 
-   e_comp_wl_buffer_reference(&hwc_window->commit_data->buffer_ref, NULL);
-   e_hwc_window_buffer_set(&hwc_window->commit_data->buffer, NULL, NULL);
+   e_comp_wl_buffer_reference(&commit_data->buffer_ref, NULL);
+   e_hwc_window_buffer_set(&commit_data->buffer, NULL, NULL);
 
-   free(hwc_window->commit_data);
-   hwc_window->commit_data = NULL;
+   hwc_window->commit_data_list = eina_list_remove(hwc_window->commit_data_list, commit_data);
+   free(commit_data);
    e_object_unref(E_OBJECT(hwc_window));
 
    return EINA_TRUE;
@@ -2491,14 +2509,12 @@ e_hwc_window_trace_debug(Eina_Bool onoff)
 }
 
 EINTERN void
-e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window)
+e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_Data *commit_data)
 {
    char fname[64];
 
    EINA_SAFETY_ON_FALSE_RETURN(hwc_window);
-
-   if (!hwc_window->commit_data) return;
-   if (!hwc_window->commit_data->buffer.tsurface) return;
+   EINA_SAFETY_ON_FALSE_RETURN(commit_data);
 
    if (hwc_window->is_target)
      snprintf(fname, sizeof(fname), "hwc_commit_composite_%p",
@@ -2507,7 +2523,7 @@ e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window)
      snprintf(fname, sizeof(fname), "hwc_commit_0x%08zx_%p",
               e_client_util_win_get(hwc_window->ec), hwc_window);
 
-   tbm_surface_internal_dump_buffer(hwc_window->commit_data->buffer.tsurface,
+   tbm_surface_internal_dump_buffer(commit_data->buffer.tsurface,
                                     fname);
 }
 
index a4fbdebb4e6561aad42299ed353cb766f426088c..fedd026f1bf80f66cb705f943fac949629ce1b03 100644 (file)
@@ -100,7 +100,15 @@ struct _E_Hwc_Window
 
    tdm_hwc_window_info            info;
    Eina_List                     *prop_list;
-   E_Hwc_Window_Commit_Data      *commit_data;
+
+   Eina_List                     *commit_data_list;
+
+   struct
+   {
+      E_Comp_Wl_Buffer_Ref        buffer_ref;
+      E_Hwc_Window_Buffer         buffer;
+      tdm_hwc_window_info         info;
+   } commit;
 
    /* current display information */
    struct
@@ -171,6 +179,7 @@ struct _E_Hwc_Window_Target
 };
 
 struct _E_Hwc_Window_Commit_Data {
+   E_Hwc_Window          *hwc_window;
    E_Comp_Wl_Buffer_Ref   buffer_ref;
    E_Hwc_Window_Buffer    buffer;
    tdm_hwc_window_info    info;
@@ -192,8 +201,8 @@ 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);
 EINTERN Eina_Bool               e_hwc_window_is_cursor(E_Hwc_Window *hwc_window);
 
-EINTERN Eina_Bool               e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window);
-EINTERN Eina_Bool               e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window);
+EINTERN E_Hwc_Window_Commit_Data *e_hwc_window_commit_data_acquire(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool                 e_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_Data *commit_data);
 
 EINTERN Eina_Bool               e_hwc_window_activate(E_Hwc_Window *hwc_window, E_Hwc_Window_Queue *queue);
 EINTERN Eina_Bool               e_hwc_window_deactivate(E_Hwc_Window *hwc_window);
@@ -227,7 +236,7 @@ EINTERN E_Hwc_Window_Hook      *e_hwc_window_hook_add(E_Hwc_Window_Hook_Point ho
 EINTERN void                    e_hwc_window_hook_del(E_Hwc_Window_Hook *ch);
 
 EINTERN void                    e_hwc_window_trace_debug(Eina_Bool onoff);
-EINTERN void                    e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window);
+EINTERN void                    e_hwc_window_commit_data_buffer_dump(E_Hwc_Window *hwc_window, E_Hwc_Window_Commit_Data *commit_data);
 EINTERN Eina_Bool               e_hwc_window_fps_get(E_Hwc_Window *hwc_window, double *fps);
 
 EINTERN void                    e_hwc_window_presentation_time_feedback_present(E_Hwc_Window *hwc_window, uint64_t sequence, uint64_t tv_sec, uint64_t tv_usec);
index d1e58533c22b24f81239f5cb594b962315100352..37aca270fba31a0870df0a403ebaae5bf675652f 100644 (file)
@@ -77,7 +77,7 @@ static uint64_t ehws_comp_buffer_info_key;
 #define EHWS_BUFFER_COMP_INFO_KEY  (unsigned long)(&ehws_comp_buffer_info_key)
 
 static Eina_Bool _e_hwc_windows_target_window_queue_set(E_Hwc_Window_Target *target_hwc_window);
-static void _e_hwc_windows_wait_commit_set(E_Hwc *hwc, Eina_Bool set);
+static void _e_hwc_windows_wait_commit_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set);
 
 static E_Comp_Wl_Buffer *
 _e_hwc_windows_comp_wl_buffer_get(E_Hwc_Window *hwc_window)
@@ -261,17 +261,24 @@ _e_hwc_windows_presentation_feedback_take(E_Hwc_Window *hwc_window)
 }
 
 static void
-_e_hwc_windows_commit_data_release(E_Hwc *hwc, int sequence,
-                                  unsigned int tv_sec, unsigned int tv_usec)
+_e_hwc_windows_commit_data_release(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data,
+                                   int sequence, unsigned int tv_sec, unsigned int tv_usec)
 {
    const Eina_List *l, *ll;
    E_Hwc_Window *hwc_window;
-   E_Hwc_Window *hwc_window_target;
+   E_Hwc_Window_Commit_Data *commit_data;
 
-   hwc_window_target = (E_Hwc_Window *)hwc->target_hwc_window;
-   if (hwc_window_target)
+   if (!eina_list_data_find(hwc->wins_commit_data_list, wins_commit_data))
+     {
+        EHWSERR("failed to find wins_commit_data:%p in wins_commit_data_list",
+                hwc, wins_commit_data);
+        return;
+     }
+
+   if (wins_commit_data->target_commit_data)
      {
-        e_hwc_window_presentation_time_feedback_present(hwc_window_target,
+        hwc_window = wins_commit_data->target_commit_data->hwc_window;
+        e_hwc_window_presentation_time_feedback_present(hwc_window,
                                                         sequence,
                                                         tv_sec,
                                                         tv_usec);
@@ -280,49 +287,69 @@ _e_hwc_windows_commit_data_release(E_Hwc *hwc, int sequence,
          * _e_hwc_windows_rendered_windows_free.
          * we must don't call commit_data_release of target_window in list.
          */
-        if (hwc_window_target->commit_data)
-          e_hwc_window_commit_data_release(hwc_window_target);
+        e_hwc_window_commit_data_release(hwc_window, wins_commit_data->target_commit_data);
      }
 
-   EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
+   /* window_commit_data is freed in e_hwc_window_commit_data_release */
+   EINA_LIST_FOREACH_SAFE(wins_commit_data->commit_data_list, l, ll, commit_data)
      {
-         if (hwc_window->is_target) continue;
-         if (!hwc_window->commit_data) continue;
+        hwc_window = commit_data->hwc_window;
+        if (hwc_window->is_target) continue;
 
-         e_hwc_window_presentation_time_feedback_present(hwc_window, sequence, tv_sec, tv_usec);
+        e_hwc_window_presentation_time_feedback_present(hwc_window, sequence, tv_sec, tv_usec);
 
-         if (e_hwc_window_is_video(hwc_window) && hwc_window->ec)
-           e_client_video_commit_data_release(hwc_window->ec, sequence, tv_sec, tv_usec);
+        if (e_hwc_window_is_video(hwc_window) && hwc_window->ec)
+          e_client_video_commit_data_release(hwc_window->ec, sequence, tv_sec, tv_usec);
 
-         if (!e_hwc_window_commit_data_release(hwc_window)) continue;
+        if (!e_hwc_window_commit_data_release(hwc_window, commit_data)) continue;
      }
+
+    hwc->wins_commit_data_list = eina_list_remove(hwc->wins_commit_data_list, wins_commit_data);
+    free(wins_commit_data);
 }
 
-static Eina_Bool
+static E_Hwc_Windows_Commit_Data *
 _e_hwc_windows_commit_data_acquire(E_Hwc *hwc)
 {
    const Eina_List *l;
    E_Hwc_Window *hwc_window;
-   Eina_Bool ret = EINA_FALSE;
+   E_Hwc_Window_Commit_Data *commit_data = NULL;
+   E_Hwc_Windows_Commit_Data *wins_commit_data = NULL;
+
+   wins_commit_data = E_NEW(E_Hwc_Windows_Commit_Data, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(wins_commit_data, NULL);
+
+   wins_commit_data->hwc = hwc;
 
    /* return TRUE when the number of the commit data is more than one */
    EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
      {
-        if (!e_hwc_window_commit_data_acquire(hwc_window)) continue;
+        commit_data = e_hwc_window_commit_data_acquire(hwc_window);
+        if (!commit_data) continue;
 
         _e_hwc_windows_presentation_feedback_take(hwc_window);
 
         if (ehws_dump_enable)
-          e_hwc_window_commit_data_buffer_dump(hwc_window);
+          e_hwc_window_commit_data_buffer_dump(hwc_window, commit_data);
 
         /* send frame event enlightenment doesn't send frame event in nocomp */
         if (hwc_window->ec)
           e_pixmap_image_clear(hwc_window->ec->pixmap, 1);
 
-        if (!ret) ret = EINA_TRUE;
+        if (hwc_window->is_target)
+          wins_commit_data->target_commit_data = commit_data;
+        else
+          wins_commit_data->commit_data_list = eina_list_append(wins_commit_data->commit_data_list,
+                                                                commit_data);
+     }
+
+   if ((!wins_commit_data->commit_data_list) && (!wins_commit_data->target_commit_data))
+     {
+        free(wins_commit_data);
+        return NULL;
      }
 
-   return ret;
+   return wins_commit_data;
 }
 
 static void
@@ -330,16 +357,21 @@ _e_hwc_windows_commit_handler(tdm_hwc *thwc, unsigned int sequence,
                                   unsigned int tv_sec, unsigned int tv_usec,
                                   void *user_data)
 {
-   E_Hwc *hwc = (E_Hwc *)user_data;
+   E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)user_data;
+   E_Hwc *hwc;
+
+   EINA_SAFETY_ON_NULL_RETURN(wins_commit_data);
+
+   hwc = wins_commit_data->hwc;
    EINA_SAFETY_ON_NULL_RETURN(hwc);
 
    EHWSTRACE("!!!!!!!! HWC Commit Handler !!!!!!!!", NULL, hwc);
 
-   _e_hwc_windows_commit_data_release(hwc, sequence, tv_sec, tv_usec);
-
    /* 'wait_commit' is mechanism to make 'fetch and commit' no more than one time per a frame;
     * a 'page flip' happened so it's time to allow to make 'fetch and commit' for the e_output */
-   _e_hwc_windows_wait_commit_set(hwc, EINA_FALSE);
+   _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_FALSE);
+
+   _e_hwc_windows_commit_data_release(hwc, wins_commit_data, sequence, tv_sec, tv_usec);
 }
 
 static void
@@ -348,31 +380,33 @@ _e_hwc_windows_offscreen_commit(E_Hwc *hwc)
    E_Hwc_Window *hwc_window = NULL;
    E_Hwc_Window *hwc_window_target;
    Eina_List *l, *ll;
-   Eina_Bool ret = EINA_FALSE;
+   E_Hwc_Window_Commit_Data *commit_data = NULL;
 
    hwc_window_target = (E_Hwc_Window *)hwc->target_hwc_window;
    if (hwc_window_target)
      {
         e_hwc_window_presentation_time_feedback_discard(hwc_window_target);
 
-        ret = e_hwc_window_commit_data_acquire(hwc_window_target);
-        if (ret)
+        commit_data = e_hwc_window_commit_data_acquire(hwc_window_target);
+        if (commit_data)
           {
              /* 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);
+             e_hwc_window_commit_data_release(hwc_window_target, commit_data);
           }
      }
 
    EINA_LIST_FOREACH_SAFE(hwc->hwc_windows, l, ll, hwc_window)
      {
+        commit_data = NULL;
+
         if (hwc_window->is_target) continue;
 
-        ret = e_hwc_window_commit_data_acquire(hwc_window);
-        if (!ret) continue;
+        commit_data = e_hwc_window_commit_data_acquire(hwc_window);
+        if (!commit_data) continue;
 
         EHWSTRACE("!!!!!!!! HWC OffScreen Commit !!!!!!!!", NULL, hwc);
 
@@ -382,7 +416,7 @@ _e_hwc_windows_offscreen_commit(E_Hwc *hwc)
 
         e_hwc_window_presentation_time_feedback_discard(hwc_window);
 
-        e_hwc_window_commit_data_release(hwc_window);
+        e_hwc_window_commit_data_release(hwc_window, commit_data);
      }
 }
 
@@ -1535,22 +1569,22 @@ _e_hwc_windows_pp_info_set(E_Hwc *hwc, tbm_surface_h src, tbm_surface_h dst,
 static Eina_Bool
 _e_hwc_windows_commit_handler_timeout(void *data)
 {
-   E_Hwc *hwc = (E_Hwc *)data;
+   E_Hwc_Windows_Commit_Data *wins_commit_data = (E_Hwc_Windows_Commit_Data *)data;
 
-   if (!hwc) return ECORE_CALLBACK_CANCEL;
+   if (!wins_commit_data) return ECORE_CALLBACK_CANCEL;
 
-   EHWSERR("Timeout wait commit", hwc);
+   EHWSERR("Timeout wait commit", wins_commit_data->hwc);
 
-   _e_hwc_windows_commit_handler(hwc->thwc, 0, 0, 0, hwc);
+   wins_commit_data->hwc->wait_commit = EINA_FALSE;
+   wins_commit_data->hwc->commit_handler_timer = NULL;
 
-   hwc->wait_commit = EINA_FALSE;
-   hwc->commit_handler_timer = NULL;
+   _e_hwc_windows_commit_handler(wins_commit_data->hwc->thwc, 0, 0, 0, wins_commit_data);
 
    return ECORE_CALLBACK_CANCEL;
 }
 
 static void
-_e_hwc_windows_wait_commit_set(E_Hwc *hwc, Eina_Bool set)
+_e_hwc_windows_wait_commit_set(E_Hwc *hwc, E_Hwc_Windows_Commit_Data *wins_commit_data, Eina_Bool set)
 {
    if (hwc->wait_commit == set) return;
 
@@ -1565,7 +1599,7 @@ _e_hwc_windows_wait_commit_set(E_Hwc *hwc, Eina_Bool set)
         if (set)
           hwc->commit_handler_timer = ecore_timer_add(e_comp->commit_handler_timer.interval,
                                                       _e_hwc_windows_commit_handler_timeout,
-                                                      hwc);
+                                                      wins_commit_data);
      }
 
    hwc->wait_commit = set;
@@ -3018,6 +3052,7 @@ e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode)
    E_Output *output = NULL;
    tdm_error error = TDM_ERROR_NONE;
    int commit_fence_fd = -1;
+   E_Hwc_Windows_Commit_Data *wins_commit_data = NULL;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
 
@@ -3064,20 +3099,22 @@ e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode)
         return EINA_TRUE;
      }
 
-   if (!_e_hwc_windows_commit_data_acquire(hwc))
+   if (!(wins_commit_data = _e_hwc_windows_commit_data_acquire(hwc)))
      return EINA_TRUE;
 
    EHWSTRACE("!!!!!!!! HWC Commit !!!!!!!!", NULL, hwc);
    _e_hwc_windows_update_fps(hwc);
 
-   _e_hwc_windows_wait_commit_set(hwc, EINA_TRUE);
+   _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_TRUE);
+
+   hwc->wins_commit_data_list = eina_list_append(hwc->wins_commit_data_list, wins_commit_data);
 
-   error = tdm_hwc_commit(hwc->thwc, 0, _e_hwc_windows_commit_handler, hwc);
+   error = tdm_hwc_commit(hwc->thwc, 0, _e_hwc_windows_commit_handler, wins_commit_data);
    if (error != TDM_ERROR_NONE)
      {
-         EHWSERR("tdm_hwc_commit failed.", hwc);
-         _e_hwc_windows_commit_handler(hwc->thwc, 0, 0, 0, hwc);
-         goto fail;
+        EHWSERR("tdm_hwc_commit failed.", hwc);
+        _e_hwc_windows_commit_handler(hwc->thwc, 0, 0, 0, wins_commit_data);
+        goto fail;
      }
 
    if (e_hwc_windows_fence_enabled_get(hwc))
@@ -3103,7 +3140,7 @@ e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode)
 fail:
    /* send tizen_hwc_commit feedback discarded */
    e_comp_wl_tizen_hwc_discarded();
-   _e_hwc_windows_wait_commit_set(hwc, EINA_FALSE);
+   _e_hwc_windows_wait_commit_set(hwc, wins_commit_data, EINA_FALSE);
 
    return EINA_FALSE;
 }
index 25550b999535636fa86cdedb9741147bcd64ade6..0b6cbe1f95d062e3fed327d570584a4fca9393d7 100644 (file)
@@ -1,4 +1,7 @@
 #ifdef E_TYPEDEFS
+
+typedef struct _E_Hwc_Windows_Commit_Data  E_Hwc_Windows_Commit_Data;
+
 #else
 #ifndef E_HWC_WINDOWS_H
 #define E_HWC_WINDOWS_H
@@ -16,6 +19,12 @@ typedef enum
    E_HWC_WINS_DEBUG_CMD_QUEUE,
 } E_Hwc_Wins_Debug_Cmd;
 
+struct _E_Hwc_Windows_Commit_Data {
+   E_Hwc_Window_Commit_Data *target_commit_data;
+   Eina_List *commit_data_list;
+   E_Hwc *hwc;
+};
+
 EINTERN Eina_Bool            e_hwc_windows_init(void);
 EINTERN void                 e_hwc_windows_deinit(void);
 EINTERN Eina_Bool            e_hwc_windows_render(E_Hwc *hwc);