--- /dev/null
+#include "e.h"
+#include "tizen-hwc-server-protocol.h"
+
+static Eina_List *_e_comp_wl_tizen_hwc_list = NULL;
+
+typedef struct _E_Comp_Wl_Tizen_Hwc E_Comp_Wl_Tizen_Hwc;
+typedef struct _E_Comp_Wl_Tizen_Hwc_Commit_Feedback E_Comp_Wl_Tizen_Hwc_Commit_Feedback;
+
+struct _E_Comp_Wl_Tizen_Hwc
+{
+ struct wl_resource *resource;
+ Eina_List *hwc_commit_feeback_list;
+};
+
+struct _E_Comp_Wl_Tizen_Hwc_Commit_Feedback
+{
+ struct wl_resource *resource;
+ E_Client *ec;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ uint32_t serial;
+};
+
+static void
+_tizen_hwc_commit_feedback_cb_resource_destroy(struct wl_resource *hwc_commit_feedback_resource)
+{
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback *hwc_commit_feedback;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+
+ hwc_commit_feedback = wl_resource_get_user_data(hwc_commit_feedback_resource);
+ EINA_SAFETY_ON_NULL_RETURN(hwc_commit_feedback);
+
+ tizen_hwc = hwc_commit_feedback->tizen_hwc;
+ EINA_SAFETY_ON_NULL_RETURN(tizen_hwc);
+
+ tizen_hwc->hwc_commit_feeback_list = eina_list_remove(tizen_hwc->hwc_commit_feeback_list, hwc_commit_feedback);
+
+ E_FREE(hwc_commit_feedback);
+
+ ELOGF("TIZEN-HWC", "Destory Tizen HWC Commit Feedback.", NULL);
+}
+
+static void
+_e_comp_wl_tizen_hwc_cb_destroy(struct wl_client *client,
+ struct wl_resource *resource)
+{
+ wl_resource_destroy(resource);
+ ELOGF("TIZEN-HWC", "Destroy Tizen HWC.", NULL);
+}
+
+static void
+_e_comp_wl_tizen_hwc_cb_commit_feedback(struct wl_client *client,
+ struct wl_resource *tizen_hwc_resource,
+ struct wl_resource *surface_resource,
+ uint32_t id,
+ uint32_t serial)
+{
+ E_Client *ec;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+ tizen_hwc = wl_resource_get_user_data(tizen_hwc_resource);
+ EINA_SAFETY_ON_NULL_RETURN(tizen_hwc);
+
+ ec = wl_resource_get_user_data(surface_resource);
+ EINA_SAFETY_ON_NULL_RETURN(ec);
+ if (e_object_is_del(E_OBJECT(ec))) return;
+
+ hwc_commit_feedback = E_NEW(E_Comp_Wl_Tizen_Hwc_Commit_Feedback, 1);
+ if (!hwc_commit_feedback)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ hwc_commit_feedback->resource = wl_resource_create(client,
+ &tizen_hwc_commit_feedback_interface,
+ 1, id);
+ if (!hwc_commit_feedback->resource)
+ {
+ wl_client_post_no_memory(client);
+ E_FREE(hwc_commit_feedback);
+ return;
+ }
+
+ hwc_commit_feedback->ec = ec;
+ hwc_commit_feedback->tizen_hwc = tizen_hwc;
+ hwc_commit_feedback->serial = serial;
+
+ wl_resource_set_implementation(hwc_commit_feedback->resource, NULL, hwc_commit_feedback,
+ _tizen_hwc_commit_feedback_cb_resource_destroy);
+
+ tizen_hwc->hwc_commit_feeback_list = eina_list_append(tizen_hwc->hwc_commit_feeback_list, hwc_commit_feedback);
+
+ ELOGF("TIZEN-HWC", "Request Tizen HWC Commit Feedback by Client.(%p, %p)", NULL, hwc_commit_feedback, hwc_commit_feedback->resource);
+}
+
+static const struct tizen_hwc_interface _e_comp_wl_tizen_hwc_implementation = {
+ .destroy = _e_comp_wl_tizen_hwc_cb_destroy,
+ .commit_feedback = _e_comp_wl_tizen_hwc_cb_commit_feedback
+};
+
+static void
+_e_comp_wl_tizen_hwc_cb_unbind(struct wl_resource *resource)
+{
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback *hwc_commit_feedback;
+ const Eina_List *l, *ll;
+
+ tizen_hwc = wl_resource_get_user_data(resource);
+ EINA_SAFETY_ON_NULL_RETURN(tizen_hwc);
+
+ EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, l, ll, hwc_commit_feedback)
+ wl_resource_destroy(hwc_commit_feedback->resource);
+
+ _e_comp_wl_tizen_hwc_list = eina_list_remove(_e_comp_wl_tizen_hwc_list, tizen_hwc);
+ E_FREE(tizen_hwc);
+
+ ELOGF("TIZEN-HWC", "Unbind Tizen HWC.", NULL);
+}
+
+static void
+_e_comp_wl_tizen_hwc_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
+{
+ struct wl_resource *tizen_hwc_resource;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+
+ tizen_hwc = E_NEW(E_Comp_Wl_Tizen_Hwc, 1);
+ if (!tizen_hwc)
+ {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
+ tizen_hwc_resource = wl_resource_create(client, &tizen_hwc_interface, version, id);
+ if (!tizen_hwc_resource)
+ {
+ wl_client_post_no_memory(client);
+ E_FREE(tizen_hwc);
+ return;
+ }
+
+ tizen_hwc->resource = tizen_hwc_resource;
+
+ wl_resource_set_implementation(tizen_hwc_resource, &_e_comp_wl_tizen_hwc_implementation, tizen_hwc, _e_comp_wl_tizen_hwc_cb_unbind);
+
+ _e_comp_wl_tizen_hwc_list = eina_list_append(_e_comp_wl_tizen_hwc_list, tizen_hwc);
+}
+
+EINTERN Eina_Bool
+e_comp_wl_tizen_hwc_init(void)
+{
+ if (!e_comp_wl)
+ {
+ e_error_message_show(_("Enlightenment cannot has no e_comp_wl at Wayland Tizen HWC!\n"));
+ return EINA_FALSE;
+ }
+
+ EINA_SAFETY_ON_FALSE_RETURN_VAL(e_comp_wl->wl.disp, EINA_FALSE);
+
+ if (e_comp_wl->tizen_hwc.global)
+ return EINA_TRUE;
+
+ /* create the global resource for tizen_hwc */
+ e_comp_wl->tizen_hwc.global = wl_global_create(e_comp_wl->wl.disp, &tizen_hwc_interface, 1,
+ NULL, _e_comp_wl_tizen_hwc_cb_bind);
+ if (!e_comp_wl->tizen_hwc.global)
+ {
+ ERR("Could not create global for tizen_hwc: %m");
+ return EINA_FALSE;
+ }
+
+ ELOGF("TIZEN-HWC", "Initialize Tizen HWC.", NULL);
+
+ return EINA_TRUE;
+}
+
+EINTERN void
+e_comp_wl_tizen_hwc_shutdown(void)
+{
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback *hwc_commit_feedback;
+ const Eina_List *l, *ll, *lll, *llll;
+
+ ELOGF("TIZEN-HWC", "Shutdown Tizen HWC.", NULL);
+
+ if (!e_comp_wl) return;
+ if (!e_comp_wl->tizen_hwc.global) return;
+
+ EINA_LIST_FOREACH_SAFE(_e_comp_wl_tizen_hwc_list, l, ll, tizen_hwc)
+ {
+ EINA_LIST_FOREACH_SAFE(tizen_hwc->hwc_commit_feeback_list, lll, llll, hwc_commit_feedback)
+ wl_resource_destroy(hwc_commit_feedback->resource);
+
+ wl_resource_destroy(tizen_hwc->resource);
+ }
+ _e_comp_wl_tizen_hwc_list = NULL;
+
+ wl_global_destroy(e_comp_wl->tizen_hwc.global);
+ e_comp_wl->tizen_hwc.global = NULL;
+}
+
+EINTERN void
+e_comp_wl_tizen_hwc_committed(void)
+{
+ const Eina_List *l, *ll, *lll;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+ 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)
+ {
+ ELOGF("TIZEN-HWC", "[Send] Commit FeedBack Committed.(%p, %p)", NULL, hwc_commit_feedback, hwc_commit_feedback->resource);
+ tizen_hwc_commit_feedback_send_committed(hwc_commit_feedback->resource,
+ hwc_commit_feedback->serial);
+ wl_resource_destroy(hwc_commit_feedback->resource);
+ }
+ }
+}
+
+EINTERN void
+e_comp_wl_tizen_hwc_discarded(void)
+{
+ const Eina_List *l, *ll, *lll;
+ E_Comp_Wl_Tizen_Hwc *tizen_hwc;
+ E_Comp_Wl_Tizen_Hwc_Commit_Feedback* hwc_commit_feedback;
+
+ 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)
+ {
+ tizen_hwc_commit_feedback_send_discarded(hwc_commit_feedback->resource,
+ hwc_commit_feedback->serial);
+ wl_resource_destroy(hwc_commit_feedback->resource);
+ }
+ }
+}
if (terror != TDM_ERROR_NONE)
{
EHWSERR("fail to tdm_output_commit", hwc);
+ /* send tizen_hwc_commit feedback discarded */
+ e_comp_wl_tizen_hwc_discarded();
goto fail;
}
+ /* send tizen_hwc_commit feedback committed */
+ e_comp_wl_tizen_hwc_committed();
+
hwc->pp_output_commit_data = data;
return EINA_TRUE;
if (terror != TDM_ERROR_NONE)
{
EHWSERR("fail to tdm_hwc_commit", hwc);
+ /* send tizen_hwc_commit feedback discarded */
+ e_comp_wl_tizen_hwc_discarded();
return EINA_FALSE;
}
+ /* send tizen_hwc_commit feedback committed */
+ e_comp_wl_tizen_hwc_committed();
+
hwc->wait_commit = EINA_TRUE;
return EINA_TRUE;
if (error != TDM_ERROR_NONE)
{
EHWSERR("tdm_hwc_commit failed.", hwc);
+ /* send tizen_hwc_commit feedback discarded */
+ e_comp_wl_tizen_hwc_discarded();
_e_hwc_windows_commit_handler(hwc->thwc, 0, 0, 0, hwc);
return EINA_FALSE;
}
+ /* send tizen_hwc_commit feedback committed */
+ e_comp_wl_tizen_hwc_committed();
+
return EINA_TRUE;
}
if (error != TDM_ERROR_NONE)
{
EHWSERR("tdm_hwc_commit failed.", hwc);
+ /* send tizen_hwc_commit feedback discarded */
+ e_comp_wl_tizen_hwc_discarded();
_e_hwc_windows_commit_handler(hwc->thwc, 0, 0, 0, hwc);
goto fail;
}
+
+ /* send tizen_hwc_commit feedback committed */
+ e_comp_wl_tizen_hwc_committed();
}
return EINA_TRUE;