re-implement commit_sync without using sync_timeline 95/249895/1
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 4 Dec 2020 04:05:43 +0000 (13:05 +0900)
committerJoonbum Ko <joonbum.ko@samsung.com>
Thu, 17 Dec 2020 07:44:16 +0000 (16:44 +0900)
Change-Id: Ic5f06eb4da1a37a82e251be5d0d9b5bb3c313a56
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_wayland_egl_thread.c

index 941a9eb..fa92a87 100755 (executable)
@@ -144,9 +144,10 @@ struct _twe_wl_surf_source {
        twe_wl_disp_source *disp_source;
        twe_del_source *surf_del_source;
 
-       tbm_fd commit_sync_timeline;
-       int commit_sync_timestamp;
-       unsigned int commit_sync_fence_number;
+       struct {
+               GMutex mutex;
+               int fd;
+       } commit_sync;
 
        tbm_fd presentation_sync_timeline;
        int presentation_sync_timestamp;
@@ -197,8 +198,6 @@ struct _twe_wl_buffer_info {
        tbm_fd sync_fd;
        tpl_bool_t is_vk_image;
 
-       unsigned int commit_sync_ts_backup;
-
        tbm_surface_h tbm_surface;
 
        twe_wl_surf_source *surf_source;
@@ -216,6 +215,8 @@ struct _twe_wl_buffer_info {
        /* each buffers own its acquire_fence_fd. until it passes ownership
         * to it to SERVER */
        int acquire_fence_fd;
+
+       int commit_sync_fd;
 };
 
 struct _twe_fence_wait_source {
@@ -539,6 +540,26 @@ _twe_thread_tdm_source_destroy(void *source)
        g_source_unref(&tdm_source->gsource);
 }
 
+static int
+_write_to_eventfd(int eventfd)
+{
+       uint64_t value = 1;
+       int ret;
+
+       if (eventfd == -1) {
+               TPL_ERR("Invalid fd(-1)");
+               return -1;
+       }
+
+       ret = write(eventfd, &value, sizeof(uint64_t));
+       if (ret == -1) {
+               TPL_ERR("failed to write to fd(%d)", eventfd);
+               return ret;
+       }
+
+       return ret;
+}
+
 twe_thread*
 twe_thread_create(void)
 {
@@ -1451,7 +1472,7 @@ __cb_create_commit_sync_fd(struct wl_egl_window *wl_egl_window, void *private)
        struct tizen_private *tizen_private = (struct tizen_private *)private;
        twe_wl_surf_source *surf_source = NULL;
 
-       tbm_fd commit_sync_fd = -1;
+       int commit_sync_fd = -1;
 
        surf_source = (twe_wl_surf_source *)tizen_private->data;
        if (!surf_source) {
@@ -1459,22 +1480,35 @@ __cb_create_commit_sync_fd(struct wl_egl_window *wl_egl_window, void *private)
                return -1;
        }
 
-       if (surf_source->commit_sync_timeline != -1) {
-               char name[32];
-               snprintf(name, 32, "%u", surf_source->commit_sync_fence_number++);
-               commit_sync_fd = tbm_sync_fence_create(surf_source->commit_sync_timeline,
-                                                                                          name,
-                                                                                          surf_source->commit_sync_timestamp + 1);
-               TPL_DEBUG("[COMMIT_SYNC] surf_source(%p) timeline(%d) timestamp(%d) name(%s) sync_fence(%d)",
-                                 surf_source, surf_source->commit_sync_timeline, surf_source->commit_sync_timestamp + 1,
-                                 name, commit_sync_fd);
-
-               TRACE_ASYNC_BEGIN(surf_source->commit_sync_timestamp + 1, "[SYNC_FENCE]");
+       g_mutex_lock(&surf_source->commit_sync.mutex);
 
+       if (surf_source->commit_sync.fd != -1) {
+               commit_sync_fd = dup(surf_source->commit_sync.fd);
+               TRACE_MARK("[ONLY_DUP] commit_sync_fd(%d) dup(%d)",
+                                  surf_source->commit_sync.fd, commit_sync_fd);
+               TPL_DEBUG("[DUP_COMMIT_SYNC] surf_source(%p) commit_sync_fd(%d) dup(%d)",
+                                 surf_source, surf_source->commit_sync.fd, commit_sync_fd);
+               g_mutex_unlock(&surf_source->commit_sync.mutex);
                return commit_sync_fd;
        }
 
-       return -1;
+       surf_source->commit_sync.fd = eventfd(0, EFD_CLOEXEC);
+       if (surf_source->commit_sync.fd == -1) {
+               TPL_ERR("Failed to create commit_sync_fd. twe_surface(%p)", surf_source);
+               g_mutex_unlock(&surf_source->commit_sync.mutex);
+               return -1;
+       }
+
+       commit_sync_fd = dup(surf_source->commit_sync.fd);
+
+       TRACE_MARK("[CREATE] commit_sync_fd(%d) dup(%d)",
+                          surf_source->commit_sync.fd, commit_sync_fd);
+       TPL_DEBUG("[CREATE_COMMIT_SYNC] surf_source(%p) commit_sync_fd(%d)",
+                         surf_source, commit_sync_fd);
+
+       g_mutex_unlock(&surf_source->commit_sync.mutex);
+
+       return commit_sync_fd;
 }
 
 static int
@@ -1536,8 +1570,7 @@ __cb_merge_sync_fds(void *private, int sync_fd1, int sync_fd2)
                return -1;
        }
 
-       if (surf_source->commit_sync_timeline == -1 &&
-               surf_source->presentation_sync_timeline == -1) {
+       if (surf_source->presentation_sync_timeline == -1) {
                TPL_ERR("There is no timeline for any sync fd in surf_source(%p)", surf_source);
                return -1;
        }
@@ -1613,6 +1646,14 @@ __cb_twe_buffer_free_callback(twe_wl_buffer_info *buf_info)
                wayland_tbm_client_destroy_buffer(disp_source->wl_tbm_client,
                                                                                  (void *)buf_info->wl_buffer);
 
+       if (buf_info->commit_sync_fd != -1) {
+               int ret = _write_to_eventfd(buf_info->commit_sync_fd);
+               if (ret == -1)
+                       TPL_ERR("Failed to send commit_sync signal to fd(%d)", buf_info->commit_sync_fd);
+               close(buf_info->commit_sync_fd);
+               buf_info->commit_sync_fd = -1;
+       }
+
        if (buf_info->sync_timeline != -1) {
                close(buf_info->sync_timeline);
                buf_info->sync_timeline = -1;
@@ -1844,8 +1885,7 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source,
                buf_info->need_to_commit = TPL_TRUE;
                buf_info->sync_fd = -1;
                buf_info->acquire_fence_fd = -1;
-
-               buf_info->commit_sync_ts_backup = ++surf_source->commit_sync_timestamp;
+               buf_info->commit_sync_fd = -1;
 
                if (surf_source->in_use_buffers) {
                        g_mutex_lock(&surf_source->surf_mutex);
@@ -1931,9 +1971,9 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source,
        buf_info->sync_fd = -1;
        buf_info->sync_timeline = -1;
        buf_info->is_vk_image = surf_source->disp_source->is_vulkan_dpy;
-       buf_info->commit_sync_ts_backup = ++surf_source->commit_sync_timestamp;
        buf_info->release_fence_fd = -1;
        buf_info->acquire_fence_fd = -1;
+       buf_info->commit_sync_fd = -1;
 
        wl_buffer_add_listener((void *)buf_info->wl_buffer,
                                                   &wl_buffer_release_listener, tbm_surface);
@@ -1993,11 +2033,24 @@ static void
 _twe_surface_trace_enqueue_buffer(twe_wl_surf_source *surf_source,
                                                                  tbm_surface_h tbm_surface)
 {
+       twe_wl_buffer_info *buf_info = NULL;
+
        if (!surf_source) {
                TPL_ERR("Invalid parameter. twe_surface(%p)", surf_source);
                return;
        }
 
+       tbm_surface_internal_get_user_data(tbm_surface, KEY_BUFFER_INFO,
+                                                                          (void **)&buf_info);
+       if (buf_info) {
+               g_mutex_lock(&surf_source->commit_sync.mutex);
+               buf_info->commit_sync_fd = surf_source->commit_sync.fd;
+               surf_source->commit_sync.fd = -1;
+               TRACE_ASYNC_BEGIN(buf_info->commit_sync_fd, "[COMMIT_SYNC] bo(%d)",
+                                                 tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));
+               g_mutex_unlock(&surf_source->commit_sync.mutex);
+       }
+
        if (surf_source->in_use_buffers) {
                g_mutex_lock(&surf_source->surf_mutex);
                /* Stop tracking of this canceled tbm_surface */
@@ -2553,15 +2606,24 @@ _twe_thread_wl_surface_commit(twe_wl_surf_source *surf_source,
                __tpl_list_push_back(surf_source->committed_buffers, tbm_surface);
        }
 
-       if (surf_source->commit_sync_timeline != -1) {
-               TRACE_ASYNC_END(buf_info->commit_sync_ts_backup, "[SYNC_FENCE]");
+       g_mutex_lock(&surf_source->commit_sync.mutex);
 
-               TPL_DEBUG("[COMMIT_SYNC][INC] surf_source(%p) timeline(%d) timestamp(%d)",
-                                 surf_source, surf_source->commit_sync_timeline, buf_info->commit_sync_ts_backup);
-               if (!tbm_sync_timeline_inc(surf_source->commit_sync_timeline, 1)) {
-                       TPL_ERR("Failed to increase timeline(%d)", surf_source->commit_sync_timeline);
+       if (buf_info->commit_sync_fd != -1) {
+               int ret = _write_to_eventfd(buf_info->commit_sync_fd);
+               if (ret == -1) {
+                       TPL_ERR("Failed to send commit_sync signal to fd(%d)", buf_info->commit_sync_fd);
                }
+
+               TRACE_ASYNC_END(buf_info->commit_sync_fd, "[COMMIT_SYNC] bo(%d)",
+                                               tbm_bo_export(tbm_surface_internal_get_bo(tbm_surface, 0)));
+               TPL_DEBUG("[COMMIT_SYNC][SEND] surf_source(%p) commit_sync_fd(%d)",
+                                 surf_source, buf_info->commit_sync_fd);
+
+               close(buf_info->commit_sync_fd);
+               buf_info->commit_sync_fd = -1;
        }
+
+       g_mutex_unlock(&surf_source->commit_sync.mutex);
 }
 
 /* The following function _twe_thread_wl_surface_acquire_and_commit can be
@@ -3101,16 +3163,15 @@ _twe_thread_wl_surf_source_destroy(void *source)
                surf_source->surf = NULL;
        }
 
-       if (surf_source->commit_sync_timeline >= 0) {
-               close(surf_source->commit_sync_timeline);
-               surf_source->commit_sync_timeline = -1;
-       }
-
        if (surf_source->presentation_sync_timeline >= 0) {
                close(surf_source->presentation_sync_timeline);
                surf_source->presentation_sync_timeline = -1;
        }
 
+       g_mutex_lock(&surf_source->commit_sync.mutex);
+       g_mutex_unlock(&surf_source->commit_sync.mutex);
+       g_mutex_clear(&surf_source->commit_sync.mutex);
+
        g_mutex_unlock(&surf_source->surf_mutex);
        g_mutex_clear(&surf_source->surf_mutex);
 
@@ -3199,9 +3260,8 @@ twe_surface_add(twe_thread* thread,
 
        source->post_interval = 1;
 
-       source->commit_sync_timeline = tbm_sync_timeline_create();
-       source->commit_sync_timestamp = 0;
-       source->commit_sync_fence_number = 0;
+       source->commit_sync.fd = -1;
+       g_mutex_init(&source->commit_sync.mutex);
 
        source->presentation_sync_timeline = tbm_sync_timeline_create();
        source->presentation_sync_timestamp = 0;