Added acquire_fence_fd to buf_info.
authorJoonbum Ko <joonbum.ko@samsung.com>
Fri, 5 Jun 2020 03:51:16 +0000 (12:51 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Mon, 10 Aug 2020 08:15:24 +0000 (17:15 +0900)
Change-Id: Idc1d6357de97b54d30486ad7c53c6e9ce9f403f6
Signed-off-by: Joonbum Ko <joonbum.ko@samsung.com>
src/tpl_wayland_egl_thread.c

index 22795ca9635fd4f3bf106516b7f2c1647acf9609..54f65adea441c964135c6873fa642ff723940daa 100755 (executable)
@@ -202,8 +202,12 @@ struct _twe_wl_buffer_info {
        struct zwp_linux_buffer_release_v1 *buffer_release;
 
        /* each buffers own its release_fence_fd, until it passes ownership
-        * to it to EGL (see wait_for_buffer_release_fence) */
+        * to it to EGL */
        int release_fence_fd;
+
+       /* each buffers own its acquire_fence_fd. until it passes ownership
+        * to it to SERVER */
+       int acquire_fence_fd;
 };
 
 struct _twe_fence_wait_source {
@@ -1801,6 +1805,7 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source,
                buf_info->draw_done = TPL_FALSE;
                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;
 
@@ -1890,6 +1895,10 @@ _twe_surface_set_wl_buffer_info(twe_wl_surf_source *surf_source,
        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;
+
+       wl_buffer_add_listener((void *)buf_info->wl_buffer,
+                                                  &wl_buffer_release_listener, tbm_surface);
 
        if (buf_info->is_vk_image) {
                buf_info->sync_timeline = tbm_sync_timeline_create();
@@ -2446,6 +2455,14 @@ _twe_thread_wl_surface_commit(twe_wl_surf_source *surf_source,
 
        if (surf_source->disp_source->use_explicit_sync &&
                surf_source->use_surface_sync) {
+
+               zwp_linux_surface_synchronization_v1_set_acquire_fence(surf_source->surface_sync,
+                                                                                                                          buf_info->acquire_fence_fd);
+               TPL_DEBUG("[SET_ACQUIRE_FENCE] surf_source(%p) tbm_surface(%p) acquire_fence(%d)",
+                                 surf_source, tbm_surface, buf_info->acquire_fence_fd);
+               close(buf_info->acquire_fence_fd);
+               buf_info->acquire_fence_fd = -1;
+
                buf_info->buffer_release =
                        zwp_linux_surface_synchronization_v1_get_release(surf_source->surface_sync);
                if (!buf_info->buffer_release) {
@@ -2455,7 +2472,6 @@ _twe_thread_wl_surface_commit(twe_wl_surf_source *surf_source,
                                buf_info->buffer_release, &explicit_sync_release_listner, tbm_surface);
                        TPL_DEBUG("add explicit_sync_release_listener.");
                }
-
        }
 
        wl_surface_commit(wl_surface);
@@ -2639,14 +2655,10 @@ _twe_thread_wl_surface_dispatch(GSource *source, GSourceFunc cb, gpointer data)
                        int sync_fd = surf_source->sync_info.sync_fd;
                        tbm_surface_h tbm_surface = surf_source->sync_info.tbm_surface;
 
-                       if (surf_source->use_surface_sync) {
-                               zwp_linux_surface_synchronization_v1_set_acquire_fence(
-                                                       surf_source->surface_sync, sync_fd);
-                               close(sync_fd);
-                       } else {
+                       if (!surf_source->use_surface_sync) {
                                res = _twe_thread_fence_wait_source_attach(surf_source, tbm_surface, sync_fd);
                                if (res != TPL_ERROR_NONE) {
-                                       TPL_ERR("Failed to attach source with fence_fd(%d) ret(%d)",
+                                       TPL_ERR("Failed to attach source with fence_fd(%d) result(%d)",
                                                        sync_fd, res);
                                        surf_source->use_sync_fence = TPL_FALSE;
                                        return res;
@@ -3676,6 +3688,7 @@ twe_surface_set_sync_fd(twe_surface_h twe_surface,
 {
        twe_wl_surf_source *surf_source = (twe_wl_surf_source *)twe_surface;
        tpl_result_t ret = TPL_ERROR_NONE;
+       twe_wl_buffer_info *buf_info = NULL;
 
        if (!surf_source) {
                TPL_ERR("Invalid parameter. twe_surface(%p)", twe_surface);
@@ -3687,13 +3700,26 @@ twe_surface_set_sync_fd(twe_surface_h twe_surface,
                return TPL_ERROR_INVALID_PARAMETER;
        }
 
-       g_mutex_lock(&surf_source->surf_mutex);
-       surf_source->sync_info.sync_fd = sync_fd;
-       surf_source->sync_info.tbm_surface = tbm_surface;
-       surf_source->use_sync_fence = TPL_TRUE;
-       TPL_DEBUG("[SET_SYNC_FD] surf_source(%p) tbm_surface(%p) sync_fd(%d)",
-                         surf_source, tbm_surface, sync_fd);
-       g_mutex_unlock(&surf_source->surf_mutex);
+       tbm_surface_internal_get_user_data(tbm_surface, KEY_BUFFER_INFO,
+                                                                          (void **)&buf_info);
+       if (!buf_info) {
+               TPL_ERR("Invalid parameter. tbm_surface(%p)", tbm_surface);
+               return TPL_ERROR_INVALID_PARAMETER;
+       }
+
+       if (surf_source->use_surface_sync) {
+               if (buf_info->acquire_fence_fd != -1)
+                       close(buf_info->acquire_fence_fd);
+               buf_info->acquire_fence_fd = sync_fd;
+       } else {
+               g_mutex_lock(&surf_source->surf_mutex);
+               surf_source->sync_info.sync_fd = sync_fd;
+               surf_source->sync_info.tbm_surface = tbm_surface;
+               surf_source->use_sync_fence = TPL_TRUE;
+               TPL_DEBUG("[SET_SYNC_FD] surf_source(%p) tbm_surface(%p) sync_fd(%d)",
+                                 surf_source, tbm_surface, sync_fd);
+               g_mutex_unlock(&surf_source->surf_mutex);
+       }
 
        return ret;
 }