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 {
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;
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();
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) {
buf_info->buffer_release, &explicit_sync_release_listner, tbm_surface);
TPL_DEBUG("add explicit_sync_release_listener.");
}
-
}
wl_surface_commit(wl_surface);
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;
{
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);
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;
}