tpl_bool_t vblank_done;
tpl_object_t obj; /* for mutex lock */
tpl_list_t *committed_buffers;
+ tpl_list_t *in_use_buffers;
tdm_client_vblank *vblank;
tbm_surface_queue_h tbm_queue;
twe_wl_disp_source *disp_source;
__cb_tbm_queue_reset_callback(tbm_surface_queue_h tbm_queue,
void *data)
{
- TPL_DEBUG("tbm_queue(%p) has been reset!", tbm_queue);
+ TPL_LOG_T("WL_EGL", "tbm_queue(%p) has been reset!", tbm_queue);
}
static void
buf_info->rects = NULL;
buf_info->num_rects = 0;
}
+
+ if (surf_source->in_use_buffers) {
+ TPL_OBJECT_LOCK(&surf_source->obj);
+ __tpl_list_push_back(surf_source->in_use_buffers,
+ (void *)buf_info);
+ TPL_OBJECT_UNLOCK(&surf_source->obj);
+ }
+
TPL_LOG_T("WL_EGL",
"[REUSE_BUF] buf_info(%p) tbm_surface(%p) bo(%d) (%dx%d) rot(%d)",
buf_info, tbm_surface,
tbm_surface_internal_set_user_data(tbm_surface, KEY_BUFFER_INFO,
buf_info);
+ if (surf_source->in_use_buffers) {
+ TPL_OBJECT_LOCK(&surf_source->obj);
+ __tpl_list_push_back(surf_source->in_use_buffers,
+ (void *)buf_info);
+ TPL_OBJECT_UNLOCK(&surf_source->obj);
+ }
+
TPL_LOG_T("WL_EGL",
"[NEW_BUF] buf_info(%p) tbm_surface(%p) bo(%d) (%dx%d) rot(%d)",
buf_info, tbm_surface,
if (surf_source->committed_buffers) {
TPL_OBJECT_LOCK(&surf_source->obj);
__tpl_list_push_back(surf_source->committed_buffers, tbm_surface);
+ /* Stop tracking of this released tbm_surface. */
+ __tpl_list_remove_data(surf_source->in_use_buffers,
+ (void *)buf_info, TPL_FIRST, NULL);
TPL_OBJECT_UNLOCK(&surf_source->obj);
}
}
source->vblank = _twe_surface_create_vblank(_twe_ctx->tdm_client);
source->vblank_done = TPL_TRUE;
source->committed_buffers = __tpl_list_alloc();
+ source->in_use_buffers = __tpl_list_alloc();
__tpl_object_init(&source->obj, TPL_OBJECT_SURFACE, NULL);
TPL_LOG_T("WL_EGL", "twe_surface(%p) wl_egl_window(%p) wl_surface(%p)",
surf_source, surf_source->wl_egl_window, surf_source->surf);
+ /* Should be waited until all in_use_buffers has been retrieved. */
+ while (!__tpl_list_is_empty(surf_source->in_use_buffers)) {
+ sched_yield();
+ }
+
+ __tpl_list_free(surf_source->in_use_buffers, NULL);
+ surf_source->in_use_buffers = NULL;
+
if (surf_source->tbm_queue) {
tbm_surface_queue_destroy(surf_source->tbm_queue);
surf_source->tbm_queue = NULL;