From 406a63e3adcec82c1da32e795ff6206ceebc02a8 Mon Sep 17 00:00:00 2001 From: "joonbum.ko" Date: Wed, 27 Dec 2017 10:58:08 +0900 Subject: [PATCH] tpl_wayland_egl_thread: Modified the management of committed buffer to use sync timeline. - If tdm_fd is created for a dequeued buffer, it must be dependent on the sync timeline, not the release event. Change-Id: I66b181b1ce3b12fd7a9a076359c545a19096558b Signed-off-by: joonbum.ko --- src/tpl_wayland_egl_thread.c | 65 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 61 insertions(+), 4 deletions(-) diff --git a/src/tpl_wayland_egl_thread.c b/src/tpl_wayland_egl_thread.c index d110276..644c24c 100644 --- a/src/tpl_wayland_egl_thread.c +++ b/src/tpl_wayland_egl_thread.c @@ -150,6 +150,10 @@ struct _twe_wl_buffer_info { /* for checking released from display server */ tbm_fd sync_timeline; unsigned int sync_timestamp; + tbm_fd sync_fd; + tpl_bool_t is_vk_image; + + /* for waiting draw done */ twe_sync_draw_source *sync_draw_source; tbm_surface_h tbm_surface; @@ -1349,6 +1353,35 @@ __cb_buffer_release_callback(void *data, struct wl_proxy *wl_buffer) return; } + + if (buf_info && buf_info->is_vk_image && !buf_info->need_to_release) { + twe_wl_surf_source *surf_source = buf_info->surf_source; + + g_mutex_lock(&surf_source->free_queue_mutex); + + if (surf_source->committed_buffers) { + TPL_OBJECT_LOCK(&surf_source->obj); + __tpl_list_remove_data(surf_source->committed_buffers, + (void *)tbm_surface, + TPL_FIRST, NULL); + TPL_OBJECT_UNLOCK(&surf_source->obj); + } + + TRACE_MARK("[RELEASE] BO(%d)", + tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0))); + TRACE_ASYNC_END((int)tbm_surface, "[COMMIT ~ RELEASE] BO(%d)", + tbm_bo_export(tbm_surface_internal_get_bo( + tbm_surface, 0))); + + TPL_LOG_T(BACKEND, "[REL] wl_buffer(%p) tbm_surface(%p) bo(%d)", + buf_info->wl_buffer, tbm_surface, + tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0))); + + tbm_surface_internal_unref(tbm_surface); + + g_mutex_unlock(&surf_source->free_queue_mutex); + } + } else { TPL_ERR("Invalid parameter | tbm_surface(%p)", tbm_surface); } @@ -1405,6 +1438,7 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source, buf_info->need_to_commit = TPL_TRUE; buf_info->draw_done = TPL_FALSE; + buf_info->sync_fd = -1; if (surf_source->in_use_buffers) { TPL_OBJECT_LOCK(&surf_source->obj); @@ -1480,6 +1514,13 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source, buf_info->draw_done = TPL_FALSE; buf_info->tbm_surface = tbm_surface; buf_info->sync_draw_source = NULL; + buf_info->sync_fd = -1; + buf_info->is_vk_image = surf_source->disp_source->is_vulkan_dpy; + + if (buf_info->is_vk_image) + wayland_tbm_client_set_sync_timeline(surf_source->disp_source->wl_tbm_client, + (void *)buf_info->wl_buffer, + buf_info->sync_timeline); wl_buffer_add_listener((void *)buf_info->wl_buffer, &wl_buffer_release_listener, tbm_surface); @@ -1696,6 +1737,7 @@ _twe_thread_wl_vk_surface_commit(twe_wl_surf_source *surf_source, { twe_wl_buffer_info *buf_info = NULL; struct wl_surface *wl_surface = surf_source->surf; + tbm_surface_queue_error_e tsq_err = TBM_SURFACE_QUEUE_ERROR_NONE; tbm_surface_internal_get_user_data(tbm_surface, KEY_BUFFER_INFO, (void **)&buf_info); @@ -1719,7 +1761,6 @@ _twe_thread_wl_vk_surface_commit(twe_wl_surf_source *surf_source, tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0))); buf_info->sync_timestamp++; - buf_info->need_to_release = TPL_TRUE; TPL_LOG_T(BACKEND, "[COMMIT] wl_buffer(%p) tbm_surface(%p) bo(%d)", buf_info->wl_buffer, tbm_surface, @@ -1734,6 +1775,21 @@ _twe_thread_wl_vk_surface_commit(twe_wl_surf_source *surf_source, if (surf_source->committed_buffers) { __tpl_list_push_back(surf_source->committed_buffers, tbm_surface); } + + /* Presented buffer's sync operating dependent on tdm timeline fence. */ + if (buf_info->sync_fd != -1) { + g_mutex_lock(&surf_source->free_queue_mutex); + tsq_err = tbm_surface_queue_release(surf_source->tbm_queue, tbm_surface); + if (tsq_err != TBM_SURFACE_QUEUE_ERROR_NONE) + TPL_ERR("Failed to release tbm_surface(%p) when vk_surface_commit.", + tbm_surface); + g_cond_signal(&surf_source->free_queue_cond); + g_mutex_unlock(&surf_source->free_queue_mutex); + buf_info->need_to_release = TPL_FALSE; + } else { + /* Dependent on wl_buffer release event. */ + buf_info->need_to_release = TPL_TRUE; + } } static void @@ -1884,6 +1940,8 @@ _twe_thread_wl_surface_acquire_and_commit(twe_wl_surf_source *surf_source) _twe_thread_wl_surface_commit(surf_source, tbm_surface); } else { /* wayland_vulkan */ + twe_sync_draw_source *sync_draw_source = buf_info->sync_draw_source; + switch (surf_source->swapchain_properties.present_mode) { case TPL_DISPLAY_PRESENT_MODE_IMMEDIATE: _twe_thread_wl_vk_surface_commit(surf_source, tbm_surface); @@ -2746,15 +2804,15 @@ _twe_thread_sync_draw_source_finalize(GSource *source) source, sync_draw_source->event_fd); close(sync_draw_source->event_fd); + close(sync_draw_source->draw_fence_fd); buf_info->sync_draw_source = NULL; + sync_draw_source->draw_fence_fd = -1; sync_draw_source->tag = NULL; sync_draw_source->event_fd = -1; sync_draw_source->draw_done_signal_fd = -1; sync_draw_source->buf_info = NULL; sync_draw_source->tbm_surface = NULL; - - return; } static GSourceFuncs _twe_sync_draw_source_funcs = { @@ -2845,7 +2903,6 @@ twe_surface_set_sync_fd(twe_surface_h twe_surface, surf_source); g_source_remove_unix_fd(&sync_draw_source->gsource, sync_draw_source->tag); g_source_destroy(&sync_draw_source->gsource); - g_source_unref(&sync_draw_source->gsource); surf_source->use_sync_fence = TPL_FALSE; return TPL_ERROR_INVALID_OPERATION; } -- 2.7.4