twe_del_source *disp_del_source;
twe_thread *thread;
GMutex wl_event_mutex;
+
/* TODO : surface list */
};
twe_wl_disp_source *disp_source;
twe_del_source *surf_del_source;
+ tbm_fd render_sync_timeline;
+ int render_sync_timestamp;
+ unsigned int render_sync_fence_number;
+
GMutex surf_mutex;
GMutex free_queue_mutex;
}
}
+static int
+__cb_create_render_sync_fd(struct wl_egl_window *wl_egl_window, void *private)
+{
+ TPL_ASSERT(private);
+ TPL_ASSERT(wl_egl_window);
+
+ struct tizen_private *tizen_private = (struct tizen_private *)private;
+ twe_wl_surf_source *surf_source = NULL;
+
+ tbm_fd render_sync_fd = -1;
+
+ surf_source = (twe_wl_surf_source *)tizen_private->data;
+ if (!surf_source) {
+ TPL_ERR("Invalid parameter. twe_surface(%p)", surf_source);
+ return -1;
+ }
+
+ if (surf_source->render_sync_timeline != -1) {
+ char name[32];
+ snprintf(name, 32, "%u", surf_source->render_sync_fence_number++);
+ render_sync_fd = tbm_sync_fence_create(surf_source->render_sync_timeline,
+ name,
+ surf_source->render_sync_timestamp + 1);
+ TPL_DEBUG("[RENDER_SYNC] surf_source(%p) timeline(%d) timestamp(%d) name(%s) sync_fence(%d)",
+ surf_source, surf_source->render_sync_timeline, surf_source->render_sync_timestamp,
+ name, render_sync_fd);
+
+ TRACE_ASYNC_BEGIN(surf_source->render_sync_timestamp + 1, "[SYNC_FENCE]");
+
+ return render_sync_fd;
+ }
+
+ return -1;
+}
+
static void __cb_tss_flusher_flush_callback(void *data,
struct tizen_surface_shm_flusher *tss_flusher)
return;
}
+ if (surf_source->render_sync_timeline != -1) {
+
+ surf_source->render_sync_timestamp++;
+ TRACE_ASYNC_END(surf_source->render_sync_timestamp, "[SYNC_FENCE]");
+
+ TPL_DEBUG("[RENDER_SYNC][INC] surf_source(%p) timeline(%d) timestamp(%d)",
+ surf_source, surf_source->render_sync_timeline, surf_source->render_sync_timestamp);
+ if (!tbm_sync_timeline_inc(surf_source->render_sync_timeline, 1)) {
+ TPL_ERR("Failed to increase timeline(%d)", surf_source->render_sync_timeline);
+ }
+ }
+
if (surf_source->in_use_buffers) {
g_mutex_lock(&surf_source->surf_mutex);
/* Stop tracking of this canceled tbm_surface */
source->post_interval = 1;
+ source->render_sync_timeline = tbm_sync_timeline_create();
+ source->render_sync_timestamp = 0;
+ source->render_sync_fence_number = 0;
+
if (!disp_source->is_vulkan_dpy) {
struct wl_egl_window *wl_egl_window =
(struct wl_egl_window *)native_handle;
__cb_get_rotation_capability;
private->set_window_serial_callback = (void *)
__cb_set_window_serial_callback;
+ private->create_render_sync_fd = (void *)__cb_create_render_sync_fd;
source->latest_transform = private->transform;