From 4d622ed273db503b8eec82435aee9f73bcc248a7 Mon Sep 17 00:00:00 2001 From: Joonbum Ko Date: Mon, 17 May 2021 16:23:49 +0900 Subject: [PATCH] Added surface_vblanks list for safe destroy. - If an error occurs in tdm_client_display, it is a problem that cannot be recovered, but it should not affect rendering. - In this case, destroy tdm_client and stop using wait_vblank. - However, a problem occurs when accessing vblank after tdm_client_destroy. - Therefore, the created vblanks must be destroyed first and then destroy the tdm_client. - The added surface_vblanks list is to trace the created vblanks. Change-Id: I3eae60842761dd6cda0042ff941e0f0736633b4c Signed-off-by: Joonbum Ko --- src/tpl_wl_egl_thread.c | 52 ++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/src/tpl_wl_egl_thread.c b/src/tpl_wl_egl_thread.c index 7463197..deba3b6 100755 --- a/src/tpl_wl_egl_thread.c +++ b/src/tpl_wl_egl_thread.c @@ -60,6 +60,7 @@ struct _tpl_wl_egl_display { 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 */ @@ -238,6 +239,8 @@ _thread_surface_queue_acquire(tpl_wl_egl_surface_t *wl_egl_surface); 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) @@ -311,12 +314,20 @@ __thread_func_tdm_finalize(tpl_gsource *gsource) 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; } @@ -351,6 +362,7 @@ _thread_tdm_init(tpl_wl_egl_display_t *wl_egl_display) 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)", @@ -1475,17 +1487,10 @@ _thread_wl_egl_surface_fini(tpl_wl_egl_surface_t *wl_egl_surface) } 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) { @@ -1791,6 +1796,28 @@ _thread_create_tdm_client_vblank(tdm_client *tdm_client) return tdm_vblank; } +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) { @@ -1833,6 +1860,9 @@ _thread_wl_egl_surface_init(tpl_wl_egl_surface_t *wl_egl_surface) 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, -- 2.34.1