tpl_wayland_egl_thread: Registered dequeueable callback to tbm_queue. 88/169088/3
authorjoonbum.ko <joonbum.ko@samsung.com>
Tue, 16 Jan 2018 04:58:03 +0000 (13:58 +0900)
committerjoonbum.ko <joonbum.ko@samsung.com>
Fri, 2 Feb 2018 06:55:46 +0000 (15:55 +0900)
 - 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 <joonbum.ko@samsung.com>
src/tpl_wayland_egl_thread.c

index 4ae5313..6c4f1ef 100644 (file)
@@ -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();