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;
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:
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
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
{
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))
{
- 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);
{
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. 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)
{
if (!evh)
return;
- evh->render_fail_cb = func;
+ evh->render_fail.cb = func;
}