From dc1e81c0f4f0c6e6c4c0d4d553cf8ba730dfb4f5 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 3 Jan 2018 20:16:25 +0900 Subject: [PATCH 01/16] vblank: return TDM_ERROR_TIMEOUT when timeout occurs If a vblank callback isn't called in 2000ms, tdm vblank will return TDM_ERROR_TIMEOUT to client. Change-Id: Ib5cd14dddd8bef051e01664c52021f57c7099f48 --- include/tdm_common.h | 1 + src/tdm_vblank.c | 148 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 140 insertions(+), 9 deletions(-) diff --git a/include/tdm_common.h b/include/tdm_common.h index b170c48..cfc031c 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -68,6 +68,7 @@ typedef enum { TDM_ERROR_NO_CAPABILITY = -9, /**< no capability */ TDM_ERROR_DPMS_OFF = -10, /**< dpms off */ TDM_ERROR_OUTPUT_DISCONNECTED = -11, /**< output disconnected */ + TDM_ERROR_TIMEOUT = -12, /**< timeout */ } tdm_error; /** diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index e0ca079..99cb744 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -128,6 +128,9 @@ typedef struct _tdm_private_vblank { /* for SW */ tdm_event_loop_source *SW_timer; struct list_head SW_wait_list; + + /* for timeout */ + tdm_event_loop_source *timeout_timer; } tdm_private_vblank; struct _tdm_vblank_wait_info { @@ -172,6 +175,9 @@ static tdm_error _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info); static void _tdm_vblank_cb_vblank_HW(tdm_output *output, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data); +static void _tdm_vblank_timeout_timer_update(tdm_private_vblank *private_vblank, int ms_delay); +static void _tdm_vblank_get_client_information(tdm_private_vblank *private_vblank, + pid_t *pid, const char **name); #if 0 static void @@ -332,6 +338,13 @@ _tdm_vblank_free_HW_wait(tdm_private_vblank *private_vblank, tdm_error error, un { tdm_vblank_wait_info *w = NULL, *ww = NULL; + if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) + TDM_NEVER_GET_HERE(); + + tdm_display_lock(private_vblank->dpy); + _tdm_vblank_timeout_timer_update(private_vblank, 0); + tdm_display_unlock(private_vblank->dpy); + LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); @@ -702,14 +715,20 @@ tdm_vblank_destroy(tdm_vblank *vblank) tdm_output_remove_change_handler(private_vblank->output, _tdm_vblank_cb_output_change, private_vblank); - _tdm_vblank_free_HW_wait(private_vblank, 0, 0); - LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); free(w); } + _tdm_vblank_free_HW_wait(private_vblank, 0, 0); + + if (private_vblank->timeout_timer) { + tdm_display_lock(private_vblank->dpy); + tdm_event_loop_source_remove(private_vblank->timeout_timer); + tdm_display_unlock(private_vblank->dpy); + } + VIN("destroyed"); free(private_vblank); @@ -912,6 +931,84 @@ tdm_vblank_get_enable_fake(tdm_vblank *vblank, unsigned int *enable_fake) } static tdm_error +_tdm_vblank_timeout_timer_cb(void *user_data) +{ + tdm_private_vblank *private_vblank = user_data; + tdm_vblank_wait_info *w = NULL, *ww = NULL; + tdm_error error = TDM_ERROR_TIMEOUT; + pid_t pid; + const char *proc_name; + + TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(private_vblank), TDM_ERROR_OPERATION_FAILED); + + _tdm_vblank_get_client_information(private_vblank, &pid, &proc_name); + + if (!LIST_IS_EMPTY(&private_vblank->HW_wait_list)) { + + VER("HW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name); + + LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { + LIST_DEL(&w->link); + _tdm_vblank_valid_list_del(&w->valid_link); + + tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); + + if (w->func) + w->func(private_vblank, error, 0, 0, 0, w->user_data); + + free(w); + } + } + + if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) { + + VER("SW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name); + + LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) { + LIST_DEL(&w->link); + _tdm_vblank_valid_list_del(&w->valid_link); + + if (w->func) + w->func(private_vblank, error, 0, 0, 0, w->user_data); + + free(w); + } + } + + return TDM_ERROR_NONE; +} + +static void +_tdm_vblank_timeout_timer_update(tdm_private_vblank *private_vblank, int ms_delay) +{ + tdm_error ret; + + if (!private_vblank->timeout_timer) { + private_vblank->timeout_timer = + tdm_event_loop_add_timer_handler(private_vblank->dpy, + _tdm_vblank_timeout_timer_cb, + private_vblank, + &ret); + if (!private_vblank->timeout_timer) { + VER("couldn't add timer"); + return; + } + VIN("Create Timeout timer"); + } + + ret = tdm_event_loop_source_timer_update(private_vblank->timeout_timer, ms_delay); + if (ret != TDM_ERROR_NONE) { + VER("couldn't update timer"); + return; + } + + if (ms_delay != 0) + VDB("timeout timer updated"); + else + VDB("timeout timer disabled"); +} + +static tdm_error _tdm_vblank_sw_timer_update(tdm_private_vblank *private_vblank) { tdm_vblank_wait_info *first_wait_info = NULL; @@ -1017,6 +1114,13 @@ _tdm_vblank_cb_vblank_HW(tdm_output *output, unsigned int sequence, VWR("couldn't update sw timer"); } + if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) + TDM_NEVER_GET_HERE(); + + tdm_display_lock(private_vblank->dpy); + _tdm_vblank_timeout_timer_update(private_vblank, 0); + tdm_display_unlock(private_vblank->dpy); + LIST_DEL(&wait_info->link); _tdm_vblank_valid_list_del(&wait_info->valid_link); @@ -1168,6 +1272,11 @@ tdm_vblank_cb_vblank_SW(tdm_vblank *vblank, double vblank_stamp) return TDM_ERROR_OPERATION_FAILED; } + if (!LIST_IS_EMPTY(&private_vblank->HW_wait_list)) + TDM_NEVER_GET_HERE(); + + _tdm_vblank_timeout_timer_update(private_vblank, 0); + first_wait_info = container_of(private_vblank->SW_wait_list.next, first_wait_info, link); TDM_RETURN_VAL_IF_FAIL(first_wait_info != NULL, TDM_ERROR_OPERATION_FAILED); @@ -1387,6 +1496,10 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, /* LCOV_EXCL_STOP */ } + tdm_display_lock(private_vblank->dpy); + _tdm_vblank_timeout_timer_update(private_vblank, 2000); + tdm_display_unlock(private_vblank->dpy); + return TDM_ERROR_NONE; } @@ -1483,6 +1596,29 @@ tdm_vblank_get_stamp(tdm_vblank *vblank) return private_vblank->stamp; } +static void +_tdm_vblank_get_client_information(tdm_private_vblank *private_vblank, pid_t *pid, const char **name) +{ + struct wl_client *client; + + if (!private_vblank->resource) + goto no_client; + + client = wl_resource_get_client(private_vblank->resource); + if (!client) + goto no_client; + + wl_client_get_credentials(client, pid, NULL, NULL); + *name = tdm_server_get_client_name(*pid); + + return; + +no_client: + *pid = 0; + *name = NULL; + return; +} + /* LCOV_EXCL_START */ INTERN void tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) @@ -1500,13 +1636,7 @@ tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) const char *proc_name = NULL; pid_t pid = 0; - if (v->resource) { - struct wl_client *client = wl_resource_get_client(v->resource); - if (client) { - wl_client_get_credentials(client, &pid, NULL, NULL); - proc_name = tdm_server_get_client_name(pid); - } - } + _tdm_vblank_get_client_information(v, &pid, &proc_name); TDM_SNPRINTF(reply, len, "%-12s %u %u %d %u %s (pid: %u)\n", v->name, v->fps, v->ignore_global_fps, v->offset, v->enable_fake, -- 2.7.4 From bffe73c130b6d94bb96333b7434b101c5ca3819d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 3 Jan 2018 20:29:58 +0900 Subject: [PATCH 02/16] package version up to 1.11.1 Change-Id: Ie5ab819303b054ae192e31d81ca01e653888c20a --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index ffaa123..895c21e 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %define UTEST_PACKAGE 1 Name: libtdm -Version: 1.11.0 +Version: 1.11.1 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 2439a9bfda0fa139819211de1fec578ca46352fd Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 4 Jan 2018 10:48:28 +0900 Subject: [PATCH 03/16] utest: check the return value. Change-Id: I24e639bbf8a5894cbd2aa8efe6ee6693c4cc6465 --- utests/src/ut_tdm_client.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/utests/src/ut_tdm_client.cpp b/utests/src/ut_tdm_client.cpp index a793bc7..678269b 100644 --- a/utests/src/ut_tdm_client.cpp +++ b/utests/src/ut_tdm_client.cpp @@ -467,6 +467,7 @@ void TDMClientTest::init_tdm(void) { int outputs_cnt = 0; tdm_output_type tdm_output_type; + tdm_error error; int output_modes_cnt = 0; const tdm_output_mode* output_modes; @@ -488,7 +489,12 @@ void TDMClientTest::init_tdm(void) deinit_tdm(); exit(EXIT_FAILURE); } - tdm_output_get_output_type(output, &tdm_output_type); + error = tdm_output_get_output_type(output, &tdm_output_type); + if (error != TDM_ERROR_NONE) { + std::cout << "tdm_output_get_output_type faild, server's gonna be stopped.\n"; + deinit_tdm(); + exit(EXIT_FAILURE); + } /* we're not interesting about other outputs */ if (tdm_output_type != TDM_OUTPUT_TYPE_VIRTUAL && -- 2.7.4 From f5f7565573119e47cfc3c132953097fc5b4158f1 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 4 Jan 2018 10:52:55 +0900 Subject: [PATCH 04/16] utest: initialize the damage variables Change-Id: I9adf1c96dcd5781e816ff74c258135884c132931 --- utests/src/ut_tdm_hwc_window.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utests/src/ut_tdm_hwc_window.cpp b/utests/src/ut_tdm_hwc_window.cpp index 544ddff..9a5c171 100644 --- a/utests/src/ut_tdm_hwc_window.cpp +++ b/utests/src/ut_tdm_hwc_window.cpp @@ -306,7 +306,7 @@ TEST_F(TDMOutputHwc, SetClientTargetBufferFailNullOutput) TEST_F(TDMOutputHwcWithoutHwcCap, SetClientTargetBufferFailNoHwc) { - tdm_hwc_region damage; + tdm_hwc_region damage = {.num_rects = 0, .rects = NULL}; for (int i = 0; i < output_count; i++) { tbm_surface_h target_buff = CreateBufferForOutput(i); @@ -320,7 +320,7 @@ TEST_F(TDMOutputHwcWithoutHwcCap, SetClientTargetBufferFailNoHwc) TEST_F(TDMOutputHwc, SetClientTargetBufferSuccessfulSetBuff) { - tdm_hwc_region damage; + tdm_hwc_region damage = {.num_rects = 0, .rects = NULL}; for (int i = 0; i < output_count; i++) { tbm_surface_h target_buff = CreateBufferForOutput(i); @@ -494,7 +494,8 @@ TEST_F(TDMHwcWindow, SetCompositionTypeFailInvalieCompositionType) /* tdm_error tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage); */ TEST_F(TDMHwcWindow, SetBufferDamageFailNullHwcWindow) { - tdm_hwc_region damage; + tdm_hwc_region damage = {.num_rects = 0, .rects = NULL}; + error = tdm_hwc_window_set_buffer_damage(NULL, damage); ASSERT_NE(TDM_ERROR_NONE, error); } -- 2.7.4 From 7cc6f639e01e1121f2522cf560bf42e9892af21d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 4 Jan 2018 11:40:25 +0900 Subject: [PATCH 05/16] utest: cactch GoogleTestFailureException Change-Id: Ia137c1ba715b29ac7385f55218d51ca880f62fcc --- utests/src/ut_main.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/utests/src/ut_main.cpp b/utests/src/ut_main.cpp index 6443f33..c056a2f 100644 --- a/utests/src/ut_main.cpp +++ b/utests/src/ut_main.cpp @@ -32,6 +32,8 @@ int main(int argc, char **argv) { + auto AllTestSuccess = false; + try { ::testing::InitGoogleTest(&argc, argv); ::testing::FLAGS_gtest_death_test_style = "fast"; @@ -39,5 +41,14 @@ int main(int argc, char **argv) std::cout << "error while trying to init google tests.\n"; exit(EXIT_FAILURE); } - return RUN_ALL_TESTS(); -} + + try { + AllTestSuccess = RUN_ALL_TESTS() == 0 ? true : false; + } catch (const ::testing::internal::GoogleTestFailureException& e) { + AllTestSuccess = false; + std::cout << "GoogleTestFailureException was thrown:"<< e.what() << std::endl; + std::cout << "\n"; + } + + return AllTestSuccess; +} \ No newline at end of file -- 2.7.4 From e67997b3e6f2aacf7655006556a8a7e0d481e4ad Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Sun, 7 Jan 2018 10:20:04 +0900 Subject: [PATCH 06/16] hwc: allow Device Candidate to set composition type. Change-Id: I3aab482dcc9d037c91cacba9704586ffcd6f1390 --- src/tdm_hwc_window.c | 1 - utests/src/ut_tdm_hwc_window.cpp | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 1605f58..88a8e9d 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -140,7 +140,6 @@ tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window, HWC_WINDOW_FUNC_ENTRY(); TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_CURSOR, TDM_ERROR_INVALID_PARAMETER); - TDM_RETURN_VAL_IF_FAIL(composition_type != TDM_COMPOSITION_DEVICE_CANDIDATE, TDM_ERROR_INVALID_PARAMETER); _pthread_mutex_lock(&private_display->lock); diff --git a/utests/src/ut_tdm_hwc_window.cpp b/utests/src/ut_tdm_hwc_window.cpp index 9a5c171..ffea35f 100644 --- a/utests/src/ut_tdm_hwc_window.cpp +++ b/utests/src/ut_tdm_hwc_window.cpp @@ -484,8 +484,6 @@ TEST_F(TDMHwcWindow, SetCompositionTypeSuccessful) TEST_F(TDMHwcWindow, SetCompositionTypeFailInvalieCompositionType) { for (int i = 0; i < hwc_count; i++) { - error = tdm_hwc_window_set_composition_type(hwc_wins[i], TDM_COMPOSITION_DEVICE_CANDIDATE); - ASSERT_NE(TDM_ERROR_NONE, error); error = tdm_hwc_window_set_composition_type(hwc_wins[i], tdm_hwc_window_composition(TDM_COMPOSITION_NONE-1)); ASSERT_NE(TDM_ERROR_NONE, error); } -- 2.7.4 From 9da2a08b569429675c2071c19fc90e88106aee96 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 8 Jan 2018 10:46:03 +0900 Subject: [PATCH 07/16] package version up to 1.11.2 Change-Id: I7e57059690f019afdefdf3c0d329172b9b41107c --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 895c21e..0a99efd 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %define UTEST_PACKAGE 1 Name: libtdm -Version: 1.11.1 +Version: 1.11.2 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From e87df648c248d1d78fb7b6268bbf3ff2d8f93743 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 9 Jan 2018 14:55:27 +0900 Subject: [PATCH 08/16] Revert "vblank: return TDM_ERROR_TIMEOUT when timeout occurs" This reverts commit dc1e81c0f4f0c6e6c4c0d4d553cf8ba730dfb4f5. Change-Id: I2e1b765e34bf406dcb40a44f0658246e7e43d52a --- include/tdm_common.h | 1 - src/tdm_vblank.c | 148 ++++----------------------------------------------- 2 files changed, 9 insertions(+), 140 deletions(-) diff --git a/include/tdm_common.h b/include/tdm_common.h index cfc031c..b170c48 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -68,7 +68,6 @@ typedef enum { TDM_ERROR_NO_CAPABILITY = -9, /**< no capability */ TDM_ERROR_DPMS_OFF = -10, /**< dpms off */ TDM_ERROR_OUTPUT_DISCONNECTED = -11, /**< output disconnected */ - TDM_ERROR_TIMEOUT = -12, /**< timeout */ } tdm_error; /** diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 99cb744..e0ca079 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -128,9 +128,6 @@ typedef struct _tdm_private_vblank { /* for SW */ tdm_event_loop_source *SW_timer; struct list_head SW_wait_list; - - /* for timeout */ - tdm_event_loop_source *timeout_timer; } tdm_private_vblank; struct _tdm_vblank_wait_info { @@ -175,9 +172,6 @@ static tdm_error _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info); static void _tdm_vblank_cb_vblank_HW(tdm_output *output, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data); -static void _tdm_vblank_timeout_timer_update(tdm_private_vblank *private_vblank, int ms_delay); -static void _tdm_vblank_get_client_information(tdm_private_vblank *private_vblank, - pid_t *pid, const char **name); #if 0 static void @@ -338,13 +332,6 @@ _tdm_vblank_free_HW_wait(tdm_private_vblank *private_vblank, tdm_error error, un { tdm_vblank_wait_info *w = NULL, *ww = NULL; - if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) - TDM_NEVER_GET_HERE(); - - tdm_display_lock(private_vblank->dpy); - _tdm_vblank_timeout_timer_update(private_vblank, 0); - tdm_display_unlock(private_vblank->dpy); - LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); @@ -715,20 +702,14 @@ tdm_vblank_destroy(tdm_vblank *vblank) tdm_output_remove_change_handler(private_vblank->output, _tdm_vblank_cb_output_change, private_vblank); + _tdm_vblank_free_HW_wait(private_vblank, 0, 0); + LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) { LIST_DEL(&w->link); _tdm_vblank_valid_list_del(&w->valid_link); free(w); } - _tdm_vblank_free_HW_wait(private_vblank, 0, 0); - - if (private_vblank->timeout_timer) { - tdm_display_lock(private_vblank->dpy); - tdm_event_loop_source_remove(private_vblank->timeout_timer); - tdm_display_unlock(private_vblank->dpy); - } - VIN("destroyed"); free(private_vblank); @@ -931,84 +912,6 @@ tdm_vblank_get_enable_fake(tdm_vblank *vblank, unsigned int *enable_fake) } static tdm_error -_tdm_vblank_timeout_timer_cb(void *user_data) -{ - tdm_private_vblank *private_vblank = user_data; - tdm_vblank_wait_info *w = NULL, *ww = NULL; - tdm_error error = TDM_ERROR_TIMEOUT; - pid_t pid; - const char *proc_name; - - TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(private_vblank), TDM_ERROR_OPERATION_FAILED); - - _tdm_vblank_get_client_information(private_vblank, &pid, &proc_name); - - if (!LIST_IS_EMPTY(&private_vblank->HW_wait_list)) { - - VER("HW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name); - - LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->HW_wait_list, link) { - LIST_DEL(&w->link); - _tdm_vblank_valid_list_del(&w->valid_link); - - tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); - - if (w->func) - w->func(private_vblank, error, 0, 0, 0, w->user_data); - - free(w); - } - } - - if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) { - - VER("SW vblank TIMEOUT!! (pid: %u, name: %s)", pid, proc_name); - - LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->SW_wait_list, link) { - LIST_DEL(&w->link); - _tdm_vblank_valid_list_del(&w->valid_link); - - if (w->func) - w->func(private_vblank, error, 0, 0, 0, w->user_data); - - free(w); - } - } - - return TDM_ERROR_NONE; -} - -static void -_tdm_vblank_timeout_timer_update(tdm_private_vblank *private_vblank, int ms_delay) -{ - tdm_error ret; - - if (!private_vblank->timeout_timer) { - private_vblank->timeout_timer = - tdm_event_loop_add_timer_handler(private_vblank->dpy, - _tdm_vblank_timeout_timer_cb, - private_vblank, - &ret); - if (!private_vblank->timeout_timer) { - VER("couldn't add timer"); - return; - } - VIN("Create Timeout timer"); - } - - ret = tdm_event_loop_source_timer_update(private_vblank->timeout_timer, ms_delay); - if (ret != TDM_ERROR_NONE) { - VER("couldn't update timer"); - return; - } - - if (ms_delay != 0) - VDB("timeout timer updated"); - else - VDB("timeout timer disabled"); -} - -static tdm_error _tdm_vblank_sw_timer_update(tdm_private_vblank *private_vblank) { tdm_vblank_wait_info *first_wait_info = NULL; @@ -1114,13 +1017,6 @@ _tdm_vblank_cb_vblank_HW(tdm_output *output, unsigned int sequence, VWR("couldn't update sw timer"); } - if (!LIST_IS_EMPTY(&private_vblank->SW_wait_list)) - TDM_NEVER_GET_HERE(); - - tdm_display_lock(private_vblank->dpy); - _tdm_vblank_timeout_timer_update(private_vblank, 0); - tdm_display_unlock(private_vblank->dpy); - LIST_DEL(&wait_info->link); _tdm_vblank_valid_list_del(&wait_info->valid_link); @@ -1272,11 +1168,6 @@ tdm_vblank_cb_vblank_SW(tdm_vblank *vblank, double vblank_stamp) return TDM_ERROR_OPERATION_FAILED; } - if (!LIST_IS_EMPTY(&private_vblank->HW_wait_list)) - TDM_NEVER_GET_HERE(); - - _tdm_vblank_timeout_timer_update(private_vblank, 0); - first_wait_info = container_of(private_vblank->SW_wait_list.next, first_wait_info, link); TDM_RETURN_VAL_IF_FAIL(first_wait_info != NULL, TDM_ERROR_OPERATION_FAILED); @@ -1496,10 +1387,6 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, /* LCOV_EXCL_STOP */ } - tdm_display_lock(private_vblank->dpy); - _tdm_vblank_timeout_timer_update(private_vblank, 2000); - tdm_display_unlock(private_vblank->dpy); - return TDM_ERROR_NONE; } @@ -1596,29 +1483,6 @@ tdm_vblank_get_stamp(tdm_vblank *vblank) return private_vblank->stamp; } -static void -_tdm_vblank_get_client_information(tdm_private_vblank *private_vblank, pid_t *pid, const char **name) -{ - struct wl_client *client; - - if (!private_vblank->resource) - goto no_client; - - client = wl_resource_get_client(private_vblank->resource); - if (!client) - goto no_client; - - wl_client_get_credentials(client, pid, NULL, NULL); - *name = tdm_server_get_client_name(*pid); - - return; - -no_client: - *pid = 0; - *name = NULL; - return; -} - /* LCOV_EXCL_START */ INTERN void tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) @@ -1636,7 +1500,13 @@ tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) const char *proc_name = NULL; pid_t pid = 0; - _tdm_vblank_get_client_information(v, &pid, &proc_name); + if (v->resource) { + struct wl_client *client = wl_resource_get_client(v->resource); + if (client) { + wl_client_get_credentials(client, &pid, NULL, NULL); + proc_name = tdm_server_get_client_name(pid); + } + } TDM_SNPRINTF(reply, len, "%-12s %u %u %d %u %s (pid: %u)\n", v->name, v->fps, v->ignore_global_fps, v->offset, v->enable_fake, -- 2.7.4 From 13276f714fa4faf1485df81d2db169bb300e9bc4 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 9 Jan 2018 14:55:54 +0900 Subject: [PATCH 09/16] package version up to 1.11.3 Change-Id: I202d8808f01f842fdab3999224455514cc31c4d0 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 0a99efd..7efa83f 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %define UTEST_PACKAGE 1 Name: libtdm -Version: 1.11.2 +Version: 1.11.3 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 7fe9c76c28843a1b88057ced0e99cf33146feaad Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 9 Jan 2018 16:30:00 +0900 Subject: [PATCH 10/16] monitor: enhance vblank_list information Change-Id: I0624e291be53f0abbf8d991969de3e6a6b353759 --- src/tdm_vblank.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index e0ca079..abba414 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -115,6 +115,7 @@ typedef struct _tdm_private_vblank { double vblank_gap; unsigned int quotient; + int last_interval; unsigned int last_seq; double last_time; @@ -340,6 +341,9 @@ _tdm_vblank_free_HW_wait(tdm_private_vblank *private_vblank, tdm_error error, un tdm_output_remove_vblank_handler_internal(private_vblank->output, _tdm_vblank_cb_vblank_HW, w); tdm_display_unlock(private_vblank->dpy); + VDB("wait(%p) last(%.6f) sequence(%u) done (error:%d, call_cb:%u)", + w, 0, w->target_seq, error, call_cb); + if (call_cb && w->func) w->func(private_vblank, error, 0, 0, 0, w->user_data); @@ -657,6 +661,7 @@ tdm_vblank_create(tdm_display *dpy, tdm_output *output, tdm_error *error) private_vblank->output = output; private_vblank->check_HW_or_SW = 1; private_vblank->fps_changeable = 1; + private_vblank->last_interval = -1; _tdm_vblank_update_output_info(private_vblank); @@ -958,6 +963,8 @@ _tdm_vblank_sw_timer_update(tdm_private_vblank *private_vblank) VIN("Create SW timer"); } + private_vblank->last_interval = ms_delay; + ret = tdm_event_loop_source_timer_update(private_vblank->SW_timer, ms_delay); if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */ @@ -1103,6 +1110,8 @@ _tdm_vblank_wait_HW(tdm_vblank_wait_info *wait_info) skip, hw_interval, wait_info->target_seq); } + private_vblank->last_interval = hw_interval; + if (private_vblank->add_front) ret = tdm_output_wait_vblank_add_front(private_vblank->output, hw_interval, 0, _tdm_vblank_cb_vblank_HW, wait_info); @@ -1483,22 +1492,46 @@ tdm_vblank_get_stamp(tdm_vblank *vblank) return private_vblank->stamp; } +static unsigned int +_tdm_vblank_get_waiting_count(tdm_private_vblank *private_vblank) +{ + tdm_vblank_wait_info *wait_info = NULL; + unsigned int count = 0; + + LIST_FOR_EACH_ENTRY(wait_info, &private_vblank->HW_wait_list, link) { + count++; + } + + LIST_FOR_EACH_ENTRY(wait_info, &private_vblank->SW_wait_list, link) { + count++; + } + + return count; +} + /* LCOV_EXCL_START */ INTERN void tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) { tdm_private_vblank *v = NULL; + tdm_output_dpms dpms = TDM_OUTPUT_DPMS_OFF; + tdm_output *output = tdm_display_get_output(dpy, 0, NULL); + + if (output) + tdm_output_get_dpms(output, &dpms); TDM_SNPRINTF(reply, len, "[Client Vblank List]\n"); + TDM_SNPRINTF(reply, len, "* DPMS: %s\n", tdm_dpms_str(dpms)); TDM_SNPRINTF(reply, len, "* global fps: %u\n", vblank_global_fps); - TDM_SNPRINTF(reply, len, "---------------------------------------------------------------\n"); - TDM_SNPRINTF(reply, len, "name fps ignore offset fake process\n"); - TDM_SNPRINTF(reply, len, "---------------------------------------------------------------\n"); + TDM_SNPRINTF(reply, len, "----------------------------------------------------------------------------------\n"); + TDM_SNPRINTF(reply, len, "Name Type Wait Interval Sequence Fps Ignore Offset Fake Process\n"); + TDM_SNPRINTF(reply, len, "----------------------------------------------------------------------------------\n"); pthread_mutex_lock(&valid_list_lock); LIST_FOR_EACH_ENTRY(v, &valid_vblank_list, valid_link) { const char *proc_name = NULL; pid_t pid = 0; + unsigned int count; if (v->resource) { struct wl_client *client = wl_resource_get_client(v->resource); @@ -1508,9 +1541,18 @@ tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len) } } - TDM_SNPRINTF(reply, len, "%-12s %u %u %d %u %s (pid: %u)\n", - v->name, v->fps, v->ignore_global_fps, v->offset, v->enable_fake, - (proc_name) ? proc_name : "Unknown", pid); + count = _tdm_vblank_get_waiting_count(v); + + TDM_SNPRINTF(reply, len, "%-8s(%p) ", v->name, v); + TDM_SNPRINTF(reply, len, "%-4s ", (v->last_type == VBLANK_EVENT_TYPE_HW) ? "HW" : "SW"); + TDM_SNPRINTF(reply, len, "%-4s ", (count > 0) ? "O" : " "); + TDM_SNPRINTF(reply, len, "%-8d ", v->last_interval); + TDM_SNPRINTF(reply, len, "%-8u ", v->last_seq); + TDM_SNPRINTF(reply, len, "%-3u ", v->fps); + TDM_SNPRINTF(reply, len, "%-6u ", v->ignore_global_fps); + TDM_SNPRINTF(reply, len, "%-6d ", v->offset); + TDM_SNPRINTF(reply, len, "%-4u ", v->enable_fake); + TDM_SNPRINTF(reply, len, "%s(pid:%d)\n", (proc_name) ? proc_name : "Unknown", pid); } pthread_mutex_unlock(&valid_list_lock); -- 2.7.4 From b2ac517c738abad46508a44b2435cee98f5f83ab Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 9 Jan 2018 18:07:55 +0900 Subject: [PATCH 11/16] package version up to 1.11.4 Change-Id: Iae258ccfd542896d4e5f91842c450b307242465d --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 7efa83f..a551839 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %define UTEST_PACKAGE 1 Name: libtdm -Version: 1.11.3 +Version: 1.11.4 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From b90ed508ff9d10217e32a09a4d8fe6a129328d3b Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 10 Jan 2018 14:19:07 +0900 Subject: [PATCH 12/16] correct printf formats Change-Id: I8b414e1f2016298699a7f1c1dadc85b0414d910f --- src/tdm_capture.c | 2 +- src/tdm_layer.c | 2 +- src/tdm_pp.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 9d924c2..add764a 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -457,7 +457,7 @@ tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info) info->frequency = private_output->current_mode->vrefresh; } - TDM_INFO("capture(%p) info: dst(%dx%d %d,%d %dx%d %c%c%c%c) trans(%d) type(%d) freq(%d) flags(%x)", + TDM_INFO("capture(%p) info: dst(%ux%u %u,%u %ux%u %c%c%c%c) trans(%d) type(%d) freq(%d) flags(%x)", private_capture, info->dst_config.size.h, info->dst_config.size.v, info->dst_config.pos.x, info->dst_config.pos.y, diff --git a/src/tdm_layer.c b/src/tdm_layer.c index b906f74..0e66228 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -240,7 +240,7 @@ tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) else snprintf(fmtstr, 128, "NONE"); - TDM_INFO("layer(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)", + TDM_INFO("layer(%p) info: src(%ux%u %u,%u %ux%u %s) dst(%u,%u %ux%u) trans(%d)", private_layer, info->src_config.size.h, info->src_config.size.v, info->src_config.pos.x, info->src_config.pos.y, info->src_config.pos.w, info->src_config.pos.h, diff --git a/src/tdm_pp.c b/src/tdm_pp.c index 80eb330..ccec73f 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -366,7 +366,7 @@ tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info) /* LCOV_EXCL_STOP */ } - TDM_INFO("pp(%p) info: src(%dx%d %d,%d %dx%d %c%c%c%c) dst(%dx%d %d,%d %dx%d %c%c%c%c) trans(%d) sync(%d) flags(%x)", + TDM_INFO("pp(%p) info: src(%ux%u %u,%u %ux%u %c%c%c%c) dst(%ux%u %u,%u %ux%u %c%c%c%c) trans(%d) sync(%d) flags(%x)", private_pp, info->src_config.size.h, info->src_config.size.v, info->src_config.pos.x, info->src_config.pos.y, info->src_config.pos.w, info->src_config.pos.h, -- 2.7.4 From 142120b6f9cb4f48d10fcaba19a6b6702654cc1a Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 11 Jan 2018 10:32:28 +0900 Subject: [PATCH 13/16] add pp scanout capability can be executed converting only scanout buffer. Change-Id: I9c1143ebf16f7be394709789b71da149e5356d79 Signed-off-by: Junkyeong Kim --- include/tdm_common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/tdm_common.h b/include/tdm_common.h index b170c48..d706e19 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -152,6 +152,7 @@ typedef enum { TDM_PP_CAPABILITY_ASYNC = (1 << 1), /**< The pp device supports asynchronous operation */ TDM_PP_CAPABILITY_SCALE = (1 << 4), /**< The pp device supports scale operation */ TDM_PP_CAPABILITY_TRANSFORM = (1 << 5), /**< The pp device supports transform operation */ + TDM_PP_CAPABILITY_SCANOUT = (1 << 6), /**< The pp device supports only scanout buffer */ } tdm_pp_capability; /** -- 2.7.4 From 020864ee8e611fc504576a7af5c485e05342210c Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 11 Jan 2018 19:21:09 +0900 Subject: [PATCH 14/16] hwc: change the type of the zpos Change-Id: Ibc014c34f2414cf7b186b7c740a085b21d8cfed7 --- include/tdm.h | 2 +- include/tdm_backend.h | 2 +- src/tdm_hwc_window.c | 2 +- utests/src/ut_tdm_hwc_window.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/tdm.h b/include/tdm.h index 3812842..18ef948 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -983,7 +983,7 @@ tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error * @since 2.0.0 */ tdm_error -tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos); +tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, int32_t zpos); /** * @brief Sets the desired composition type of the given window. diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 99eff29..fa36479 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -842,7 +842,7 @@ typedef struct _tdm_func_window { * @param[in] z the new Z order * @return #TDM_ERROR_NONE if success. Otherwise, error value. */ - tdm_error (*hwc_window_set_zpos)(tdm_hwc_window *hwc_window, uint32_t zpos); + tdm_error (*hwc_window_set_zpos)(tdm_hwc_window *hwc_window, int32_t zpos); /** * @brief Sets the desired composition type of the given window. diff --git a/src/tdm_hwc_window.c b/src/tdm_hwc_window.c index 88a8e9d..9fb69b6 100644 --- a/src/tdm_hwc_window.c +++ b/src/tdm_hwc_window.c @@ -104,7 +104,7 @@ tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error } EXTERN tdm_error -tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos) +tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, int32_t zpos) { tdm_func_hwc_window *func_hwc_window = NULL; diff --git a/utests/src/ut_tdm_hwc_window.cpp b/utests/src/ut_tdm_hwc_window.cpp index ffea35f..48472d3 100644 --- a/utests/src/ut_tdm_hwc_window.cpp +++ b/utests/src/ut_tdm_hwc_window.cpp @@ -446,7 +446,7 @@ TEST_F(TDMHwcWindow, GetBufferQueueSuccessful) } } -/* tdm_error tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos); */ +/* tdm_error tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, int32_t zpos); */ TEST_F(TDMHwcWindow, SetZposFailNull) { error = tdm_hwc_window_set_zpos(NULL, 1); -- 2.7.4 From 726c06f3a555bed0c3dc1d0e1488faf7d5b1ef8f Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 12 Jan 2018 13:00:38 +0900 Subject: [PATCH 15/16] hwc: add TDM_COMPOSITION_VIDEO Change-Id: Ib1ed904c821ab83cad4d79f8dc794649067b6228 --- include/tdm_types.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/tdm_types.h b/include/tdm_types.h index ebb8291..6813c72 100644 --- a/include/tdm_types.h +++ b/include/tdm_types.h @@ -187,6 +187,11 @@ typedef enum { * still permit the device to composite the layer. */ TDM_COMPOSITION_CURSOR = 4, + /** This type is for the VIDEO window which can be set to the reserved hw overlay + * which is assigned by the device. + * + * Normally, this VIDEO window displays under the primary hw overlayer of the output. */ + TDM_COMPOSITION_VIDEO = 5, } tdm_hwc_window_composition; /** -- 2.7.4 From ee8de55b67792c568eb4fbea8630a299d8138963 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 12 Jan 2018 13:18:05 +0900 Subject: [PATCH 16/16] package version up to 1.11.4 Change-Id: Ibbdc2481446d2f5e9bb6d5556ce57e0103af83d2 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index a551839..8abd7e0 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %define UTEST_PACKAGE 1 Name: libtdm -Version: 1.11.4 +Version: 1.11.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4