From a14f2dbc2cf336f922675eb69f6c44dabbc2d01c Mon Sep 17 00:00:00 2001 From: Doyoun Kang Date: Wed, 4 Nov 2020 20:57:25 +0900 Subject: [PATCH] Revert "video: Destroy hwc interface explicitly when rendering is failed." This reverts commit 35e41776c77705c2c37fee10ef7ccbbb73514f93. Change-Id: Ia462d44af3f7905d0745fe3b442fec9772e25c5a --- src/bin/video/e_client_video.c | 11 ++++++++--- src/bin/video/e_video_internal.h | 5 +++-- src/bin/video/iface/e_video_hwc.c | 24 ++++++++++-------------- src/bin/video/iface/e_video_hwc.h | 7 ------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/src/bin/video/e_client_video.c b/src/bin/video/e_client_video.c index db789f2b9c..bddef2fc2c 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 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 diff --git a/src/bin/video/e_video_internal.h b/src/bin/video/e_video_internal.h index 82519e6dc0..7aeba90131 100644 --- a/src/bin/video/e_video_internal.h +++ b/src/bin/video/e_video_internal.h @@ -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 { diff --git a/src/bin/video/iface/e_video_hwc.c b/src/bin/video/iface/e_video_hwc.c index 8c5c674c12..a28ac107e5 100644 --- a/src/bin/video/iface/e_video_hwc.c +++ b/src/bin/video/iface/e_video_hwc.c @@ -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; } diff --git a/src/bin/video/iface/e_video_hwc.h b/src/bin/video/iface/e_video_hwc.h index 6a443c1e81..898400aa65 100644 --- a/src/bin/video/iface/e_video_hwc.h +++ b/src/bin/video/iface/e_video_hwc.h @@ -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 */ -- 2.34.1