From 4f5b50a0e94c14988f634fd289af4d0d68dd9da5 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 30 Aug 2019 15:32:54 +0900 Subject: [PATCH 01/16] Package version up to 2.9.4 Change-Id: Id5280b3bbce59ac1200d4afdf5a7ccbf81202215 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 8288f58..42569cd 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.9.3 +Version: 2.9.4 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From d141eb55873b9e26972c30bb6aa90160553ee16a Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 6 Sep 2019 16:56:31 +0900 Subject: [PATCH 02/16] tdm_hwc: support tdm-monitor -fps function Change-Id: I4f11ab53483058283717c4b592cb44b989c1daec Signed-off-by: Junkyeong Kim --- src/tdm_hwc.c | 18 ++++++++++++++++++ src/tdm_private_types.h | 3 +++ 2 files changed, 21 insertions(+) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index f3537bc..f6d1808 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -109,6 +109,24 @@ _tdm_hwc_thread_cb_commit(tdm_private_display *private_display, void *object, TDM_INFO("handler(%p)", hwc_commit_handler); } + /* LCOV_EXCL_START */ + if (private_display->print_fps) { + double curr = tdm_helper_get_time(); + if (private_hwc->fps_stamp == 0) { + private_hwc->fps_stamp = curr; + } else if ((curr - private_hwc->fps_stamp) > 1.0) { + TDM_INFO("hwc(%p,%d) fps: %d", + private_hwc, private_hwc->index, private_hwc->fps_count); + private_hwc->fps_count = 0; + private_hwc->fps_stamp = curr; + } else + private_hwc->fps_count++; + } else if (private_hwc->fps_stamp != 0) { + private_hwc->fps_stamp = 0; + private_hwc->fps_count = 0; + } + /* LCOV_EXCL_STOP */ + if (hwc_commit_handler->func) { _pthread_mutex_unlock(&private_display->lock); hwc_commit_handler->func(private_hwc, diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index dfea22a..a778e25 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -329,6 +329,9 @@ struct _tdm_private_hwc { tdm_hwc *hwc_backend; tbm_surface_h display_target_buffer; + + double fps_stamp; + unsigned int fps_count; }; struct _tdm_private_hwc_window { -- 2.7.4 From 67b749a49811a43bfec0cfbb1cdd4a631ae44c00 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 10 Sep 2019 14:13:55 +0900 Subject: [PATCH 03/16] Package version up to 2.9.5 Change-Id: Ic7c5cac389615a28df93542df59943ff4bc08298 Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 42569cd..e9d6257 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.9.4 +Version: 2.9.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From d077eef0042ab7dbc6857ce8e2ec367b3fe90b2e Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 2 Oct 2019 13:15:04 +0900 Subject: [PATCH 04/16] tdm_output: change log 'dpms' to 'DPMS' Change-Id: I8a2d53631455b9cfef9dd0d799227662408bd567 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 07cfa4a..d6e1cc3 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -433,7 +433,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ private_output->current_dpms_value = dpms; private_output->waiting_dpms_change = 0; - TDM_INFO("output(%d) dpms async '%s' done", private_output->pipe, tdm_dpms_str(dpms)); + TDM_INFO("output(%d) DPMS async '%s' done", private_output->pipe, tdm_dpms_str(dpms)); ret = _tdm_output_call_thread_cb_dpms(private_output, dpms); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1778,14 +1778,14 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) private_module = private_output->private_module; func_output = &private_module->func_output; - TDM_INFO("output(%d) dpms '%s'", private_output->pipe, tdm_dpms_str(dpms_value)); + TDM_INFO("output(%d) DPMS '%s'", private_output->pipe, tdm_dpms_str(dpms_value)); if (func_output->output_set_dpms) ret = func_output->output_set_dpms(private_output->output_backend, dpms_value); else { /* LCOV_EXCL_START */ ret = TDM_ERROR_NONE; - TDM_WRN("not implemented!!"); + TDM_WRN("DPMS not implemented!!"); goto done; /* LCOV_EXCL_STOP */ } @@ -1796,14 +1796,14 @@ done: private_output->current_dpms_value = dpms_value; _tdm_output_call_thread_cb_dpms(private_output, dpms_value); } - TDM_INFO("output(%d) dpms '%s' done", private_output->pipe, tdm_dpms_str(dpms_value)); + TDM_INFO("output(%d) DPMS '%s' done", private_output->pipe, tdm_dpms_str(dpms_value)); } else { tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF; /* update current_dpms_value forcely */ tdm_output_get_dpms_internal(output, &temp); - TDM_ERR("output(%d) set_dpms failed: dpms '%s'", private_output->pipe, tdm_dpms_str(temp)); + TDM_ERR("output(%d) set DPMS failed: dpms '%s'", private_output->pipe, tdm_dpms_str(temp)); } _pthread_mutex_unlock(&private_display->lock); @@ -1849,13 +1849,13 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) private_module = private_output->private_module; func_output = &private_module->func_output; if (!func_output->output_set_dpms_handler) { - TDM_WRN("not implemented: output_set_dpms_handler"); + TDM_WRN("not implemented DPMS: output_set_dpms_handler"); _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_NOT_IMPLEMENTED; } if (!func_output->output_set_dpms_async) { - TDM_WRN("not implemented: output_set_dpms_async"); + TDM_WRN("not implemented DPMS: output_set_dpms_async"); _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_NOT_IMPLEMENTED; } @@ -1866,12 +1866,12 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) tdm_output_cb_dpms, private_output); if (ret != TDM_ERROR_NONE) { _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("Can't set the dpms handler!!"); + TDM_ERR("Can't set the DPMS handler!!"); return ret; } } - TDM_INFO("output(%d) dpms async '%s'", private_output->pipe, tdm_dpms_str(dpms_value)); + TDM_INFO("output(%d) DPMS async '%s'", private_output->pipe, tdm_dpms_str(dpms_value)); ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value, &sync); @@ -1880,10 +1880,10 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF; tdm_output_get_dpms_internal(output, &temp); - TDM_INFO("output(%d) dpms async '%s'(%s) done", private_output->pipe, tdm_dpms_str(dpms_value), tdm_dpms_str(temp)); + TDM_INFO("output(%d) DPMS async '%s'(%s) done", private_output->pipe, tdm_dpms_str(dpms_value), tdm_dpms_str(temp)); } else { private_output->waiting_dpms_change = 1; - TDM_INFO("output(%d) dpms async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value)); + TDM_INFO("output(%d) DPMS async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value)); } } else { tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF; @@ -1891,7 +1891,7 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) /* update current_dpms_value forcely */ tdm_output_get_dpms_internal(output, &temp); - TDM_ERR("output(%d) set_dpms_async failed: dpms '%s'", private_output->pipe, tdm_dpms_str(temp)); + TDM_ERR("output(%d) set DPMS async failed: dpms '%s'", private_output->pipe, tdm_dpms_str(temp)); } _pthread_mutex_unlock(&private_display->lock); @@ -1928,7 +1928,7 @@ tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) if (!func_output->output_get_dpms) { /* LCOV_EXCL_START */ *dpms_value = private_output->current_dpms_value; - TDM_WRN("not implemented!!"); + TDM_WRN("DPMS get not implemented!!"); return TDM_ERROR_NONE; /* LCOV_EXCL_STOP */ } @@ -1936,14 +1936,14 @@ tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) ret = func_output->output_get_dpms(private_output->output_backend, dpms_value); if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */ - TDM_ERR("output_get_dpms failed"); + TDM_ERR("output get DPMS failed"); *dpms_value = TDM_OUTPUT_DPMS_OFF; /* LCOV_EXCL_STOP */ } /* checking with backend's value */ if (*dpms_value != private_output->current_dpms_value) { - TDM_ERR("output(%d) dpms changed suddenly: %s -> %s", + TDM_ERR("output(%d) DPMS changed suddenly: %s -> %s", private_output->pipe, tdm_dpms_str(private_output->current_dpms_value), tdm_dpms_str(*dpms_value)); private_output->current_dpms_value = *dpms_value; -- 2.7.4 From 8a3c14ca5ee3453cbf84a9bb8cef5531ffdf6309 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 2 Oct 2019 13:16:10 +0900 Subject: [PATCH 05/16] Package version up to 2.9.6 Change-Id: If141ff350ea08c7c8124fba7e2af36f84a395165 Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index e9d6257..db7f805 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.9.5 +Version: 2.9.6 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 7a105d2256426d58cb253253cd0ee1acb5054d5e Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 16 Oct 2019 19:04:28 +0900 Subject: [PATCH 06/16] tdm_hwc: make hwc_vblank set/unset function if set hwc vblank, use vblank instead of hwc commit handler. Change-Id: I9329473bb21dec6cee84fe60cd7e33eca80c2875 Signed-off-by: Junkyeong Kim --- src/tdm_hwc.c | 125 ++++++++++++++++++++++++++++++++++++++++++++++-- src/tdm_private.h | 4 ++ src/tdm_private_types.h | 1 + 3 files changed, 127 insertions(+), 3 deletions(-) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index f6d1808..3131ebd 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -70,6 +70,8 @@ TDM_RETURN_IF_FAIL(private_output != NULL); \ private_display = private_output->private_display +static int hwc_use_vblank; +static unsigned int hwc_vblank_fps; static tdm_private_hwc_window * _tdm_hwc_find_private_hwc_window(tdm_private_hwc *private_hwc, tdm_hwc_window *hwc_window_backend) @@ -152,6 +154,9 @@ _tdm_hwc_cb_commit(tdm_hwc *hwc_backend, unsigned int sequence, tdm_thread_cb_hwc_commit hwc_commit; tdm_error ret; + if (hwc_commit_handler && hwc_commit_handler->use_vblank) + return; + if (hwc_commit_handler) private_hwc = hwc_commit_handler->private_hwc; else @@ -171,6 +176,96 @@ _tdm_hwc_cb_commit(tdm_hwc *hwc_backend, unsigned int sequence, TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } +static void +_tdm_hwc_got_wait_vblank(unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, void *user_data) +{ + tdm_private_hwc_commit_handler *hwc_commit_handler = user_data; + tdm_private_hwc *private_hwc; + tdm_thread_cb_hwc_commit hwc_commit; + + private_hwc = hwc_commit_handler->private_hwc; + private_hwc->private_output->layer_waiting_vblank = 0; + + memset(&hwc_commit, 0, sizeof hwc_commit); + hwc_commit.base.type = TDM_THREAD_CB_HWC_COMMIT; + hwc_commit.base.length = sizeof hwc_commit; + hwc_commit.base.object_stamp = private_hwc->stamp; + hwc_commit.base.data = hwc_commit_handler; + hwc_commit.base.sync = 0; + hwc_commit.sequence = sequence; + hwc_commit.tv_sec = tv_sec; + hwc_commit.tv_usec = tv_usec; + + _tdm_hwc_thread_cb_commit(private_hwc->private_output->private_display, private_hwc, &hwc_commit.base, user_data); +} + +static void +_tdm_hwc_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequence, + unsigned int tv_sec, unsigned int tv_usec, void *user_data) +{ + tdm_private_hwc_commit_handler *hwc_commit_handler = user_data; + tdm_private_output *private_output = NULL; + tdm_private_display *private_display; + + if (!hwc_commit_handler->use_vblank) + return; + + TDM_RETURN_IF_FAIL(hwc_commit_handler != NULL); + + private_output = hwc_commit_handler->private_hwc->private_output; + TDM_RETURN_IF_FAIL(private_output != NULL); + + private_display = private_output->private_display; + + _pthread_mutex_lock(&private_display->lock); + + _tdm_hwc_got_wait_vblank(sequence, tv_sec, tv_usec, user_data); + + _pthread_mutex_unlock(&private_display->lock); +} + +static tdm_error +_tdm_hwc_vblank(tdm_private_hwc *private_hwc, tdm_private_hwc_commit_handler *hwc_commit_handler) +{ + tdm_private_display *private_display; + tdm_private_output *private_output; + tdm_error ret = TDM_ERROR_NONE; + + private_output = private_hwc->private_output; + TDM_RETURN_VAL_IF_FAIL(private_output != NULL, TDM_ERROR_INVALID_PARAMETER); + private_display = private_output->private_display; + + if (!private_output->vblank) { + /* tdm_vblank APIs is for server. it should be called in unlock status*/ + _pthread_mutex_unlock(&private_display->lock); + private_output->vblank = tdm_vblank_create(private_display, private_output, NULL); + _pthread_mutex_lock(&private_display->lock); + TDM_RETURN_VAL_IF_FAIL(private_output->vblank != NULL, TDM_ERROR_OPERATION_FAILED); + } + + if (!private_output->layer_waiting_vblank) { + ret = tdm_vblank_set_fps(private_output->vblank, hwc_vblank_fps); + if (ret != TDM_ERROR_NONE) + goto done; + + /* tdm_vblank APIs is for server. it should be called in unlock status*/ + _pthread_mutex_unlock(&private_display->lock); + ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_hwc_cb_wait_vblank, hwc_commit_handler); + _pthread_mutex_lock(&private_display->lock); + if (ret != TDM_ERROR_NONE) { + if (!TDM_OUTPUT_DPMS_VSYNC_IS_OFF(private_output->current_dpms_value)) + goto done; + } + + hwc_commit_handler->use_vblank = 1; + private_output->layer_waiting_vblank = 1; + } + +done: + return ret; +} + INTERN tdm_error tdm_hwc_init(tdm_private_display *private_display) { @@ -179,6 +274,20 @@ tdm_hwc_init(tdm_private_display *private_display) return TDM_ERROR_NONE; } +INTERN void +tdm_hwc_set_vblank(unsigned int fps) +{ + hwc_use_vblank = 1; + hwc_vblank_fps = fps; +} + +INTERN void +tdm_hwc_unset_vblank(void) +{ + hwc_use_vblank = 0; + hwc_vblank_fps = 0; +} + EXTERN tdm_hwc_window * tdm_hwc_create_window(tdm_hwc *hwc, tdm_error *error) { @@ -635,9 +744,19 @@ tdm_hwc_commit(tdm_hwc *hwc, int sync, tdm_hwc_commit_handler func, void *user_d ret = func_hwc->hwc_commit(private_hwc->hwc_backend, sync, hwc_commit_handler); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); - if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("hwc(%d) backend commit: handle(%p) func(%p) user_data(%p)", - private_hwc->index, hwc_commit_handler, func, user_data); + if (hwc_use_vblank) { + ret = _tdm_hwc_vblank(private_hwc, hwc_commit_handler); + if (ret == TDM_ERROR_NONE) { + if (tdm_debug_module & TDM_DEBUG_COMMIT) + TDM_INFO("hwc(%d) backend commit: wait vblank handle(%p) func(%p) user_data(%p)", + private_hwc->index, hwc_commit_handler, func, user_data); + } else + goto commit_failed; + } else { + if (tdm_debug_module & TDM_DEBUG_COMMIT) + TDM_INFO("hwc(%d) backend commit: handle(%p) func(%p) user_data(%p)", + private_hwc->index, hwc_commit_handler, func, user_data); + } _pthread_mutex_unlock(&private_display->lock); diff --git a/src/tdm_private.h b/src/tdm_private.h index 33904da..e8e3c08 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -184,6 +184,10 @@ tdm_pp_destroy_internal(tdm_private_pp *private_pp); tdm_error tdm_hwc_init(tdm_private_display *private_display); +void +tdm_hwc_set_vblank(unsigned int fps); +void +tdm_hwc_unset_vblank(void); tdm_hwc_window * tdm_hwc_window_create_internal(tdm_private_hwc *private_hwc, tdm_error *error); void diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index a778e25..bbc83cd 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -501,6 +501,7 @@ struct _tdm_private_hwc_commit_handler { void *user_data; pid_t owner_tid; + int use_vblank; }; struct _tdm_private_layer_commit_handler { -- 2.7.4 From d2fa49d3857fe065de1eefcb8afb5acdc69ca346 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 16 Oct 2019 19:13:35 +0900 Subject: [PATCH 07/16] tdm_vblank: execute hwc_vblank set and unset when tdm_vblank_enable_global_fps called Change-Id: Ia6f39e191079ad8089337a5b54563c5bfc66887d Signed-off-by: Junkyeong Kim --- src/tdm_vblank.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 977e402..fe72c64 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -597,6 +597,12 @@ tdm_vblank_enable_global_fps(unsigned int enable, unsigned int fps) v->check_HW_or_SW = 1; } + + if (enable) + tdm_hwc_set_vblank(fps); + else + tdm_hwc_unset_vblank(); + pthread_mutex_unlock(&valid_list_lock); return TDM_ERROR_NONE; -- 2.7.4 From cfc2ab0711fd65a2060f28d360bd2fa298daf8e6 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 1 Nov 2019 13:15:27 +0900 Subject: [PATCH 08/16] package version up to 2.10.0 tizen 6.0 starts here. Change-Id: Id0d8986d728499f6c39b9674260a32c865707cc1 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index db7f805..de1a348 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.9.6 +Version: 2.10.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From aee1916ab7a92750dad9e3a9b71ddd5859be05d6 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 5 Nov 2019 17:14:52 +0900 Subject: [PATCH 09/16] tdm_virtual_hwc: fix a typing error Change-Id: I5c9215625205df38e17bc62cb951bf26c2236c75 Signed-off-by: Junkyeong Kim --- backends/virtual/tdm_virtual_hwc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/virtual/tdm_virtual_hwc.c b/backends/virtual/tdm_virtual_hwc.c index 42031cc..cd72e5c 100644 --- a/backends/virtual/tdm_virtual_hwc.c +++ b/backends/virtual/tdm_virtual_hwc.c @@ -182,7 +182,7 @@ _virtual_hwc_apply_policy(tdm_virtual_hwc_data *hwc_data , tdm_hwc_window **comp return; } - /* use onyl target_window */ + /* use only target_window */ for (i = 0; i < num_wnds; i++) { composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; composited_list[i]->lzpos = ZPOS_NONE; -- 2.7.4 From 1f039353972978e5babb3cc6b09d76c82122e7f2 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 6 Nov 2019 14:05:56 +0900 Subject: [PATCH 10/16] tdm_client: add log to check vblank list validation Change-Id: I27bee79bf7f5b7bd87dd0815c9fbf4b0f897439b Signed-off-by: Junkyeong Kim --- client/tdm_client.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/client/tdm_client.c b/client/tdm_client.c index bde7a1f..543805c 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -225,6 +225,17 @@ _tdm_client_vblank_cb_stamp(void *data, struct wl_tdm_vblank *wl_tdm_vblank, uin } /* LCOV_EXCL_START */ +static int +_tdm_client_vblank_wait_list_validation_check(tdm_private_client_vblank *private_vblank) +{ + if (private_vblank->wait_list.next == NULL || private_vblank->wait_list.prev == NULL) { + TDM_ERR("vblank(%p) wait_list broken. prev(%p), next(%p) pid(%d)", + private_vblank, private_vblank->wait_list.prev, private_vblank->wait_list.next, getpid()); + } + + return 0; +} + static void _tdm_client_vblank_cb_done(void *data, struct wl_tdm_vblank *wl_tdm_vblank, uint32_t req_id, uint32_t sequence, uint32_t tv_sec, @@ -243,6 +254,8 @@ _tdm_client_vblank_cb_done(void *data, struct wl_tdm_vblank *wl_tdm_vblank, TDM_DBG("vblank(%p) req_id(%u) sequence(%u) time(%.6f)", private_vblank, req_id, sequence, TDM_TIME(tv_sec, tv_usec)); + _tdm_client_vblank_wait_list_validation_check(private_vblank); + LIST_FOR_EACH_ENTRY(w, &private_vblank->wait_list, link) { if (w->req_id != req_id) continue; -- 2.7.4 From bba097bfa37e259cd0d59e00b1f7d24db54fe5e9 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 12 Dec 2019 13:25:25 +0900 Subject: [PATCH 11/16] tdm_helper: set up error handling when dump png Change-Id: Id3c9d591057b3ab73358ab810fb551452ee7cba0 --- src/tdm_helper.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 804a112..08477f1 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -136,6 +136,13 @@ _tdm_helper_dump_png(const char *file, const void *data, int width, return; } + if (setjmp(png_jmpbuf(pPngStruct))) { + /* if png has problem of writing the file, we get here */ + png_destroy_write_struct(&pPngStruct, &pPngInfo); + fclose(fp); + return; + } + png_init_io(pPngStruct, fp); png_set_IHDR(pPngStruct, pPngInfo, -- 2.7.4 From 00e93c2550c7ecf3af1ee6f6b52efdff19987e11 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 12 Dec 2019 13:58:27 +0900 Subject: [PATCH 12/16] package version up to 2.10.1 Change-Id: I56cac312280a9da8cf227acc36ca43d6b8936b1e --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index de1a348..35db5b4 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.10.0 +Version: 2.10.1 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From caf84724385f90c3855462fee4258a586d846ef1 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Tue, 7 Jan 2020 18:19:37 +0900 Subject: [PATCH 13/16] haltest: silence warning due to dangling-else. Change-Id: I0a0337dd73d2ffb4fbbce2aa1054ffe92795f461 --- haltests/Makefile.am | 3 +++ 1 file changed, 3 insertions(+) diff --git a/haltests/Makefile.am b/haltests/Makefile.am index 278e1ef..c0da6de 100644 --- a/haltests/Makefile.am +++ b/haltests/Makefile.am @@ -22,9 +22,12 @@ tdm_haltests_SOURCES = \ tdm_haltests_SOURCES += \ ../tools/buffers.c +EXTRA_CFLAGS="-Wno-dangling-else" + tdm_haltests_CXXFLAGS = \ $(CXXFLAGS) \ $(TDM_CFLAGS) \ + $(EXTRA_CFLAGS) \ -I../src \ -I../include \ -I../client \ -- 2.7.4 From ec8499987ff827caef610435c4368a1139e7198d Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Tue, 7 Jan 2020 18:23:13 +0900 Subject: [PATCH 14/16] silence format truncation warning. add nul byte at the end of array to fix warning about possible truncation by snprintf. Change-Id: Ib399a9a2f2d552e427fa4c240a616e46267df584 --- src/tdm.c | 7 ++++++- src/tdm_layer.c | 6 +++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index c7289e8..76c1c5e 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -464,6 +464,7 @@ _tdm_display_update_caps_output(tdm_private_module *private_module, int pipe, char temp[TDM_NAME_LEN]; tdm_error ret; double stamp; + int n; stamp = tdm_helper_get_time(); ret = func_output->output_get_capability(output_backend, caps); @@ -476,7 +477,11 @@ _tdm_display_update_caps_output(tdm_private_module *private_module, int pipe, } /* FIXME: Use model for tdm client to distinguish amoung outputs */ - snprintf(temp, TDM_NAME_LEN, "%s-%d", caps->model, pipe); + n = snprintf(temp, sizeof(temp), "%s-%d", caps->model, pipe); + if ((size_t)n >= sizeof(temp)) { + temp[sizeof(temp) - 1] = '\0'; + } + snprintf(caps->model, TDM_NAME_LEN, "%s", temp); return TDM_ERROR_NONE; diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 22cdb47..488f498 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -343,6 +343,7 @@ _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer) tdm_private_layer *l = NULL; char *p = bufs; int *remain = &len; + int n; pipe = private_output->pipe; zpos = private_layer->caps.zpos; @@ -354,7 +355,10 @@ _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer) TDM_SNPRINTF(p, remain, "_%p", l->showing_buffer->buffer); } - snprintf(fname, sizeof(fname), "tdm_%d_lyr_%d%s", pipe, zpos, bufs); + n = snprintf(fname, sizeof(fname), "tdm_%d_lyr_%d%s", pipe, zpos, bufs); + if ((size_t)n >= sizeof(fname)) { + fname[sizeof(fname) - 1] = '\0'; + } tbm_surface_internal_dump_buffer(buffer, fname); TDM_DBG("%s dump excute", fname); -- 2.7.4 From 0c0b6f5c9111594f3323dc28381d0788bae24881 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Tue, 7 Jan 2020 18:29:19 +0900 Subject: [PATCH 15/16] silence stringio truncation warning give a bigger number as a size and add nul byte at the end of array in case of causing truncation. Change-Id: I8db4fb74774810b83c2f92bd21ed4d1a0943b063 --- src/tdm_helper.c | 2 +- src/tdm_server.c | 11 ++++++----- tools/tdm_test_client.c | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 08477f1..5fe5403 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -295,7 +295,7 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) strncat(p, file, len); p += len; *(p++) = '.'; - strncat(p, ext, 3); + strncat(p, ext, 4); p += 3; *p = '\0'; } else { diff --git a/src/tdm_server.c b/src/tdm_server.c index 25ad51d..3c32a54 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -148,12 +148,11 @@ _tdm_server_get_process_name(pid_t pid, char *name, unsigned int size) len = fread(pname, sizeof(char), TDM_NAME_LEN, h); if (len == 0) { - strncpy(pname, "NO NAME", 7); - len = 8; + strncpy(pname, "NO NAME", sizeof(pname)); + pname[sizeof(pname) - 1] = '\0'; } - pname[len - 1] = '\0'; - strncpy(name, pname, size - 1); + strncpy(name, pname, size); name[size - 1] = '\0'; fclose(h); @@ -1403,7 +1402,9 @@ _tdm_server_cb_debug(struct wl_client *client, struct wl_resource *resource, con char buffer[TDM_DEBUG_REPLY_MSG_LEN]; int copylen = TDM_MIN(size, sizeof(buffer) - 1); - strncpy(buffer, m, copylen); + strncpy(buffer, m, sizeof(buffer)); + buffer[sizeof(buffer) - 1] = '\0'; + m += copylen; size -= copylen; diff --git a/tools/tdm_test_client.c b/tools/tdm_test_client.c index ab12626..14feed9 100644 --- a/tools/tdm_test_client.c +++ b/tools/tdm_test_client.c @@ -520,7 +520,7 @@ _tdm_client_dump_buffer(tbm_surface_h buffer, const char *file) strncat(p, file, len); p += len; *(p++) = '.'; - strncat(p, ext, 3); + strncat(p, ext, 4); p += 3; *p = '\0'; } else { -- 2.7.4 From 30949018011da89d4e011a0ea6ea0bd79c8041b4 Mon Sep 17 00:00:00 2001 From: Seunghun Lee Date: Tue, 14 Jan 2020 14:01:14 +0900 Subject: [PATCH 16/16] fix stringio truncation warning Change-Id: I8248896a4f6f936f252ba45a5f9ef1649ce41ccd --- src/tdm_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tdm_server.c b/src/tdm_server.c index 3c32a54..2343d8d 100644 --- a/src/tdm_server.c +++ b/src/tdm_server.c @@ -1402,7 +1402,7 @@ _tdm_server_cb_debug(struct wl_client *client, struct wl_resource *resource, con char buffer[TDM_DEBUG_REPLY_MSG_LEN]; int copylen = TDM_MIN(size, sizeof(buffer) - 1); - strncpy(buffer, m, sizeof(buffer)); + memcpy(buffer, m, sizeof(buffer)); buffer[sizeof(buffer) - 1] = '\0'; m += copylen; -- 2.7.4