e_comp_wl_tizen_hwc: Fix wrong discard event in case of present sync 12/264212/4 accepted/tizen/unified/20210915.100106 submit/tizen/20210915.051712
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 14 Sep 2021 11:51:48 +0000 (20:51 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Wed, 15 Sep 2021 04:35:59 +0000 (13:35 +0900)
In case of the present sync of hwc_window is set, hwc_window is not updated
until the pending update data of hwc_window is enqueued.
so the discard event of hwc_commit_feedback is sent because hwc does not have
the update data of commit.
this patch make that hwc_commit_feedback does not send event until
the pending update data of hwc_window is enqueued.

Change-Id: I93f6a1545f70196cf0f49c2799c1001ae3b12794

src/bin/e_comp_wl_tizen_hwc.c
src/bin/e_comp_wl_tizen_hwc.h
src/bin/e_hwc_windows.c

index fb6d5f1..e03869f 100644 (file)
@@ -21,6 +21,9 @@ struct _E_Comp_Wl_Tizen_Hwc_Commit_Feedback
    E_Comp_Wl_Tizen_Hwc *tizen_hwc;
    uint32_t serial;
    Ecore_Timer *timer;
+
+   Eina_Bool dequeued;
+   E_Comp_Wl_Tizen_Hwc_Feedback_List *dequeued_list;
 };
 
 static void
@@ -37,6 +40,13 @@ _tizen_hwc_commit_feedback_cb_resource_destroy(struct wl_resource *hwc_commit_fe
 
    ELOGF("TIZEN-HWC", "Destory Tizen HWC Commit Feedback.", hwc_commit_feedback->ec);
 
+   if ((hwc_commit_feedback->dequeued_list) && (hwc_commit_feedback->dequeued_list->feedbacks))
+     hwc_commit_feedback->dequeued_list->feedbacks = eina_list_remove(hwc_commit_feedback->dequeued_list->feedbacks,
+                                                                      hwc_commit_feedback);
+
+   if (hwc_commit_feedback->ec)
+     e_object_unref(E_OBJECT(hwc_commit_feedback->ec));
+
    if (hwc_commit_feedback->timer)
      ecore_timer_del(hwc_commit_feedback->timer);
 
@@ -107,6 +117,7 @@ _e_comp_wl_tizen_hwc_cb_create_commit_feedback(struct wl_client *client,
      }
 
    hwc_commit_feedback->ec = ec;
+   e_object_ref(E_OBJECT(ec));
    hwc_commit_feedback->tizen_hwc = tizen_hwc;
    hwc_commit_feedback->serial = serial;
    hwc_commit_feedback->timer = ecore_timer_add(E_COMP_WL_TIZEN_HWC_TIMEOUT,
@@ -239,6 +250,10 @@ e_comp_wl_tizen_hwc_committed(void)
      {
         EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
           {
+             if ((hwc_commit_feedback->ec->hwc_window) &&
+                 (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
+             if (hwc_commit_feedback->dequeued) continue;
+
              ELOGF("TIZEN-HWC", "[Send] Commit FeedBack Committed.(%p, %p)", hwc_commit_feedback->ec, hwc_commit_feedback, hwc_commit_feedback->resource);
              tizen_hwc_commit_feedback_send_committed(hwc_commit_feedback->resource,
                                                       hwc_commit_feedback->serial);
@@ -258,6 +273,10 @@ e_comp_wl_tizen_hwc_discarded(void)
      {
         EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
           {
+             if ((hwc_commit_feedback->ec->hwc_window) &&
+                 (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
+             if (hwc_commit_feedback->dequeued) continue;
+
              ELOGF("TIZEN-HWC", "[Send] Commit FeedBack Discarded.(%p, %p)", hwc_commit_feedback->ec, hwc_commit_feedback, hwc_commit_feedback->resource);
              tizen_hwc_commit_feedback_send_discarded(hwc_commit_feedback->resource,
                                                       hwc_commit_feedback->serial);
@@ -265,3 +284,64 @@ e_comp_wl_tizen_hwc_discarded(void)
           }
      }
 }
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_init(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+EINTERN void
+e_comp_wl_tizen_hwc_feedback_list_finish(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+   if (!feedback_list) return;
+
+   e_comp_wl_tizen_hwc_feedback_list_enqueue(feedback_list);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_dequeue(E_Client *ec, E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+   const Eina_List *l, *ll, *lll;
+   E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+   E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+   EINA_LIST_FOREACH(_e_comp_wl_tizen_hwc_list, l, tizen_hwc)
+     {
+        EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
+          {
+             if (hwc_commit_feedback->ec != ec) continue;
+             if (hwc_commit_feedback->dequeued) continue;
+
+             hwc_commit_feedback->dequeued = EINA_TRUE;
+             hwc_commit_feedback->dequeued_list = feedback_list;
+             feedback_list->feedbacks = eina_list_append(feedback_list->feedbacks,
+                                                         hwc_commit_feedback);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_feedback_list_enqueue(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedback_list)
+{
+   Eina_List *l, *ll;
+   E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+   EINA_SAFETY_ON_NULL_RETURN_VAL(feedback_list, EINA_FALSE);
+
+   EINA_LIST_FOREACH_SAFE(feedback_list->feedbacks, l, ll, hwc_commit_feedback)
+     {
+        hwc_commit_feedback->dequeued = EINA_FALSE;
+        hwc_commit_feedback->dequeued_list = NULL;
+        feedback_list->feedbacks = eina_list_remove_list(feedback_list->feedbacks, l);
+     }
+
+   return EINA_TRUE;
+}
index 71ce658..a47d95a 100644 (file)
@@ -1,5 +1,12 @@
 #ifdef E_TYPEDEFS
 
+typedef struct _E_Comp_Wl_Tizen_Hwc_Feedback_List E_Comp_Wl_Tizen_Hwc_Feedback_List;
+
+struct _E_Comp_Wl_Tizen_Hwc_Feedback_List
+{
+   Eina_List *feedbacks;
+};
+
 #else
 # ifndef E_COMP_WL_TIZEN_HWC_H
 #  define E_COMP_WL_TIZEN_HWC_H
@@ -9,5 +16,10 @@ EINTERN void      e_comp_wl_tizen_hwc_shutdown(void);
 EINTERN void      e_comp_wl_tizen_hwc_committed(void);
 EINTERN void      e_comp_wl_tizen_hwc_discarded(void);
 
+EINTERN Eina_Bool e_comp_wl_tizen_hwc_feedback_list_init(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedbacks);
+EINTERN void      e_comp_wl_tizen_hwc_feedback_list_finish(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedbacks);
+EINTERN Eina_Bool e_comp_wl_tizen_hwc_feedback_list_dequeue(E_Client *ec, E_Comp_Wl_Tizen_Hwc_Feedback_List *feedbacks);
+EINTERN Eina_Bool e_comp_wl_tizen_hwc_feedback_list_enqueue(E_Comp_Wl_Tizen_Hwc_Feedback_List *feedbacks);
+
 # endif
 #endif
index 4ed96a7..23afb52 100644 (file)
@@ -66,6 +66,8 @@ struct _E_Hwc_Windows_Comp_Info
    E_Egl_Sync *release_fence;
    Eina_List *pending_update_list;
 
+   E_Comp_Wl_Tizen_Hwc_Feedback_List feedback_list;
+
    Eina_List *rendered_windows;
    Eina_List *rendered_buffers;
 };
@@ -227,6 +229,7 @@ _e_hwc_windows_comp_info_free(void *data EINA_UNUSED, void *event)
 
    e_presentation_time_container_finish(&comp_info->presentation_container);
    e_hwc_presentation_callback_list_finish(&comp_info->presentation_callbacks);
+   e_comp_wl_tizen_hwc_feedback_list_finish(&comp_info->feedback_list);
 
    E_FREE(comp_info);
 }
@@ -258,6 +261,7 @@ _e_hwc_windows_comp_info_get(tbm_surface_h tbm_surface)
 
    e_presentation_time_container_init(&comp_info->presentation_container);
    e_hwc_presentation_callback_list_init(&comp_info->presentation_callbacks);
+   e_comp_wl_tizen_hwc_feedback_list_init(&comp_info->feedback_list);
 
    tbm_surface_internal_add_user_data(tbm_surface, EHWS_BUFFER_COMP_INFO_KEY,
                                       _e_hwc_windows_comp_info_cb_tbm_surface_destroy);
@@ -1119,6 +1123,8 @@ _e_hwc_windows_pending_update_data_enqueue(E_Hwc_Windows_Comp_Info *comp_info)
 
    comp_info->pending_update_list = NULL;
 
+   e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
+
    return EINA_TRUE;
 }
 
@@ -1133,6 +1139,11 @@ _e_hwc_windows_pending_update_data_dequeue(E_Hwc_Window_Target *target_hwc_windo
    EINA_SAFETY_ON_NULL_RETURN_VAL(target_hwc_window, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(comp_info, EINA_FALSE);
 
+   EINA_LIST_FREE(comp_info->pending_update_list, update)
+     e_hwc_window_pending_update_data_enqueue(update->hwc_window, update);
+
+   e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
+
    EINA_LIST_FREE(target_hwc_window->present_sync_windows, hwc_window)
      {
         hwc_window->present_sync = EINA_FALSE;
@@ -1145,12 +1156,12 @@ _e_hwc_windows_pending_update_data_dequeue(E_Hwc_Window_Target *target_hwc_windo
                e_client_video_commit_data_release(hwc_window->ec, 0, 0, 0);
           }
 
+        if (hwc_window->ec)
+          e_comp_wl_tizen_hwc_feedback_list_dequeue(hwc_window->ec, &comp_info->feedback_list);
+
         e_object_unref(E_OBJECT(hwc_window));
      }
 
-   EINA_LIST_FREE(comp_info->pending_update_list, update)
-     e_hwc_window_pending_update_data_enqueue(update->hwc_window, update);
-
    comp_info->pending_update_list = pending_update_list;
 
    return EINA_TRUE;
@@ -1180,6 +1191,8 @@ _e_hwc_windows_pending_update_data_clear(E_Hwc_Window_Target *target_hwc_window)
 
         EINA_LIST_FREE(comp_info->pending_update_list, update)
           e_hwc_window_pending_update_data_dequeue_cancel(update->hwc_window, update);
+
+        e_comp_wl_tizen_hwc_feedback_list_enqueue(&comp_info->feedback_list);
      }
 
    return EINA_TRUE;