From: joonbum.ko Date: Tue, 16 Jan 2018 04:58:03 +0000 (+0900) Subject: tpl_wayland_egl_thread: Registered dequeueable callback to tbm_queue. X-Git-Tag: accepted/tizen/unified/20180208.163715~5 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F88%2F169088%2F3;p=platform%2Fcore%2Fuifw%2Flibtpl-egl.git tpl_wayland_egl_thread: Registered dequeueable callback to tbm_queue. - Signal to free_queue_cond when dequeuable callback is called. - wl_buffer release callback does not signal to free_queue_cond, and if dequeuable callback is called when tbm_surface_queue_release() is called, signal to free_queue_cond. Change-Id: I52d898f37ef6dc5074e98690399a04116869d177 Signed-off-by: joonbum.ko --- diff --git a/src/tpl_wayland_egl_thread.c b/src/tpl_wayland_egl_thread.c index 4ae5313..6c4f1ef 100644 --- a/src/tpl_wayland_egl_thread.c +++ b/src/tpl_wayland_egl_thread.c @@ -1273,8 +1273,6 @@ __cb_buffer_release_callback(void *data, struct wl_proxy *wl_buffer) twe_wl_surf_source *surf_source = buf_info->surf_source; tbm_surface_queue_error_e tsq_err; - 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) @@ -1301,9 +1299,6 @@ __cb_buffer_release_callback(void *data, struct wl_proxy *wl_buffer) tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0))); tbm_surface_internal_unref(tbm_surface); - g_cond_signal(&surf_source->free_queue_cond); - g_mutex_unlock(&surf_source->free_queue_mutex); - return; } @@ -1543,16 +1538,23 @@ __cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue, { twe_wl_surf_source *surf_source = (twe_wl_surf_source *)data; - if (surf_source && !g_source_is_destroyed(&surf_source->gsource)) { - surf_source->swapchain_properties.width = - tbm_surface_queue_get_width(tbm_queue); - surf_source->swapchain_properties.height = - tbm_surface_queue_get_height(tbm_queue); - surf_source->swapchain_properties.buffer_count = - tbm_surface_queue_get_size(tbm_queue); - surf_source->format = tbm_surface_queue_get_format(tbm_queue); + if (!surf_source || g_source_is_destroyed(&surf_source->gsource)) { + TPL_ERR("Invalid parameter. surf_source(%p)", surf_source); + return; } + surf_source->swapchain_properties.width = + tbm_surface_queue_get_width(tbm_queue); + surf_source->swapchain_properties.height = + tbm_surface_queue_get_height(tbm_queue); + surf_source->swapchain_properties.buffer_count = + tbm_surface_queue_get_size(tbm_queue); + surf_source->format = tbm_surface_queue_get_format(tbm_queue); + + g_mutex_lock(&surf_source->free_queue_mutex); + g_cond_signal(&surf_source->free_queue_cond); + g_mutex_unlock(&surf_source->free_queue_mutex); + TPL_LOG_T(BACKEND, "tbm_queue(%p) has been reset!", tbm_queue); } @@ -1594,6 +1596,25 @@ static void __cb_tbm_queue_trace_callback(tbm_surface_queue_h tbm_queue, } } +static void __cb_tbm_queue_dequeueable_callback(tbm_surface_queue_h tbm_queue, + void *data) +{ + twe_wl_surf_source *surf_source = (twe_wl_surf_source *)data; + + if (!surf_source || g_source_is_destroyed(&surf_source->gsource)) { + TPL_ERR("Invalid parameter. surf_source(%p)", surf_source); + return; + } + + g_mutex_lock(&surf_source->free_queue_mutex); + + TPL_LOG_T(BACKEND, "[DEQUEUEABLE_CB] surf_source(%p) tbm_queue(%p)", + surf_source, surf_source->tbm_queue); + + g_cond_signal(&surf_source->free_queue_cond); + g_mutex_unlock(&surf_source->free_queue_mutex); +} + static void _twe_thread_wl_vk_surface_commit(twe_wl_surf_source *surf_source, tbm_surface_h tbm_surface); @@ -2141,7 +2162,7 @@ _twe_surface_create_tbm_queue(twe_wl_surf_source *source, if (tbm_surface_queue_add_reset_cb(tbm_queue, __cb_tbm_queue_reset_callback, - NULL) != TBM_SURFACE_QUEUE_ERROR_NONE) { + (void *)source) != TBM_SURFACE_QUEUE_ERROR_NONE) { TPL_ERR("Failed to register reset callback to tbm_surface_queue(%p)", tbm_queue); tbm_surface_queue_destroy(tbm_queue); @@ -2553,6 +2574,15 @@ twe_surface_create_swapchain(twe_surface_h twe_surface, return TPL_ERROR_INVALID_OPERATION; } + if (tbm_surface_queue_add_dequeuable_cb(surf_source->tbm_queue, + __cb_tbm_queue_dequeueable_callback, + (void *)surf_source) != TBM_SURFACE_QUEUE_ERROR_NONE) { + TPL_ERR("Failed to register dequeueable callback to tbm_surface_queue(%p)", + surf_source->tbm_queue); + tbm_surface_queue_destroy(surf_source->tbm_queue); + return TPL_ERROR_INVALID_OPERATION; + } + if (present_mode == TPL_DISPLAY_PRESENT_MODE_FIFO || present_mode == TPL_DISPLAY_PRESENT_MODE_FIFO_RELAXED) { surf_source->vblank_waiting_buffers = __tpl_list_alloc();