#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>
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
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);
}
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,
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);
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)
{
_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);
{
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;
{
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;
{
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;