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;
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;
/* 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 {
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)
{
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) {
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
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;
}
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;
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);
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);
_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 */
__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
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);
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;