Revert "video: Destroy hwc interface explicitly when rendering is failed." 53/246853/1 accepted/tizen/unified/20201105.124332 submit/tizen/20201105.050753
authorDoyoun Kang <doyoun.kang@samsung.com>
Wed, 4 Nov 2020 11:57:25 +0000 (20:57 +0900)
committerDoyoun Kang <doyoun.kang@samsung.com>
Wed, 4 Nov 2020 11:57:29 +0000 (20:57 +0900)
This reverts commit 35e41776c77705c2c37fee10ef7ccbbb73514f93.

Change-Id: Ia462d44af3f7905d0745fe3b442fec9772e25c5a

src/bin/video/e_client_video.c
src/bin/video/e_video_internal.h
src/bin/video/iface/e_video_hwc.c
src/bin/video/iface/e_video_hwc.h

index db789f2b9c0a6ceb2a269a1cd40c1e09cf7f7b66..bddef2fc2c3fb701acedb88e1ce9504834989dbd 100644 (file)
@@ -40,7 +40,7 @@ _e_client_video_comp_iface_deinit(E_Client_Video *ecv)
    ecv->iface = NULL;
 }
 
-static void
+static Eina_Bool
 _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
 {
    E_Video_Comp_Iface *new_iface;
@@ -55,7 +55,7 @@ _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
         VER("Failed to create fallback interface", ecv->ec);
         /* It does maintain HWC interface since creating fallback interface has
          * been failed. */
-        return;
+        return EINA_FALSE;
      }
 
    /* workaround:
@@ -67,8 +67,13 @@ _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
         e_comp_wl_surface_commit(ecv->ec);
      }
 
-   ecv->iface->destroy(ecv->iface);
+   /* NOTE:
+    * Existing instance 'E_Video_Comp_Iface' for HWC will be freed by HWC
+    * implementation once here it returns EINA_TRUE.
+    * So, just set new interface and DO NOT destroy existing iface here. */
    ecv->iface = new_iface;
+
+   return EINA_TRUE;
 }
 
 static Eina_Bool
index 82519e6dc01c364eb1eb084c5bfa5d23856671ed..7aeba901313b720ab3c5f0dedf5381a32288a3bf 100644 (file)
@@ -34,8 +34,9 @@
 typedef struct _E_Client_Video E_Client_Video;
 typedef struct _E_Video_Comp_Iface E_Video_Comp_Iface;
 
-/* A callback which is called when HWC backend fails to render buffer. */
-typedef void (*E_Video_Hwc_Render_Fail_Cb)(E_Client_Video *ecv);
+/* A callback which is called when HWC backend fails to render buffer.
+ * HWC iface will destroy its instance by itself if callee returns TRUE. */
+typedef Eina_Bool (*E_Video_Hwc_Render_Fail_Cb)(E_Client_Video *ecv);
 
 struct _E_Video_Comp_Iface
 {
index 8c5c674c12bd681a0abba3ee1af71b954fdab6b2..a28ac107e558c0830dd2d075bf00f480b0153b2b 100644 (file)
@@ -1171,6 +1171,7 @@ _e_video_hwc_render_job(void *data)
    E_Client *topmost;
    Eina_Bool render = EINA_FALSE;
    Eina_Bool render_fail = EINA_FALSE;
+   Eina_Bool res;
 
    evh = data;
    evh->render.job = NULL;
@@ -1196,13 +1197,10 @@ _e_video_hwc_render_job(void *data)
         render_fail = !_e_video_hwc_render(evh, __FUNCTION__);
      }
 
-   if ((render_fail) && (evh->render_fail.cb))
+   if ((render_fail) && (evh->render_fail_cb))
      {
-        evh->render_fail.walking = EINA_TRUE;
-        evh->render_fail.cb(evh->ecv);
-        evh->render_fail.walking = EINA_FALSE;
-
-        if (evh->deleted)
+        res = evh->render_fail_cb(evh->ecv);
+        if (res)
           {
              VIN("Delete HWC interface", evh->ec);
              _e_video_hwc_del(evh);
@@ -1830,12 +1828,6 @@ _e_video_hwc_iface_destroy(E_Video_Comp_Iface *iface)
 {
    IFACE_ENTRY;
 
-   if (evh->render_fail.walking)
-     {
-        evh->deleted = EINA_TRUE;
-        return;
-     }
-
    _e_video_hwc_del(evh);
 }
 
@@ -2058,7 +2050,11 @@ e_video_hwc_client_mask_update(E_Video_Hwc *evh)
  *
  * This function will be called if rendering is failed.
  * Once this callback funtion has been called, callee will try to replace its
- * composition interface to another one. */
+ * composition interface to another one. And then callee will return TRUE if
+ * the interface is changed successfully.
+ *
+ * @note For this reason described above, it has to free all of resources if
+ * it gets TRUE as a return value. */
 EINTERN void
 e_video_hwc_render_fail_callback_set(E_Video_Comp_Iface *iface, E_Video_Hwc_Render_Fail_Cb func)
 {
@@ -2068,5 +2064,5 @@ e_video_hwc_render_fail_callback_set(E_Video_Comp_Iface *iface, E_Video_Hwc_Rend
    if (!evh)
      return;
 
-   evh->render_fail.cb = func;
+   evh->render_fail_cb = func;
 }
index 6a443c1e81ae66f237a5ae006a292933c338fbdd..898400aa65c6578f13232646e02aaba1a5005d8a 100644 (file)
@@ -102,14 +102,7 @@ struct _E_Video_Hwc
         Eina_Bool topmost_viewport;
      } render;
 
-   struct
-     {
-        E_Video_Hwc_Render_Fail_Cb cb;
-        Eina_Bool walking;
-     } render_fail;
-
    Eina_Bool  need_force_render;
-   Eina_Bool  deleted;
 };
 
 /* Functions for HWC */