From: Seunghun Lee Date: Thu, 28 Jan 2021 00:32:26 +0000 (+0900) Subject: video: Fix starvation of wl_buffer::release for video surface X-Git-Tag: submit/tizen_6.0/20210130.024845~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0e2cec565565cbd7bd1cfebbf8e28db62cae3b94;p=platform%2Fupstream%2Fenlightenment.git video: Fix starvation of wl_buffer::release for video surface 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 --- diff --git a/src/bin/video/iface/e_video_hwc.c b/src/bin/video/iface/e_video_hwc.c index f27a6d5b8c..49c017c0c7 100644 --- a/src/bin/video/iface/e_video_hwc.c +++ b/src/bin/video/iface/e_video_hwc.c @@ -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); } diff --git a/src/bin/video/iface/e_video_hwc_windows.c b/src/bin/video/iface/e_video_hwc_windows.c index c5ce0b5f87..28d25cbefb 100644 --- a/src/bin/video/iface/e_video_hwc_windows.c +++ b/src/bin/video/iface/e_video_hwc_windows.c @@ -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, @@ -206,8 +213,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