tpl_gsource *tdm_source;
int tdm_display_fd;
tpl_bool_t tdm_initialized;
+ tpl_list_t *surface_vblanks;
} tdm;
struct tizen_surface_shm *tss; /* used for surface buffer_flush */
static void
_thread_wl_surface_commit(tpl_wl_egl_surface_t *wl_egl_surface,
tpl_wl_egl_buffer_t *wl_egl_buffer);
+static void
+__cb_surface_vblank_free(void *data);
static tpl_bool_t
_check_native_handle_is_wl_display(tpl_handle_t display)
wl_egl_display, wl_egl_display->tdm.tdm_client, gsource);
if (wl_egl_display->tdm.tdm_client) {
+
+ if (wl_egl_display->tdm.surface_vblanks) {
+ __tpl_list_free(wl_egl_display->tdm.surface_vblanks,
+ __cb_surface_vblank_free);
+ wl_egl_display->tdm.surface_vblanks = NULL;
+ }
+
tdm_client_destroy(wl_egl_display->tdm.tdm_client);
wl_egl_display->tdm.tdm_client = NULL;
wl_egl_display->tdm.tdm_display_fd = -1;
wl_egl_display->tdm.tdm_source = NULL;
}
+ wl_egl_display->use_wait_vblank = TPL_FALSE;
wl_egl_display->tdm.tdm_initialized = TPL_FALSE;
}
wl_egl_display->tdm.tdm_client = tdm_client;
wl_egl_display->tdm.tdm_source = NULL;
wl_egl_display->tdm.tdm_initialized = TPL_TRUE;
+ wl_egl_display->tdm.surface_vblanks = __tpl_list_alloc();
TPL_INFO("[TDM_CLIENT_INIT]",
"wl_egl_display(%p) tdm_client(%p) tdm_display_fd(%d)",
}
if (wl_egl_surface->vblank) {
- tpl_surface_vblank_t *vblank = wl_egl_surface->vblank;
- TPL_INFO("[VBLANK_DESTROY]",
- "wl_egl_surface(%p) surface_vblank(%p) tdm_vblank(%p)",
- wl_egl_surface, vblank,
- vblank->tdm_vblank);
- tdm_client_vblank_destroy(vblank->tdm_vblank);
- vblank->tdm_vblank = NULL;
- vblank->wl_egl_surface = NULL;
- free(vblank);
-
- wl_egl_surface->vblank = NULL;
+ __tpl_list_remove_data(wl_egl_display->tdm.surface_vblanks,
+ (void *)wl_egl_surface->vblank,
+ TPL_FIRST,
+ __cb_surface_vblank_free);
}
if (wl_egl_surface->tbm_queue) {
}
static void
+__cb_surface_vblank_free(void *data)
+{
+ TPL_CHECK_ON_NULL_RETURN(data);
+
+ tpl_surface_vblank_t *vblank = (tpl_surface_vblank_t *)data;
+ tpl_wl_egl_surface_t *wl_egl_surface = vblank->wl_egl_surface;
+
+ TPL_INFO("[VBLANK_DESTROY]",
+ "wl_egl_surface(%p) surface_vblank(%p) tdm_vblank(%p)",
+ wl_egl_surface, vblank,
+ vblank->tdm_vblank);
+
+ tdm_client_vblank_destroy(vblank->tdm_vblank);
+ vblank->tdm_vblank = NULL;
+ vblank->wl_egl_surface = NULL;
+
+ free(vblank);
+
+ wl_egl_surface->vblank = NULL;
+}
+
+static void
_thread_wl_egl_surface_init(tpl_wl_egl_surface_t *wl_egl_surface)
{
tpl_wl_egl_display_t *wl_egl_display = wl_egl_surface->wl_egl_display;
vblank->waiting_buffers = __tpl_list_alloc();
vblank->wl_egl_surface = wl_egl_surface;
+ __tpl_list_push_back(wl_egl_display->tdm.surface_vblanks,
+ (void *)vblank);
+
TPL_INFO("[VBLANK_INIT]",
"wl_egl_surface(%p) tdm_client(%p) tdm_vblank(%p)",
wl_egl_surface, wl_egl_display->tdm.tdm_client,