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;
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:
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
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
{
E_Client *topmost;
Eina_Bool render = EINA_FALSE;
Eina_Bool render_fail = EINA_FALSE;
+ Eina_Bool res;
evh = data;
evh->render.job = NULL;
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);
{
IFACE_ENTRY;
- if (evh->render_fail.walking)
- {
- evh->deleted = EINA_TRUE;
- return;
- }
-
_e_video_hwc_del(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)
{
if (!evh)
return;
- evh->render_fail.cb = func;
+ evh->render_fail_cb = func;
}