From: Seunghun Lee Date: Fri, 11 Sep 2020 08:33:01 +0000 (+0900) Subject: video: Destroy hwc interface explicitly when rendering is failed. X-Git-Tag: submit/tizen/20201111.090326~15 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=17150d715e113085dc4201967bd62c44d266a3af;p=platform%2Fupstream%2Fenlightenment.git video: Destroy hwc interface explicitly when rendering is failed. 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 --- diff --git a/src/bin/video/e_client_video.c b/src/bin/video/e_client_video.c index bddef2fc2c..db789f2b9c 100644 --- a/src/bin/video/e_client_video.c +++ b/src/bin/video/e_client_video.c @@ -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 diff --git a/src/bin/video/e_video_internal.h b/src/bin/video/e_video_internal.h index 7aeba90131..82519e6dc0 100644 --- a/src/bin/video/e_video_internal.h +++ b/src/bin/video/e_video_internal.h @@ -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 { diff --git a/src/bin/video/iface/e_video_hwc.c b/src/bin/video/iface/e_video_hwc.c index a28ac107e5..8c5c674c12 100644 --- a/src/bin/video/iface/e_video_hwc.c +++ b/src/bin/video/iface/e_video_hwc.c @@ -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; } diff --git a/src/bin/video/iface/e_video_hwc.h b/src/bin/video/iface/e_video_hwc.h index 898400aa65..6a443c1e81 100644 --- a/src/bin/video/iface/e_video_hwc.h +++ b/src/bin/video/iface/e_video_hwc.h @@ -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 */