video: Now 'E_Video_Hwc' handles buffer_show(). 15/204515/1
authorSeunghun Lee <shiin.lee@samsung.com>
Fri, 19 Apr 2019 08:11:48 +0000 (17:11 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Wed, 24 Apr 2019 06:34:17 +0000 (15:34 +0900)
Change-Id: I8594ba74b876819ec1ea786c0f036c0740c8bd27

src/bin/video/iface/e_video_hwc.c
src/bin/video/iface/e_video_hwc.h
src/bin/video/iface/e_video_hwc_planes.c
src/bin/video/iface/e_video_hwc_windows.c

index 2c898989ccb53b3009eb4e79ef1aa85cbd8fcbf1..0caeb2b1d13a33ec36ab99aee0ee839aaf147717 100644 (file)
 #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)
@@ -42,10 +183,10 @@ _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)
@@ -202,7 +343,7 @@ _e_video_hwc_hide(E_Video_Hwc *evh)
    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);
 }
 
@@ -409,10 +550,7 @@ _e_video_hwc_pp_cb_done(tdm_pp *pp, tbm_surface_h sb, tbm_surface_h db, void *us
         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
      {
@@ -880,7 +1018,7 @@ _e_video_hwc_pp_buffer_cb_free(E_Comp_Wl_Video_Buf *vbuf, void *data)
 
    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);
 }
@@ -921,7 +1059,7 @@ _e_video_hwc_pp_buffer_get(E_Video_Hwc *evh, int width, int height)
              if (evh->pp_buffer_list)
                NEVER_GET_HERE();
 
-             if (evh->waiting_list)
+             if (evh->bqueue)
                NEVER_GET_HERE();
           }
      }
@@ -1035,10 +1173,7 @@ _e_video_hwc_render(E_Video_Hwc *evh, const char *func)
         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;
@@ -1506,12 +1641,7 @@ _e_video_hwc_show(E_Video_Hwc *evh)
 
    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
@@ -1580,53 +1710,6 @@ e_video_hwc_iface_create(E_Client *ec)
    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)
 {
@@ -1638,3 +1721,9 @@ e_video_hwc_show(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);
+}
index c7180401e4a359b4a40537710fa08ce0b875e3f9..2367086aef8aac8e50e393d1eba23223965bf53e 100644 (file)
@@ -68,7 +68,7 @@ struct _E_Video_Hwc
     * And when it's committed, it will be moved to committed_list.
     * Finally when the commit handler is called, it will become current_fb.
     */
-   Eina_List    *waiting_list;   /* buffers which are not committed yet */
+   Eina_List    *bqueue;   /* A queue for buffer which will have to be committed next time. */
    Eina_List    *committed_list; /* buffers which are committed, but not shown on screen yet */
    E_Comp_Wl_Video_Buf *current_fb;     /* buffer which is showing on screen currently */
 
@@ -84,6 +84,7 @@ EINTERN void         e_video_hwc_planes_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_
 EINTERN Eina_Bool    e_video_hwc_planes_frame_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf);
 EINTERN Eina_Bool    e_video_hwc_planes_check_if_pp_needed(E_Video_Hwc *evh);
 EINTERN Eina_Bool    e_video_hwc_planes_properties_commit(E_Video_Hwc *evh);
+EINTERN Eina_Bool    e_video_hwc_planes_commit_available_check(E_Video_Hwc *evh);
 EINTERN tbm_surface_h   e_video_hwc_planes_displaying_buffer_get(E_Video_Hwc *evh);
 
 EINTERN E_Video_Hwc *e_video_hwc_windows_create(void);
@@ -91,10 +92,12 @@ EINTERN Eina_Bool    e_video_hwc_windows_init(E_Video_Hwc *evh);
 EINTERN void         e_video_hwc_windows_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf, unsigned int transform);
 EINTERN Eina_Bool    e_video_hwc_windows_frame_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf);
 EINTERN Eina_Bool    e_video_hwc_windows_check_if_pp_needed(E_Video_Hwc *evh);
+EINTERN Eina_Bool    e_video_hwc_windows_commit_available_check(E_Video_Hwc *evh);
 EINTERN tbm_surface_h   e_video_hwc_windows_displaying_buffer_get(E_Video_Hwc *evh);
 
 EINTERN void         e_video_hwc_show(E_Video_Hwc *evh);
 EINTERN void         e_video_hwc_render(E_Video_Hwc *evh, const char *func);
+EINTERN void         e_video_hwc_wait_buffer_commit(E_Video_Hwc *evh);
 EINTERN Eina_Bool    e_video_hwc_can_commit(E_Video_Hwc *evh);
 EINTERN Eina_Bool    e_video_hwc_commit_done(E_Video_Hwc *evh);
 
index d1af3634e3de24ffc9d8653c68bf7c566ff3ba93..6cb3aaef5b18affb2d4270d46e3f77ebcc57dc4c 100644 (file)
@@ -298,35 +298,6 @@ _e_video_hwc_planes_cb_commit_handler(tdm_layer *layer, unsigned int sequence,
    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,
@@ -341,8 +312,7 @@ _e_video_hwc_planes_cb_vblank_handler(tdm_output *output, unsigned int sequence,
 
    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
@@ -356,8 +326,7 @@ _e_video_hwc_planes_cb_eplane_video_set_hook(void *data, E_Plane *plane)
 
    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
@@ -477,26 +446,6 @@ _e_video_hwc_planes_frame_buffer_show(E_Video_Hwc_Planes *evhp, E_Comp_Wl_Video_
    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)
 {
@@ -1163,15 +1112,6 @@ e_video_hwc_planes_frame_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbuf
    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)
 {
@@ -1231,3 +1171,12 @@ need_pp:
    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);
+}
index 2b28c1c74655e010564a15e75b98757203b05f7e..e52dfaa93815fb173d611ece2f20ffc0b7f054fa 100644 (file)
@@ -27,16 +27,17 @@ struct _E_Video_Hwc_Windows
      } 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
@@ -141,54 +142,6 @@ _e_video_frame_buffer_show(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_Buf *vbuf)
    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)
 {
@@ -538,15 +491,6 @@ e_video_hwc_windows_frame_buffer_show(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *vbu
    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)
 {
@@ -603,3 +547,12 @@ need_pp:
 
    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;
+}