video: Fix starvation of wl_buffer::release for video surface 18/252418/1 submit/tizen/20210129.065141
authorSeunghun Lee <shiin.lee@samsung.com>
Thu, 28 Jan 2021 00:32:26 +0000 (09:32 +0900)
committerSeunghun Lee <shiin.lee@samsung.com>
Thu, 28 Jan 2021 01:06:55 +0000 (10:06 +0900)
This change drops reference count on wl_buffer when null wl_buffer is
newly attached on wl_surface. It would eventually send
wl_buffer::release.

Change-Id: Iddc829e77889dc0317aaa69e9c01775a189abfdc

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

index f7b9008..78d53fd 100644 (file)
@@ -666,10 +666,8 @@ _e_video_hwc_current_fb_update(E_Video_Hwc *evh)
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(evh, EINA_FALSE);
 
-   if (!evh->committed_vbuf)
-     return EINA_FALSE;
-
-   if (_e_video_hwc_can_commit(evh))
+   if ((evh->committed_vbuf) &&
+       (_e_video_hwc_can_commit(evh)))
      {
         displaying_buffer = evh->backend.displaying_buffer_get(evh);
 
@@ -778,24 +776,25 @@ _e_video_hwc_hide(E_Video_Hwc *evh)
 {
    E_Comp_Wl_Video_Buf *vbuf;
 
-   if (evh->current_fb || evh->committed_vbuf)
-     evh->backend.buffer_commit(evh, NULL);
-
-   if (evh->current_fb)
+   if ((evh->current_fb) || (evh->committed_vbuf))
      {
-        e_comp_wl_video_buffer_set_use(evh->current_fb, EINA_FALSE);
-        evh->current_fb = NULL;
+        if (evh->current_fb)
+          e_comp_wl_video_buffer_set_use(evh->current_fb, EINA_FALSE);
+
+        if (evh->committed_vbuf)
+          {
+             e_comp_wl_video_buffer_set_use(evh->committed_vbuf, EINA_FALSE);
+             e_comp_wl_buffer_reference(&evh->committed_vbuf->buffer_ref,
+                                        NULL);
+             evh->committed_vbuf = NULL;
+          }
+
+        evh->backend.buffer_commit(evh, NULL);
      }
 
    if (evh->old_comp_buffer)
      evh->old_comp_buffer = NULL;
 
-   if (evh->committed_vbuf)
-     {
-        e_comp_wl_video_buffer_set_use(evh->committed_vbuf, EINA_FALSE);
-        evh->committed_vbuf = NULL;
-     }
-
    EINA_LIST_FREE(evh->bqueue, vbuf)
       e_comp_wl_video_buffer_set_use(vbuf, EINA_FALSE);
 }
index 1c8f8ba..fc00c01 100644 (file)
@@ -25,6 +25,12 @@ struct _E_Video_Hwc_Windows
 static Eina_Bool
 _e_video_hwc_windows_commit_data_set(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_Buf *vbuf)
 {
+   if (!vbuf)
+     {
+        evhw->commit_data.buffer = NULL;
+        goto end;
+     }
+
    if ((evhw->commit_data.info.src_config.size.h == vbuf->width_from_pitch) &&
        (evhw->commit_data.info.src_config.size.v == vbuf->height_from_size) &&
        (evhw->commit_data.info.src_config.pos.x == vbuf->content_r.x) &&
@@ -66,6 +72,7 @@ _e_video_hwc_windows_commit_data_set(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_
    /* Set buffer */
    evhw->commit_data.buffer = vbuf->tbm_surface;
 
+end:
    /* Set flag to wait until commit data is released. Otherwise, it maybe loses
     * frame buffer. */
    evhw->commit_data.wait_release = EINA_TRUE;
@@ -76,7 +83,7 @@ _e_video_hwc_windows_commit_data_set(E_Video_Hwc_Windows *evhw, E_Comp_Wl_Video_
        e_client_util_name_get(evhw->base.ec) ?: "No Name" ,
        evhw->base.ec->netwm.pid,
        wl_resource_get_id(evhw->base.ec->comp_data->surface),
-       vbuf, vbuf->ref_cnt,
+       vbuf, (vbuf ? vbuf->ref_cnt : 0),
        evhw->commit_data.info.src_config.size.h,
        evhw->commit_data.info.src_config.size.v,
        evhw->commit_data.info.src_config.pos.x,
@@ -207,8 +214,6 @@ _e_video_hwc_windows_iface_buffer_commit(E_Video_Hwc *evh, E_Comp_Wl_Video_Buf *
 
    /* show means that set the information of the buffer and the info of the hwc window */
 
-   if (!vbuf) return EINA_TRUE;
-
    ret = _e_video_hwc_windows_commit_data_set(evhw, vbuf);
 
    // TODO:: this logic move to the hwc windows after hwc commit