e_comp_wl_tizen_hwc: fix sending discard event before surface is committed 79/314079/1
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 14 May 2024 06:14:02 +0000 (15:14 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Fri, 5 Jul 2024 02:21:43 +0000 (11:21 +0900)
commit_feedback should be checked because surface contents are
double-buffered state.

Change-Id: Ic64a7340c2f8bd5771fbaa62bcbe3ef334e3bb60

src/bin/server/e_comp_wl_tizen_hwc.c

index f45652e83e6ca292bbf3d22ba42369d13d860101..abb0593ab6d21b084662063756bdd2e45c769597 100644 (file)
@@ -3,6 +3,7 @@
 #include "e_error_intern.h"
 #include "e_hwc_window_intern.h"
 #include "e_hwc_window_queue_intern.h"
+#include "e_compositor_intern.h"
 
 #include <tizen-hwc-server-protocol.h>
 
@@ -29,6 +30,15 @@ struct _E_Comp_Wl_Tizen_Hwc_Commit_Feedback
 
    Eina_Bool dequeued;
    E_Comp_Wl_Tizen_Hwc_Feedback_List *dequeued_list;
+
+   Eina_Bool pending;
+
+   E_Surface *surface;
+
+   struct {
+      struct wl_listener surface_destroy;
+      struct wl_listener surface_commit;
+   } listener;
 };
 
 static void
@@ -55,6 +65,12 @@ _tizen_hwc_commit_feedback_cb_resource_destroy(struct wl_resource *hwc_commit_fe
    if (hwc_commit_feedback->timer)
      ecore_timer_del(hwc_commit_feedback->timer);
 
+   if (hwc_commit_feedback->listener.surface_commit.notify)
+     wl_list_remove(&hwc_commit_feedback->listener.surface_commit.link);
+
+   if (hwc_commit_feedback->listener.surface_destroy.notify)
+     wl_list_remove(&hwc_commit_feedback->listener.surface_destroy.link);
+
    tizen_hwc->hwc_commit_feeback_list = eina_list_remove(tizen_hwc->hwc_commit_feeback_list, hwc_commit_feedback);
    E_FREE(hwc_commit_feedback);
 }
@@ -137,6 +153,38 @@ _e_comp_wl_tizen_hwc_commit_feedback_cb_timeout(void *data)
    return ECORE_CALLBACK_CANCEL;
 }
 
+static void
+_e_comp_wl_tizen_hwc_cb_surface_destroy(struct wl_listener *listener, void *data)
+{
+   E_Comp_Wl_Tizen_Hwc_Commit_Feedback *hwc_commit_feedback;
+
+   hwc_commit_feedback = wl_container_of(listener, hwc_commit_feedback, listener.surface_destroy);
+   hwc_commit_feedback->surface = NULL;
+
+   if (hwc_commit_feedback->listener.surface_commit.notify)
+     {
+        hwc_commit_feedback->listener.surface_commit.notify = NULL;
+        wl_list_remove(&hwc_commit_feedback->listener.surface_commit.link);
+     }
+
+   hwc_commit_feedback->listener.surface_destroy.notify = NULL;
+   wl_list_remove(&hwc_commit_feedback->listener.surface_destroy.link);
+}
+
+static void
+_e_comp_wl_tizen_hwc_cb_surface_commit(struct wl_listener *listener, void *data)
+{
+   E_Comp_Wl_Tizen_Hwc_Commit_Feedback *hwc_commit_feedback;
+
+   hwc_commit_feedback = wl_container_of(listener, hwc_commit_feedback, listener.surface_commit);
+   hwc_commit_feedback->pending = EINA_FALSE;
+
+   hwc_commit_feedback->listener.surface_commit.notify = NULL;
+   wl_list_remove(&hwc_commit_feedback->listener.surface_commit.link);
+
+   ELOGF("TIZEN-HWC", "Unset Commit Feedback pending.(%p)", hwc_commit_feedback->ec, hwc_commit_feedback);
+}
+
 static void
 _e_comp_wl_tizen_hwc_cb_create_commit_feedback(struct wl_client *client,
                                 struct wl_resource *tizen_hwc_resource,
@@ -148,6 +196,7 @@ _e_comp_wl_tizen_hwc_cb_create_commit_feedback(struct wl_client *client,
    E_Comp_Wl_Tizen_Hwc *tizen_hwc;
    E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
    E_Hwc *hwc;
+   E_Surface *surface;
 
    tizen_hwc = wl_resource_get_user_data(tizen_hwc_resource);
    EINA_SAFETY_ON_NULL_RETURN(tizen_hwc);
@@ -156,6 +205,9 @@ _e_comp_wl_tizen_hwc_cb_create_commit_feedback(struct wl_client *client,
    EINA_SAFETY_ON_NULL_RETURN(ec);
    if (e_object_is_del(E_OBJECT(ec))) return;
 
+   surface = e_surface_from_resource(surface_resource);
+   EINA_SAFETY_ON_NULL_RETURN(surface);
+
    hwc_commit_feedback = E_NEW(E_Comp_Wl_Tizen_Hwc_Commit_Feedback, 1);
    if (!hwc_commit_feedback)
      {
@@ -181,6 +233,14 @@ _e_comp_wl_tizen_hwc_cb_create_commit_feedback(struct wl_client *client,
                                                 _e_comp_wl_tizen_hwc_commit_feedback_cb_timeout,
                                                 hwc_commit_feedback);
 
+   hwc_commit_feedback->surface = surface;
+   hwc_commit_feedback->listener.surface_destroy.notify = _e_comp_wl_tizen_hwc_cb_surface_destroy;
+   e_surface_destroy_listener_add(surface, &hwc_commit_feedback->listener.surface_destroy);
+
+   hwc_commit_feedback->pending = EINA_TRUE;
+   hwc_commit_feedback->listener.surface_commit.notify = _e_comp_wl_tizen_hwc_cb_surface_commit;
+   e_surface_commit_listener_add(surface, &hwc_commit_feedback->listener.surface_commit);
+
    wl_resource_set_implementation(hwc_commit_feedback->resource, NULL, hwc_commit_feedback,
                                   _tizen_hwc_commit_feedback_cb_resource_destroy);
 
@@ -323,6 +383,7 @@ 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->pending) continue;
              if ((hwc_commit_feedback->ec->hwc_window) &&
                  (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
              if (hwc_commit_feedback->dequeued) continue;
@@ -346,6 +407,7 @@ 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->pending) continue;
              if ((hwc_commit_feedback->ec->hwc_window) &&
                  (hwc_commit_feedback->ec->hwc_window->present_sync)) continue;
              if (hwc_commit_feedback->dequeued) continue;
@@ -388,6 +450,7 @@ e_comp_wl_tizen_hwc_feedback_list_dequeue(E_Client *ec, E_Comp_Wl_Tizen_Hwc_Feed
      {
         EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, ll, lll, hwc_commit_feedback)
           {
+             if (hwc_commit_feedback->pending) continue;
              if (hwc_commit_feedback->ec != ec) continue;
              if (hwc_commit_feedback->dequeued) continue;