video: Destroy hwc interface explicitly when rendering is failed. 86/247486/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 11 Sep 2020 08:33:01 +0000 (17:33 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 11 Nov 2020 06:24:35 +0000 (15:24 +0900)
It's better to destroy interface explicitly at where it is created.
Therefore there is no need to return boolean value and leave an
extra description for how behavior will be changed according to
return value.

Change-Id: Ia0d828c9e16ce96556d46a2535ff9c1c1f9048b5

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 bddef2fc2c3fb701acedb88e1ce9504834989dbd..db789f2b9c0a6ceb2a269a1cd40c1e09cf7f7b66 100644 (file)
@@ -40,7 +40,7 @@ _e_client_video_comp_iface_deinit(E_Client_Video *ecv)
    ecv->iface = NULL;
 }
 
-static Eina_Bool
+static void
 _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 EINA_FALSE;
+        return;
      }
 
    /* workaround:
@@ -67,13 +67,8 @@ _e_client_video_cb_hwc_render_fail(E_Client_Video *ecv)
         e_comp_wl_surface_commit(ecv->ec);
      }
 
-   /* 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->destroy(ecv->iface);
    ecv->iface = new_iface;
-
-   return EINA_TRUE;
 }
 
 static Eina_Bool
index 7aeba901313b720ab3c5f0dedf5381a32288a3bf..82519e6dc01c364eb1eb084c5bfa5d23856671ed 100644 (file)
@@ -34,9 +34,8 @@
 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.
- * 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);
+/* A callback which is called when HWC backend fails to render buffer. */
+typedef void (*E_Video_Hwc_Render_Fail_Cb)(E_Client_Video *ecv);
 
 struct _E_Video_Comp_Iface
 {
index a28ac107e558c0830dd2d075bf00f480b0153b2b..8c5c674c12bd681a0abba3ee1af71b954fdab6b2 100644 (file)
@@ -1171,7 +1171,6 @@ _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;
@@ -1197,10 +1196,13 @@ _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))
      {
-        res = evh->render_fail_cb(evh->ecv);
-        if (res)
+        evh->render_fail.walking = EINA_TRUE;
+        evh->render_fail.cb(evh->ecv);
+        evh->render_fail.walking = EINA_FALSE;
+
+        if (evh->deleted)
           {
              VIN("Delete HWC interface", evh->ec);
              _e_video_hwc_del(evh);
@@ -1828,6 +1830,12 @@ _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);
 }
 
@@ -2050,11 +2058,7 @@ 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. 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. */
+ * composition interface to another one. */
 EINTERN void
 e_video_hwc_render_fail_callback_set(E_Video_Comp_Iface *iface, E_Video_Hwc_Render_Fail_Cb func)
 {
@@ -2064,5 +2068,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 898400aa65c6578f13232646e02aaba1a5005d8a..6a443c1e81ae66f237a5ae006a292933c338fbdd 100644 (file)
@@ -102,7 +102,14 @@ 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 */