struct zwp_linux_explicit_synchronization_v1 *explicit_sync; /* for explicit fence sync */
};
+typedef enum surf_message {
+ NONE_MESSAGE = 0,
+ INIT_SURFACE,
+ ACQUIRABLE,
+} surf_message;
+
struct _tpl_wl_egl_surface {
tpl_gsource *surf_source;
tpl_gmutex surf_mutex;
tpl_gcond surf_cond;
+ surf_message sent_message;
+
/* for waiting draw done */
tpl_bool_t use_render_done_fence;
tpl_bool_t is_activated;
TPL_CHECK_ON_NULL_RETURN(wl_egl_surface);
tpl_gmutex_lock(&wl_egl_surface->surf_mutex);
-
- tpl_gsource_send_message(wl_egl_surface->surf_source, 2);
-
+ if (wl_egl_surface->sent_message == NONE_MESSAGE) {
+ wl_egl_surface->sent_message = ACQUIRABLE;
+ tpl_gsource_send_message(wl_egl_surface->surf_source,
+ wl_egl_surface->sent_message);
+ }
tpl_gmutex_unlock(&wl_egl_surface->surf_mutex);
}
/* -- END -- tbm_surface_queue callback funstions */
wl_egl_surface = (tpl_wl_egl_surface_t *)tpl_gsource_get_data(gsource);
- /* Initialize surface */
- if (message == 1) {
- tpl_gmutex_lock(&wl_egl_surface->surf_mutex);
+ tpl_gmutex_lock(&wl_egl_surface->surf_mutex);
+ if (message == INIT_SURFACE) { /* Initialize surface */
TPL_DEBUG("wl_egl_surface(%p) initialize message received!",
wl_egl_surface);
_thread_wl_egl_surface_init(wl_egl_surface);
tpl_gcond_signal(&wl_egl_surface->surf_cond);
- tpl_gmutex_unlock(&wl_egl_surface->surf_mutex);
- } else if (message == 2) {
- tpl_gmutex_lock(&wl_egl_surface->surf_mutex);
+ } else if (message == ACQUIRABLE) { /* Acquirable */
TPL_DEBUG("wl_egl_surface(%p) acquirable message received!",
wl_egl_surface);
_thread_surface_queue_acquire(wl_egl_surface);
- tpl_gmutex_unlock(&wl_egl_surface->surf_mutex);
}
+ wl_egl_surface->sent_message = NONE_MESSAGE;
+
+ tpl_gmutex_unlock(&wl_egl_surface->surf_mutex);
+
return TPL_TRUE;
}
wl_egl_surface->commit_sync.fd = -1;
wl_egl_surface->presentation_sync.fd = -1;
+ wl_egl_surface->sent_message = NONE_MESSAGE;
+
{
int i = 0;
for (i = 0; i < BUFFER_ARRAY_SIZE; i++)
/* Initialize in thread */
tpl_gmutex_lock(&wl_egl_surface->surf_mutex);
- tpl_gsource_send_message(wl_egl_surface->surf_source, 1);
+ wl_egl_surface->sent_message = INIT_SURFACE;
+ tpl_gsource_send_message(wl_egl_surface->surf_source,
+ wl_egl_surface->sent_message);
tpl_gcond_wait(&wl_egl_surface->surf_cond, &wl_egl_surface->surf_mutex);
tpl_gmutex_unlock(&wl_egl_surface->surf_mutex);
tpl_util_atomic_uint ref_cnt;
};
+typedef enum surf_message {
+ NONE_MESSAGE = 0,
+ INIT_SURFACE,
+ CREATE_QUEUE,
+ DESTROY_QUEUE,
+ ACQUIRABLE,
+} surf_message;
+
struct _tpl_wl_vk_surface {
tpl_gsource *surf_source;
tpl_bool_t reset; /* TRUE if queue reseted by external */
tpl_bool_t vblank_done;
+ surf_message sent_message;
+
int post_interval;
};
wl_vk_surface = (tpl_wl_vk_surface_t *)tpl_gsource_get_data(gsource);
- if (message == 1) { /* Initialize surface */
- tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
+ tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
+ if (message == INIT_SURFACE) { /* Initialize surface */
TPL_DEBUG("wl_vk_surface(%p) initialize message received!",
wl_vk_surface);
_thread_wl_vk_surface_init(wl_vk_surface);
- tpl_gcond_signal(&wl_vk_surface->surf_cond);
- tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
- } else if (message == 2) { /* Create tbm_surface_queue */
- tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
+ tpl_gcond_signal(&wl_vk_surface->surf_cond);
+ } else if (message == CREATE_QUEUE) { /* Create tbm_surface_queue */
TPL_DEBUG("wl_vk_surface(%p) queue creation message received!",
wl_vk_surface);
if (_thread_swapchain_create_tbm_queue(wl_vk_surface)
wl_vk_surface);
}
tpl_gcond_signal(&wl_vk_surface->surf_cond);
- tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
- } else if (message == 3) { /* Acquirable message */
- tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
+ } else if (message == DESTROY_QUEUE) { /* swapchain destroy */
+ TPL_DEBUG("wl_vk_surface(%p) swapchain destroy message received!",
+ wl_vk_surface);
+ _thread_swapchain_destroy_tbm_queue(wl_vk_surface);
+ tpl_gcond_signal(&wl_vk_surface->surf_cond);
+ } else if (message == ACQUIRABLE) { /* Acquirable message */
TPL_DEBUG("wl_vk_surface(%p) acquirable message received!",
wl_vk_surface);
if (_thread_surface_queue_acquire(wl_vk_surface)
TPL_ERR("Failed to acquire from tbm_queue. wl_vk_surface(%p)",
wl_vk_surface);
}
- tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
- } else if (message == 4) { /* swapchain destroy */
- tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
- TPL_DEBUG("wl_vk_surface(%p) swapchain destroy message received!",
- wl_vk_surface);
- _thread_swapchain_destroy_tbm_queue(wl_vk_surface);
- tpl_gcond_signal(&wl_vk_surface->surf_cond);
- tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
}
+ /* init to NONE_MESSAGE */
+ wl_vk_surface->sent_message = NONE_MESSAGE;
+
+ tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
+
return TPL_TRUE;
}
wl_vk_surface->vblank = NULL;
wl_vk_surface->surface_sync = NULL;
+ wl_vk_surface->sent_message = NONE_MESSAGE;
+
wl_vk_surface->post_interval = surface->post_interval;
{
/* Initialize in thread */
tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
- tpl_gsource_send_message(wl_vk_surface->surf_source, 1);
+ wl_vk_surface->sent_message = INIT_SURFACE;
+ tpl_gsource_send_message(wl_vk_surface->surf_source,
+ wl_vk_surface->sent_message);
tpl_gcond_wait(&wl_vk_surface->surf_cond, &wl_vk_surface->surf_mutex);
tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
TPL_CHECK_ON_NULL_RETURN(wl_vk_surface);
tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
-
- tpl_gsource_send_message(wl_vk_surface->surf_source, 3);
-
+ if (wl_vk_surface->sent_message == NONE_MESSAGE) {
+ wl_vk_surface->sent_message = ACQUIRABLE;
+ tpl_gsource_send_message(wl_vk_surface->surf_source,
+ wl_vk_surface->sent_message);
+ }
tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
}
tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
/* send swapchain create tbm_queue message */
- tpl_gsource_send_message(wl_vk_surface->surf_source, 2);
+ wl_vk_surface->sent_message = CREATE_QUEUE;
+ tpl_gsource_send_message(wl_vk_surface->surf_source,
+ wl_vk_surface->sent_message);
tpl_gcond_wait(&wl_vk_surface->surf_cond, &wl_vk_surface->surf_mutex);
tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);
_tpl_wl_vk_surface_buffer_clear(wl_vk_surface);
tpl_gmutex_lock(&wl_vk_surface->surf_mutex);
- tpl_gsource_send_message(wl_vk_surface->surf_source, 4);
+ wl_vk_surface->sent_message = DESTROY_QUEUE;
+ tpl_gsource_send_message(wl_vk_surface->surf_source,
+ wl_vk_surface->sent_message);
tpl_gcond_wait(&wl_vk_surface->surf_cond, &wl_vk_surface->surf_mutex);
tpl_gmutex_unlock(&wl_vk_surface->surf_mutex);