#define IS_RGB(f) ((f) == TBM_FORMAT_XRGB8888 || (f) == TBM_FORMAT_ARGB8888)
static void _e_video_hwc_render(E_Video_Hwc *evh, const char *func);
+static void _e_video_hwc_buffer_commit(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf);
+
+static Eina_Bool
+_e_video_hwc_current_fb_update(E_Video_Hwc *evh)
+{
+ Eina_List *l;
+ E_Comp_Wl_Video_Buf *vbuf;
+ tbm_surface_h displaying_buffer;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(evh, EINA_FALSE);
+
+ if (!evh->committed_list)
+ return EINA_FALSE;
+
+ if (e_video_hwc_can_commit(evh))
+ {
+ if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+ displaying_buffer = e_video_hwc_planes_displaying_buffer_get(evh);
+ else
+ displaying_buffer = e_video_hwc_windows_displaying_buffer_get(evh);
+
+ EINA_LIST_FOREACH(evh->committed_list, l, vbuf)
+ {
+ if (vbuf->tbm_surface == displaying_buffer) break;
+ }
+ if (!vbuf)
+ return EINA_FALSE;
+ }
+ else
+ vbuf = eina_list_nth(evh->committed_list, 0);
+
+ evh->committed_list = eina_list_remove(evh->committed_list, vbuf);
+
+ /* client can attachs the same wl_buffer twice. */
+ if (evh->current_fb && VBUF_IS_VALID(evh->current_fb) && vbuf != evh->current_fb)
+ {
+ e_comp_wl_video_buffer_set_use(evh->current_fb, EINA_FALSE);
+
+ if (evh->current_fb->comp_buffer)
+ e_comp_wl_buffer_reference(&evh->current_fb->buffer_ref, NULL);
+ }
+
+ evh->current_fb = vbuf;
+
+ VDB("current_fb(%d)", evh->ec, MSTAMP(evh->current_fb));
+
+ return EINA_TRUE;
+}
+
+static void
+_e_video_hwc_buffer_enqueue(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf)
+{
+ evh->bqueue = eina_list_append(evh->bqueue, vbuf);
+ VDB("There are waiting fbs more than 1", evh->ec);
+}
+
+static E_Comp_Wl_Video_Buf *
+_e_video_hwc_buffer_dequeue(E_Video_Hwc *evh)
+{
+ E_Comp_Wl_Video_Buf *vbuf;
+
+ if (!evh->bqueue)
+ return NULL;
+
+ vbuf = eina_list_nth(evh->bqueue, 0);
+ evh->bqueue = eina_list_remove(evh->bqueue, vbuf);
+
+ return vbuf;
+}
+
+static void
+_e_video_hwc_wait_buffer_commit(E_Video_Hwc *evh)
+{
+ E_Comp_Wl_Video_Buf *vbuf;
+ Eina_Bool res;
+
+ vbuf = _e_video_hwc_buffer_dequeue(evh);
+ if (!vbuf)
+ return;
+
+ if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+ res = e_video_hwc_planes_commit_available_check(evh);
+ else
+ res = e_video_hwc_windows_commit_available_check(evh);
+
+ if (!res)
+ return;
+
+ _e_video_hwc_buffer_commit(evh, vbuf);
+}
+
+static void
+_e_video_hwc_buffer_commit(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf)
+{
+ Eina_Bool res;
+
+ evh->committed_list = eina_list_append(evh->committed_list, vbuf);
+
+ if (!e_video_hwc_can_commit(evh))
+ goto no_commit;
+
+ if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+ res = e_video_hwc_planes_frame_buffer_show(evh, vbuf);
+ else
+ res = e_video_hwc_windows_frame_buffer_show(evh, vbuf);
+
+ if (!res)
+ goto no_commit;
+
+ return;
+
+no_commit:
+ _e_video_hwc_current_fb_update(evh);
+ _e_video_hwc_wait_buffer_commit(evh);
+}
+
+static void
+_e_video_hwc_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform)
+{
+ Eina_Bool res;
+
+ vbuf->content_t = transform;
+
+ e_comp_wl_video_buffer_set_use(vbuf, EINA_TRUE);
+
+ if (vbuf->comp_buffer)
+ e_comp_wl_buffer_reference(&vbuf->buffer_ref, vbuf->comp_buffer);
+
+ if (evh->hwc_policy == E_HWC_POLICY_PLANES)
+ res = e_video_hwc_planes_commit_available_check(evh);
+ else
+ res = e_video_hwc_windows_commit_available_check(evh);
+
+ if (!res)
+ {
+ _e_video_hwc_buffer_enqueue(evh, vbuf);
+ return;
+ }
+
+ _e_video_hwc_buffer_commit(evh, vbuf);
+}
static void
_e_video_hwc_input_buffer_cb_free(E_Comp_Wl_Video_Buf *vbuf, void *data)
need_hide = EINA_TRUE;
}
- if (eina_list_data_find(evh->waiting_list, vbuf))
+ if (eina_list_data_find(evh->bqueue, vbuf))
{
VIN("waiting fb destroyed", evh->ec);
- evh->waiting_list = eina_list_remove(evh->waiting_list, vbuf);
+ evh->bqueue = eina_list_remove(evh->bqueue, vbuf);
}
if (need_hide)
EINA_LIST_FREE(evh->committed_list, vbuf)
e_comp_wl_video_buffer_set_use(vbuf, EINA_FALSE);
- EINA_LIST_FREE(evh->waiting_list, vbuf)
+ EINA_LIST_FREE(evh->bqueue, vbuf)
e_comp_wl_video_buffer_set_use(vbuf, EINA_FALSE);
}
e_comp_wl_video_buffer_set_use(pp_buffer, EINA_FALSE);
if (!_e_video_hwc_client_visible_get(evh->ec)) return;
- if (evh->hwc_policy == E_HWC_POLICY_PLANES)
- e_video_hwc_planes_buffer_show(evh, pp_buffer, 0);
- else
- e_video_hwc_windows_buffer_show(evh, pp_buffer, 0);
+ _e_video_hwc_buffer_show(evh, pp_buffer, 0);
}
else
{
evh->committed_list = eina_list_remove(evh->committed_list, vbuf);
- evh->waiting_list = eina_list_remove(evh->waiting_list, vbuf);
+ evh->bqueue = eina_list_remove(evh->bqueue, vbuf);
evh->pp_buffer_list = eina_list_remove(evh->pp_buffer_list, vbuf);
}
if (evh->pp_buffer_list)
NEVER_GET_HERE();
- if (evh->waiting_list)
+ if (evh->bqueue)
NEVER_GET_HERE();
}
}
input_buffer = _e_video_hwc_input_buffer_get(evh, comp_buffer, EINA_TRUE);
EINA_SAFETY_ON_NULL_GOTO(input_buffer, render_fail);
- if (evh->hwc_policy == E_HWC_POLICY_PLANES)
- e_video_hwc_planes_buffer_show(evh, input_buffer, evh->geo.tdm.transform);
- else
- e_video_hwc_windows_buffer_show(evh, input_buffer, evh->geo.tdm.transform);
+ _e_video_hwc_buffer_show(evh, input_buffer, evh->geo.tdm.transform);
evh->old_geo = evh->geo;
evh->old_comp_buffer = comp_buffer;
VIN("evas show", evh->ec);
if (evh->current_fb)
- {
- if (evh->hwc_policy == E_HWC_POLICY_PLANES)
- e_video_hwc_planes_buffer_show(evh, evh->current_fb, evh->current_fb->content_t);
- else
- e_video_hwc_windows_buffer_show(evh, evh->current_fb, evh->current_fb->content_t);
- }
+ _e_video_hwc_buffer_show(evh, evh->current_fb, evh->current_fb->content_t);
}
static void
return &evh->iface;
}
-static Eina_Bool
-_e_video_hwc_current_fb_update(E_Video_Hwc *evh)
-{
- Eina_List *l;
- E_Comp_Wl_Video_Buf *vbuf;
- tbm_surface_h displaying_buffer;
-
- EINA_SAFETY_ON_NULL_RETURN_VAL(evh, EINA_FALSE);
-
- if (!evh->committed_list)
- return EINA_FALSE;
-
- if (e_video_hwc_can_commit(evh))
- {
- if (evh->hwc_policy == E_HWC_POLICY_PLANES)
- displaying_buffer = e_video_hwc_planes_displaying_buffer_get(evh);
- else
- displaying_buffer = e_video_hwc_windows_displaying_buffer_get(evh);
-
- EINA_LIST_FOREACH(evh->committed_list, l, vbuf)
- {
- if (vbuf->tbm_surface == displaying_buffer) break;
- }
- if (!vbuf)
- return EINA_FALSE;
- }
- else
- vbuf = eina_list_nth(evh->committed_list, 0);
-
- evh->committed_list = eina_list_remove(evh->committed_list, vbuf);
-
- /* client can attachs the same wl_buffer twice. */
- if (evh->current_fb && VBUF_IS_VALID(evh->current_fb) && vbuf != evh->current_fb)
- {
- e_comp_wl_video_buffer_set_use(evh->current_fb, EINA_FALSE);
-
- if (evh->current_fb->comp_buffer)
- e_comp_wl_buffer_reference(&evh->current_fb->buffer_ref, NULL);
- }
-
- evh->current_fb = vbuf;
-
- VDB("current_fb(%d)", evh->ec, MSTAMP(evh->current_fb));
-
- return EINA_TRUE;
-}
-
EINTERN Eina_Bool
e_video_hwc_commit_done(E_Video_Hwc *evh)
{
{
_e_video_hwc_show(evh);
}
+
+EINTERN void
+e_video_hwc_wait_buffer_commit(E_Video_Hwc *evh)
+{
+ _e_video_hwc_wait_buffer_commit(evh);
+}
e_video_hwc_commit_done((E_Video_Hwc *)evhp);
}
-static void
-_e_video_hwc_planes_commit_buffer(E_Video_Hwc_Planes *evhp, E_Comp_Wl_Video_Buf *vbuf)
-{
- evhp->base.committed_list = eina_list_append(evhp->base.committed_list, vbuf);
-
- if (!e_video_hwc_can_commit((E_Video_Hwc *)evhp))
- goto no_commit;
-
- if (!_e_video_hwc_planes_frame_buffer_show(evhp, vbuf))
- goto no_commit;
-
- return;
-
-no_commit:
- _e_video_hwc_planes_cb_commit_handler(NULL, 0, 0, 0, evhp);
- _e_video_hwc_planes_cb_vblank_handler(NULL, 0, 0, 0, evhp);
-}
-
-static void
-_e_video_hwc_planes_commit_from_waiting_list(E_Video_Hwc_Planes *evhp)
-{
- E_Comp_Wl_Video_Buf *vbuf;
-
- vbuf = eina_list_nth(evhp->base.waiting_list, 0);
- evhp->base.waiting_list = eina_list_remove(evhp->base.waiting_list, vbuf);
-
- _e_video_hwc_planes_commit_buffer(evhp, vbuf);
-}
-
static void
_e_video_hwc_planes_cb_vblank_handler(tdm_output *output, unsigned int sequence,
unsigned int tv_sec, unsigned int tv_usec,
if (evhp->video_plane_ready_handler) return;
- if (evhp->base.waiting_list)
- _e_video_hwc_planes_commit_from_waiting_list(evhp);
+ e_video_hwc_wait_buffer_commit((E_Video_Hwc *)evhp);
}
static void
if (evhp->waiting_vblank) return;
- if (evhp->base.waiting_list)
- _e_video_hwc_planes_commit_from_waiting_list(evhp);
+ e_video_hwc_wait_buffer_commit((E_Video_Hwc *)evhp);
}
static Eina_Bool
return EINA_TRUE;
}
-static void
-_e_video_hwc_planes_buffer_show(E_Video_Hwc_Planes *evhp, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform)
-{
- vbuf->content_t = transform;
-
- e_comp_wl_video_buffer_set_use(vbuf, EINA_TRUE);
-
- if (vbuf->comp_buffer)
- e_comp_wl_buffer_reference(&vbuf->buffer_ref, vbuf->comp_buffer);
-
- if (evhp->waiting_vblank || evhp->video_plane_ready_handler)
- {
- evhp->base.waiting_list = eina_list_append(evhp->base.waiting_list, vbuf);
- VDB("There are waiting fbs more than 1", evhp->base.ec);
- return;
- }
-
- _e_video_hwc_planes_commit_buffer(evhp, vbuf);
-}
-
static void
_e_video_hwc_planes_cb_evas_hide(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
return _e_video_hwc_planes_frame_buffer_show(evhp, vbuf);
}
-EINTERN void
-e_video_hwc_planes_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform)
-{
- E_Video_Hwc_Planes *evhp;
-
- evhp = (E_Video_Hwc_Planes *)evh;
- _e_video_hwc_planes_buffer_show(evhp, vbuf, transform);
-}
-
EINTERN Eina_Bool
e_video_hwc_planes_check_if_pp_needed(E_Video_Hwc *evh)
{
evhp->base.pp_tbmfmt = evhp->base.tbmfmt;
return EINA_TRUE;
}
+
+EINTERN Eina_Bool
+e_video_hwc_planes_commit_available_check(E_Video_Hwc *evh)
+{
+ E_Video_Hwc_Planes *evhp;
+
+ evhp = (E_Video_Hwc_Planes *)evh;
+ return !(evhp->waiting_vblank || evhp->video_plane_ready_handler);
+}
} commit_data;
};
-static void _e_video_commit_from_waiting_list(E_Video_Hwc_Windows *evhw);
-
static void
_e_video_hwc_windows_commit_done(E_Video_Hwc_Windows *evhw)
{
- if (!e_video_hwc_commit_done((E_Video_Hwc *)evhw))
+ E_Video_Hwc *evh;
+
+ evh = (E_Video_Hwc *)evhw;
+
+ if (!e_video_hwc_commit_done(evh))
return;
- if (evhw->base.waiting_list)
- _e_video_commit_from_waiting_list(evhw);
+ e_video_hwc_wait_buffer_commit(evh);
}
static void
return EINA_TRUE;
}
-static void
-_e_video_commit_buffer(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_Buf *vbuf)
-{
- evhw->base.committed_list = eina_list_append(evhw->base.committed_list, vbuf);
-
- if (!e_video_hwc_can_commit((E_Video_Hwc *)evhw))
- goto no_commit;
-
- if (!_e_video_frame_buffer_show(evhw, vbuf))
- goto no_commit;
-
- return;
-
-no_commit:
- _e_video_hwc_windows_commit_done(evhw);
-}
-
-static void
-_e_video_commit_from_waiting_list(E_Video_Hwc_Windows *evhw)
-{
- E_Comp_Wl_Video_Buf *vbuf;
-
- vbuf = eina_list_nth(evhw->base.waiting_list, 0);
- evhw->base.waiting_list = eina_list_remove(evhw->base.waiting_list, vbuf);
-
- _e_video_commit_buffer(evhw, vbuf);
-}
-
-static void
-_e_video_buffer_show(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform)
-{
- vbuf->content_t = transform;
-
- e_comp_wl_video_buffer_set_use(vbuf, EINA_TRUE);
-
- if (vbuf->comp_buffer)
- e_comp_wl_buffer_reference(&vbuf->buffer_ref, vbuf->comp_buffer);
-
- if (evhw->commit_data.wait_release)
- {
- evhw->base.waiting_list = eina_list_append(evhw->base.waiting_list, vbuf);
- VDB("There are waiting fbs more than 1", evhw->base.ec);
- return;
- }
-
- _e_video_commit_buffer(evhw, vbuf);
-}
-
static Eina_Bool
_e_video_hwc_windows_init(E_Video_Hwc_Windows *evhw)
{
return _e_video_frame_buffer_show(evhw, vbuf);
}
-EINTERN void
-e_video_hwc_windows_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform)
-{
- E_Video_Hwc_Windows *evhw;
-
- evhw = (E_Video_Hwc_Windows *)evh;
- _e_video_buffer_show(evhw, vbuf, transform);
-}
-
EINTERN Eina_Bool
e_video_hwc_windows_check_if_pp_needed(E_Video_Hwc *evh)
{
return EINA_TRUE;
}
+
+EINTERN Eina_Bool
+e_video_hwc_windows_commit_available_check(E_Video_Hwc *evh)
+{
+ E_Video_Hwc_Windows *evhw;
+
+ evhw = (E_Video_Hwc_Windows *)evh;
+ return !evhw->commit_data.wait_release;
+}