video: Destroy hwc interface explicitly when rendering is failed. 82/244582/4
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 11 Sep 2020 08:33:01 +0000 (17:33 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Mon, 26 Oct 2020 05:50:03 +0000 (14:50 +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: I14b5672301aa81f20c49371eed015387de06f866

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 bddef2f..db789f2 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 7aeba90..82519e6 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 0725933..cfedf71 100644 (file)
@@ -1162,7 +1162,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;
@@ -1188,10 +1187,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);
@@ -1819,6 +1821,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);
 }
 
@@ -2041,11 +2049,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)
 {
@@ -2055,5 +2059,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 898400a..6a443c1 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 */