From 89ef2f449c54009806dd8f37bf61b1b80960f468 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 11 May 2020 18:28:24 +0900 Subject: [PATCH] implemenation the tizen_hwc interface The tizen_hwc interface has the commit request. The compositor has to send the wl_callback done event when the tdm_hwc_commit is executed. Change-Id: I07be36d7d36c3d0ac844410ca81309808cd264b5 --- configure.ac | 2 +- packaging/enlightenment.spec | 1 + src/bin/Makefile.mk | 2 + src/bin/e_comp_screen.c | 10 ++ src/bin/e_comp_wl.h | 5 + src/bin/e_comp_wl_tizen_hwc.c | 237 ++++++++++++++++++++++++++++++++++ src/bin/e_comp_wl_tizen_hwc.h | 13 ++ src/bin/e_hwc_windows.c | 20 +++ src/bin/e_includes.h | 1 + 9 files changed, 290 insertions(+), 1 deletion(-) create mode 100644 src/bin/e_comp_wl_tizen_hwc.c create mode 100644 src/bin/e_comp_wl_tizen_hwc.h diff --git a/configure.ac b/configure.ac index cd53a21278..f9ae583353 100755 --- a/configure.ac +++ b/configure.ac @@ -369,7 +369,7 @@ AC_MSG_RESULT([${have_shm_open}]) AC_SUBST(SHM_OPEN_LIBS) if test "x${e_cv_want_wayland_only}" != "xno" || test "x${e_cv_want_wayland_clients}" != "xno";then - PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server tizen-dpms-server eom-server presentation-time-server], + PKG_CHECK_MODULES([WAYLAND], [wayland-server >= 1.8.0 xkbcommon uuid xdg-shell-unstable-v5-server xdg-shell-unstable-v6-server tizen-remote-surface-server scaler-server screenshooter-server tizen-extension-server tizen-launch-server tizen-surface-server tizen-dpms-server eom-server presentation-time-server tizen-hwc-server], [ have_wayland=yes AC_DEFINE_UNQUOTED([HAVE_WAYLAND],[1],[enable wayland support]) diff --git a/packaging/enlightenment.spec b/packaging/enlightenment.spec index 76d743add7..289b02c201 100644 --- a/packaging/enlightenment.spec +++ b/packaging/enlightenment.spec @@ -54,6 +54,7 @@ BuildRequires: pkgconfig(pixman-1) BuildRequires: systemd-devel BuildRequires: pkgconfig(libinput) BuildRequires: pkgconfig(presentation-time-server) +BuildRequires: pkgconfig(tizen-hwc-server) Requires: libwayland-extension-server # for recording video in enlightenment_info diff --git a/src/bin/Makefile.mk b/src/bin/Makefile.mk index 5e060b2ace..80ab3c06fb 100644 --- a/src/bin/Makefile.mk +++ b/src/bin/Makefile.mk @@ -105,6 +105,7 @@ src/bin/e_comp_wl_tbm.h endif ENLIGHTENMENTHEADERS += \ +src/bin/e_comp_wl_tizen_hwc.h \ src/bin/e_presentation_time.h \ src/bin/e_comp_wl_rsm.h \ src/bin/video/e_comp_wl_video.h \ @@ -228,6 +229,7 @@ src/bin/e_comp_wl_tbm.c endif enlightenment_src += \ +src/bin/e_comp_wl_tizen_hwc.c \ src/bin/e_presentation_time.c \ src/bin/e_comp_wl_rsm.c \ src/bin/video/e_comp_wl_video.c \ diff --git a/src/bin/e_comp_screen.c b/src/bin/e_comp_screen.c index f7cd6dc0b3..22f0c40a02 100644 --- a/src/bin/e_comp_screen.c +++ b/src/bin/e_comp_screen.c @@ -1142,6 +1142,13 @@ e_comp_screen_init() goto failed_comp_screen; } + if (!e_comp_wl_tizen_hwc_init()) + { + e_main_ts_end("\e_comp_wl_tizen_hwc_init Init Failed"); + e_error_message_show(_("Enlightenment cannot initialize tizen_hwc!\n")); + goto failed_comp_screen; + } + e_main_ts_begin("\tDBUS Init"); dbus_init_done_handler = NULL; if (e_dbus_conn_init() > 0) @@ -1162,6 +1169,7 @@ e_comp_screen_init() failed_comp_screen: + e_comp_wl_tizen_hwc_shutdown(); e_input_shutdown(); _e_comp_screen_engine_deinit(); @@ -1174,6 +1182,8 @@ e_comp_screen_shutdown() if (!e_comp) return; if (!e_comp->e_comp_screen) return; + e_comp_wl_tizen_hwc_shutdown(); + if (e_comp_screen_iface) { eldbus_service_interface_unregister(e_comp_screen_iface); diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index 3b113815cc..c0d21439ad 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -359,6 +359,11 @@ struct _E_Comp_Wl_Data struct wl_global *global; } video; + struct + { + struct wl_global *global; + } tizen_hwc; + Eina_List *outputs; Ecore_Fd_Handler *fd_hdlr; diff --git a/src/bin/e_comp_wl_tizen_hwc.c b/src/bin/e_comp_wl_tizen_hwc.c new file mode 100644 index 0000000000..830bd74cbb --- /dev/null +++ b/src/bin/e_comp_wl_tizen_hwc.c @@ -0,0 +1,237 @@ +#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); + } + } +} diff --git a/src/bin/e_comp_wl_tizen_hwc.h b/src/bin/e_comp_wl_tizen_hwc.h new file mode 100644 index 0000000000..71ce658a2b --- /dev/null +++ b/src/bin/e_comp_wl_tizen_hwc.h @@ -0,0 +1,13 @@ +#ifdef E_TYPEDEFS + +#else +# ifndef E_COMP_WL_TIZEN_HWC_H +# define E_COMP_WL_TIZEN_HWC_H + +EINTERN Eina_Bool e_comp_wl_tizen_hwc_init(void); +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); + +# endif +#endif diff --git a/src/bin/e_hwc_windows.c b/src/bin/e_hwc_windows.c index d11b1f9b86..3825dacff1 100644 --- a/src/bin/e_hwc_windows.c +++ b/src/bin/e_hwc_windows.c @@ -1447,9 +1447,14 @@ _e_hwc_windows_pp_output_data_commit(E_Hwc *hwc, E_Hwc_Window_Commit_Data *data) 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; @@ -1748,9 +1753,14 @@ _e_hwc_windows_pp_commit(E_Hwc *hwc) 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; @@ -2978,10 +2988,15 @@ _e_hwc_windows_ext_pp_output_commit(E_Hwc *hwc, tbm_surface_h tsurface, E_Output 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; } @@ -3355,9 +3370,14 @@ e_hwc_windows_commit(E_Hwc *hwc, E_Output_Display_Mode display_mode) 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; diff --git a/src/bin/e_includes.h b/src/bin/e_includes.h index 24420fdb7a..43eea7487c 100644 --- a/src/bin/e_includes.h +++ b/src/bin/e_includes.h @@ -95,3 +95,4 @@ #include "e_msg.h" #include "e_desk_group.h" #include "e_comp_wl_capture.h" +#include "e_comp_wl_tizen_hwc.h" -- 2.34.1