implemenation the tizen_hwc interface 94/234994/7
authorSooChan Lim <sc1.lim@samsung.com>
Mon, 11 May 2020 09:28:24 +0000 (18:28 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Wed, 3 Jun 2020 02:35:20 +0000 (02:35 +0000)
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
packaging/enlightenment.spec
src/bin/Makefile.mk
src/bin/e_comp_screen.c
src/bin/e_comp_wl.h
src/bin/e_comp_wl_tizen_hwc.c [new file with mode: 0644]
src/bin/e_comp_wl_tizen_hwc.h [new file with mode: 0644]
src/bin/e_hwc_windows.c
src/bin/e_includes.h

index cd53a21..f9ae583 100755 (executable)
@@ -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])
index 76d743a..289b02c 100644 (file)
@@ -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
index 5e060b2..80ab3c0 100644 (file)
@@ -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 \
index f7cd6dc..22f0c40 100644 (file)
@@ -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);
index 3b11381..c0d2143 100644 (file)
@@ -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 (file)
index 0000000..830bd74
--- /dev/null
@@ -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 (file)
index 0000000..71ce658
--- /dev/null
@@ -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
index d11b1f9..3825dac 100644 (file)
@@ -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;
index 24420fd..43eea74 100644 (file)
@@ -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"