From f6bec662f8c95b24acc55715dc260caa2187da32 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 15 Mar 2018 14:28:56 +0900 Subject: [PATCH 01/16] utests: disable SetProperty tc not avaiable to test Change-Id: I782bdd0f4aec95421352cb4c607e1ead13ecc2ab --- utests/src/ut_tdm_layer.cpp | 18 +----------------- utests/src/ut_tdm_output.cpp | 16 +--------------- 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/utests/src/ut_tdm_layer.cpp b/utests/src/ut_tdm_layer.cpp index 4d97221..caca8eb 100644 --- a/utests/src/ut_tdm_layer.cpp +++ b/utests/src/ut_tdm_layer.cpp @@ -548,24 +548,8 @@ TEST_P(TDMLayer, LayerGetZposNullParam) ASSERT_EQ(tdm_layer_get_zpos(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER); } -TEST_P(TDMLayer, LayerSetProperty) +TEST_P(TDMLayer, DISABLED_LayerSetProperty) { - TDM_UT_SKIP_FLAG(has_layers); - - for (int l = 0; l < layer_count; l++) { - if (!ut_tdm_layer_is_avaiable(layers[l])) - continue; - - const tdm_prop *props = (const tdm_prop *)TDM_UT_INVALID_VALUE; - int count = TDM_UT_INVALID_VALUE; - tdm_value value = {.s32 = 0}; - - ASSERT_EQ(tdm_layer_get_available_properties(layers[l], &props, &count), TDM_ERROR_NONE); - ASSERT_GE(count, 0); - - if (count > 0) - ASSERT_EQ(tdm_layer_set_property(layers[l], props[0].id, value), TDM_ERROR_NONE); - } } TEST_P(TDMLayer, LayerSetPropertyNullObject) diff --git a/utests/src/ut_tdm_output.cpp b/utests/src/ut_tdm_output.cpp index 479224c..d4bb6e1 100644 --- a/utests/src/ut_tdm_output.cpp +++ b/utests/src/ut_tdm_output.cpp @@ -820,22 +820,8 @@ TEST_P(TDMOutput, OutputGetPrimaryIndexNullOther) ASSERT_EQ(tdm_output_get_primary_index(outputs[0], NULL), TDM_ERROR_INVALID_PARAMETER); } -TEST_P(TDMOutput, OutputSetProperty) +TEST_P(TDMOutput, DISABLED_OutputSetProperty) { - TDM_UT_SKIP_FLAG(has_outputs); - - for (int o = 0; o < output_count; o++) { - const tdm_prop *props = (const tdm_prop *)TDM_UT_INVALID_VALUE; - int count = TDM_UT_INVALID_VALUE; - tdm_value value = {.s32 = 0}; - - ASSERT_EQ(tdm_output_get_available_properties(outputs[o], &props, &count), TDM_ERROR_NONE); - ASSERT_GE(count, 0); - if (count > 0) { - ASSERT_TRUE(props != NULL && props != (const tdm_prop *)TDM_UT_INVALID_VALUE); - ASSERT_EQ(tdm_output_set_property(outputs[o], props[0].id, value), TDM_ERROR_NONE); - } - } } TEST_P(TDMOutput, OutputSetPropertyNullObject) -- 2.7.4 From d5e13e8d0378b735832ad6a5596b45776035ecbe Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 15 Mar 2018 14:30:23 +0900 Subject: [PATCH 02/16] utests: fix deadlock after adding change handler, have to call handle_events to dispatch events. Change-Id: Id8bc3b52508b383b5fc204bfc493d79cf172065d --- utests/src/ut_tdm_client.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utests/src/ut_tdm_client.cpp b/utests/src/ut_tdm_client.cpp index 858bc28..e4b445b 100644 --- a/utests/src/ut_tdm_client.cpp +++ b/utests/src/ut_tdm_client.cpp @@ -579,8 +579,10 @@ TEST_P(TDMClient, ClientOutputAddChangeHandler) ASSERT_EQ(dpms, TDM_OUTPUT_DPMS_OFF); ASSERT_EQ(_ut_tdm_pipe_write_msg(pipe_child[1], pipe_parent[0], TDM_UT_PIPE_MSG_DPMS_ON), true); - while (dpms != TDM_OUTPUT_DPMS_ON) + while (dpms != TDM_OUTPUT_DPMS_ON) { + ASSERT_EQ(tdm_client_handle_events_timeout(client, 3000), TDM_ERROR_NONE); ASSERT_EQ(tdm_client_output_get_dpms(output, &dpms), TDM_ERROR_NONE); + } } TEST_P(TDMClient, ClientOutputAddChangeHandlerTwice) -- 2.7.4 From 4f0102b065f289479ae76fa6661f5969583e2085 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Thu, 15 Mar 2018 16:56:56 +0900 Subject: [PATCH 03/16] package version up to 1.16.5 Change-Id: I9052516fba6f6a7e98e22908b3a5c36f32fe67aa --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 21f462e..13b2af7 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define UTEST_GCOV 0 Name: libtdm -Version: 1.16.4 +Version: 1.16.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 3dab774282940b13db1792b57deaf50109d9d5e3 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 08:35:32 +0900 Subject: [PATCH 04/16] Revert "output: seperate output-status and output-dpms change" This reverts commit dd84f199e0e855ca945bae239c152fa22147af53. Change-Id: I0aa9117c9dac6ee5664f549bcf25a51fca072efb --- src/tdm.c | 3 +- src/tdm_macro.h | 3 +- src/tdm_output.c | 98 +++++++++++++++---------------------------------- src/tdm_private_types.h | 16 +++----- src/tdm_thread.c | 13 +++---- 5 files changed, 42 insertions(+), 91 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 42387fd..c17e9fc 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -198,8 +198,7 @@ _tdm_display_destroy_private_output(tdm_private_output *private_output) LIST_FOR_EACH_ENTRY_SAFE(h, hh, &private_output->change_handler_list, link) { LIST_DEL(&h->link); - tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, h); - tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, h); + tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, h); free(h); } diff --git a/src/tdm_macro.h b/src/tdm_macro.h index acdc9f3..45bde65 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -244,8 +244,7 @@ static struct tdm_type_name tdm_cb_type_names[] = { { TDM_THREAD_CB_NONE, "none" }, { TDM_THREAD_CB_OUTPUT_COMMIT, "output-commit" }, { TDM_THREAD_CB_OUTPUT_VBLANK, "output-vblank" }, - { TDM_THREAD_CB_OUTPUT_STATUS, "output-status" }, - { TDM_THREAD_CB_OUTPUT_DPMS, "output-dpms" }, + { TDM_THREAD_CB_OUTPUT_CHANGE, "output-change" }, { TDM_THREAD_CB_PP_DONE, "pp-done" }, { TDM_THREAD_CB_CAPTURE_DONE, "capture-done" }, { TDM_THREAD_CB_VBLANK_SW, "vblank-sw" }, diff --git a/src/tdm_output.c b/src/tdm_output.c index 652e262..b87da84 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -146,9 +146,7 @@ tdm_output_init(tdm_private_display *private_display) { tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_COMMIT, tdm_display_find_output_stamp); tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_VBLANK, tdm_display_find_output_stamp); - tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_STATUS, tdm_display_find_output_stamp); - tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_DPMS, tdm_display_find_output_stamp); - + tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_CHANGE, tdm_display_find_output_stamp); return TDM_ERROR_NONE; } @@ -228,68 +226,34 @@ INTERN void tdm_output_thread_cb_change(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data) { tdm_private_output *private_output = object; + tdm_thread_cb_output_change *output_change = (tdm_thread_cb_output_change *)cb_base; tdm_private_output_change_handler *change_handler = user_data; - tdm_output_change_type type = TDM_OUTPUT_CHANGE_CONNECTION; - tdm_value value = {.u32 = 0 }; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); assert(change_handler->owner_tid == syscall(SYS_gettid)); - if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) { - tdm_thread_cb_output_status *output_status = (tdm_thread_cb_output_status *)cb_base; - type = TDM_OUTPUT_CHANGE_CONNECTION; - value.u32 = output_status->status; - } else if (cb_base->type == TDM_THREAD_CB_OUTPUT_DPMS) { - tdm_thread_cb_output_dpms *output_dpms = (tdm_thread_cb_output_dpms *)cb_base; - type = TDM_OUTPUT_CHANGE_DPMS; - value.u32 = output_dpms->dpms; - } else { - TDM_NEVER_GET_HERE(); - return; - } - _pthread_mutex_unlock(&private_display->lock); - change_handler->func(private_output, type, value, change_handler->user_data); + change_handler->func(private_output, output_change->type, output_change->value, change_handler->user_data); _pthread_mutex_lock(&private_display->lock); - } static tdm_error -_tdm_output_call_thread_cb_status(tdm_private_output *private_output, tdm_output_conn_status status) +_tdm_output_call_thread_cb_change(tdm_private_output *private_output, tdm_output_change_type type, tdm_value value) { - tdm_thread_cb_output_status output_status; + tdm_thread_cb_output_change output_change; tdm_error ret; - memset(&output_status, 0, sizeof output_status); - output_status.base.type = TDM_THREAD_CB_OUTPUT_STATUS; - output_status.base.length = sizeof output_status; - output_status.base.object_stamp = private_output->stamp; - output_status.base.data = NULL; - output_status.base.sync = 1; - output_status.status = status; + memset(&output_change, 0, sizeof output_change); + output_change.base.type = TDM_THREAD_CB_OUTPUT_CHANGE; + output_change.base.length = sizeof output_change; + output_change.base.object_stamp = private_output->stamp; + output_change.base.data = NULL; + output_change.base.sync = 1; + output_change.type = type; + output_change.value = value; - ret = tdm_thread_cb_call(private_output, &output_status.base); - TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); - - return TDM_ERROR_NONE; -} - -static tdm_error -_tdm_output_call_thread_cb_dpms(tdm_private_output *private_output, tdm_output_dpms dpms) -{ - tdm_thread_cb_output_dpms output_dpms; - tdm_error ret; - - memset(&output_dpms, 0, sizeof output_dpms); - output_dpms.base.type = TDM_THREAD_CB_OUTPUT_DPMS; - output_dpms.base.length = sizeof output_dpms; - output_dpms.base.object_stamp = private_output->stamp; - output_dpms.base.data = NULL; - output_dpms.base.sync = 0; - output_dpms.dpms = dpms; - - ret = tdm_thread_cb_call(private_output, &output_dpms.base); + ret = tdm_thread_cb_call(private_output, &output_change.base); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -299,6 +263,7 @@ INTERN void tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, void *user_data) { tdm_private_output *private_output = user_data; + tdm_value value; tdm_error ret; TDM_RETURN_IF_FAIL(private_output); @@ -313,7 +278,9 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, private_output->caps.status = status; } - ret = _tdm_output_call_thread_cb_status(private_output, status); + value.u32 = status; + + ret = _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_CONNECTION, value); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -321,6 +288,7 @@ INTERN void tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_data) { tdm_private_output *private_output = user_data; + tdm_value value; tdm_error ret; TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(dpms)); @@ -329,7 +297,9 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ private_output->waiting_dpms_change = 0; 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); + value.u32 = dpms; + + ret = _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_DPMS, value); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -362,21 +332,10 @@ tdm_output_add_change_handler(tdm_output *output, /* LCOV_EXCL_STOP */ } - ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); - if (ret != TDM_ERROR_NONE) { - /* LCOV_EXCL_START */ - TDM_ERR("tdm_thread_cb_add failed"); - free(change_handler); - _pthread_mutex_unlock(&private_display->lock); - return TDM_ERROR_OPERATION_FAILED; - /* LCOV_EXCL_STOP */ - } - - ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, change_handler); + ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, change_handler); if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */ TDM_ERR("tdm_thread_cb_add failed"); - tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); free(change_handler); _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_OPERATION_FAILED; @@ -416,8 +375,7 @@ tdm_output_remove_change_handler(tdm_output *output, if (change_handler->func != func || change_handler->user_data != user_data) continue; - tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); - tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, change_handler); + tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, change_handler); LIST_DEL(&change_handler->link); free(change_handler); @@ -1344,8 +1302,10 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) done: if (ret == TDM_ERROR_NONE) { if (private_output->current_dpms_value != dpms_value) { + tdm_value value; private_output->current_dpms_value = dpms_value; - _tdm_output_call_thread_cb_dpms(private_output, dpms_value); + value.u32 = dpms_value; + _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_DPMS, value); TDM_INFO("output(%d) dpms '%s' done", private_output->pipe, tdm_dpms_str(dpms_value)); } } else { @@ -1486,11 +1446,13 @@ tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) /* checking with backend's value */ if (*dpms_value != private_output->current_dpms_value) { + tdm_value value; 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; - _tdm_output_call_thread_cb_dpms(private_output, *dpms_value); + value.u32 = *dpms_value; + _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_DPMS, value); } return ret; diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index a5b4423..d1c132d 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -449,8 +449,7 @@ typedef enum { TDM_THREAD_CB_NONE, TDM_THREAD_CB_OUTPUT_COMMIT, TDM_THREAD_CB_OUTPUT_VBLANK, - TDM_THREAD_CB_OUTPUT_STATUS, - TDM_THREAD_CB_OUTPUT_DPMS, + TDM_THREAD_CB_OUTPUT_CHANGE, TDM_THREAD_CB_PP_DONE, TDM_THREAD_CB_CAPTURE_DONE, TDM_THREAD_CB_VBLANK_SW, @@ -462,8 +461,7 @@ typedef enum { typedef struct _tdm_thread_cb_base tdm_thread_cb_base; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_commit; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_vblank; -typedef struct _tdm_thread_cb_output_dpms tdm_thread_cb_output_dpms; -typedef struct _tdm_thread_cb_output_status tdm_thread_cb_output_status; +typedef struct _tdm_thread_cb_output_change tdm_thread_cb_output_change; typedef struct _tdm_thread_cb_pp_done tdm_thread_cb_pp_done; typedef struct _tdm_thread_cb_capture_done tdm_thread_cb_capture_done; typedef struct _tdm_thread_cb_vblank_sw tdm_thread_cb_vblank_sw; @@ -485,14 +483,10 @@ struct _tdm_thread_cb_output_vblank { unsigned int tv_usec; }; -struct _tdm_thread_cb_output_status { +struct _tdm_thread_cb_output_change { tdm_thread_cb_base base; - tdm_output_conn_status status; -}; - -struct _tdm_thread_cb_output_dpms { - tdm_thread_cb_base base; - tdm_output_dpms dpms; + tdm_output_change_type type; + tdm_value value; }; struct _tdm_thread_cb_pp_done { diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 6e891d7..ff8c238 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -432,8 +432,7 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop) switch (base->type) { case TDM_THREAD_CB_OUTPUT_COMMIT: case TDM_THREAD_CB_OUTPUT_VBLANK: - case TDM_THREAD_CB_OUTPUT_STATUS: - case TDM_THREAD_CB_OUTPUT_DPMS: + case TDM_THREAD_CB_OUTPUT_CHANGE: case TDM_THREAD_CB_PP_DONE: case TDM_THREAD_CB_CAPTURE_DONE: case TDM_THREAD_CB_VBLANK_SW: @@ -610,18 +609,16 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) TDM_RETURN_VAL_IF_FAIL(cb_base != NULL, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->type > 0, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->length > 0, TDM_ERROR_INVALID_PARAMETER); + TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 0 || cb_base->sync == 1, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->object_stamp > 0, TDM_ERROR_INVALID_PARAMETER); caller_tid = syscall(SYS_gettid); assert(find_funcs[cb_base->type] != NULL); - /* handling only output-status as sync */ - if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) { - TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 1, TDM_ERROR_INVALID_PARAMETER); - } else { - TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 0, TDM_ERROR_INVALID_PARAMETER); - } + /* When there is the previous waiting sync call, the other type sync call CAN't be handlered */ + if (waiting_tid > 0 && cb_base->sync == 1) + assert(waiting_cb_type == cb_base->type); if (!object) { object = find_funcs[cb_base->type](private_display, cb_base->object_stamp); -- 2.7.4 From 758bfd1906831fa520a2e26e795169c0d431570c Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 09:17:07 +0900 Subject: [PATCH 05/16] Revert "Revert "output: seperate output-status and output-dpms change"" This reverts commit 3dab774282940b13db1792b57deaf50109d9d5e3. Change-Id: I64aec7755e0822b85b28e420b4fd2727b6763e51 --- src/tdm.c | 3 +- src/tdm_macro.h | 3 +- src/tdm_output.c | 98 ++++++++++++++++++++++++++++++++++--------------- src/tdm_private_types.h | 16 +++++--- src/tdm_thread.c | 13 ++++--- 5 files changed, 91 insertions(+), 42 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index c17e9fc..42387fd 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -198,7 +198,8 @@ _tdm_display_destroy_private_output(tdm_private_output *private_output) LIST_FOR_EACH_ENTRY_SAFE(h, hh, &private_output->change_handler_list, link) { LIST_DEL(&h->link); - tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, h); + tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, h); + tdm_thread_cb_remove(h->private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, h); free(h); } diff --git a/src/tdm_macro.h b/src/tdm_macro.h index 45bde65..acdc9f3 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -244,7 +244,8 @@ static struct tdm_type_name tdm_cb_type_names[] = { { TDM_THREAD_CB_NONE, "none" }, { TDM_THREAD_CB_OUTPUT_COMMIT, "output-commit" }, { TDM_THREAD_CB_OUTPUT_VBLANK, "output-vblank" }, - { TDM_THREAD_CB_OUTPUT_CHANGE, "output-change" }, + { TDM_THREAD_CB_OUTPUT_STATUS, "output-status" }, + { TDM_THREAD_CB_OUTPUT_DPMS, "output-dpms" }, { TDM_THREAD_CB_PP_DONE, "pp-done" }, { TDM_THREAD_CB_CAPTURE_DONE, "capture-done" }, { TDM_THREAD_CB_VBLANK_SW, "vblank-sw" }, diff --git a/src/tdm_output.c b/src/tdm_output.c index b87da84..652e262 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -146,7 +146,9 @@ tdm_output_init(tdm_private_display *private_display) { tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_COMMIT, tdm_display_find_output_stamp); tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_VBLANK, tdm_display_find_output_stamp); - tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_CHANGE, tdm_display_find_output_stamp); + tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_STATUS, tdm_display_find_output_stamp); + tdm_thread_cb_set_find_func(TDM_THREAD_CB_OUTPUT_DPMS, tdm_display_find_output_stamp); + return TDM_ERROR_NONE; } @@ -226,34 +228,68 @@ INTERN void tdm_output_thread_cb_change(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data) { tdm_private_output *private_output = object; - tdm_thread_cb_output_change *output_change = (tdm_thread_cb_output_change *)cb_base; tdm_private_output_change_handler *change_handler = user_data; + tdm_output_change_type type = TDM_OUTPUT_CHANGE_CONNECTION; + tdm_value value = {.u32 = 0 }; TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); assert(change_handler->owner_tid == syscall(SYS_gettid)); + if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) { + tdm_thread_cb_output_status *output_status = (tdm_thread_cb_output_status *)cb_base; + type = TDM_OUTPUT_CHANGE_CONNECTION; + value.u32 = output_status->status; + } else if (cb_base->type == TDM_THREAD_CB_OUTPUT_DPMS) { + tdm_thread_cb_output_dpms *output_dpms = (tdm_thread_cb_output_dpms *)cb_base; + type = TDM_OUTPUT_CHANGE_DPMS; + value.u32 = output_dpms->dpms; + } else { + TDM_NEVER_GET_HERE(); + return; + } + _pthread_mutex_unlock(&private_display->lock); - change_handler->func(private_output, output_change->type, output_change->value, change_handler->user_data); + change_handler->func(private_output, type, value, change_handler->user_data); _pthread_mutex_lock(&private_display->lock); + } static tdm_error -_tdm_output_call_thread_cb_change(tdm_private_output *private_output, tdm_output_change_type type, tdm_value value) +_tdm_output_call_thread_cb_status(tdm_private_output *private_output, tdm_output_conn_status status) { - tdm_thread_cb_output_change output_change; + tdm_thread_cb_output_status output_status; tdm_error ret; - memset(&output_change, 0, sizeof output_change); - output_change.base.type = TDM_THREAD_CB_OUTPUT_CHANGE; - output_change.base.length = sizeof output_change; - output_change.base.object_stamp = private_output->stamp; - output_change.base.data = NULL; - output_change.base.sync = 1; - output_change.type = type; - output_change.value = value; + memset(&output_status, 0, sizeof output_status); + output_status.base.type = TDM_THREAD_CB_OUTPUT_STATUS; + output_status.base.length = sizeof output_status; + output_status.base.object_stamp = private_output->stamp; + output_status.base.data = NULL; + output_status.base.sync = 1; + output_status.status = status; - ret = tdm_thread_cb_call(private_output, &output_change.base); + ret = tdm_thread_cb_call(private_output, &output_status.base); + TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + + return TDM_ERROR_NONE; +} + +static tdm_error +_tdm_output_call_thread_cb_dpms(tdm_private_output *private_output, tdm_output_dpms dpms) +{ + tdm_thread_cb_output_dpms output_dpms; + tdm_error ret; + + memset(&output_dpms, 0, sizeof output_dpms); + output_dpms.base.type = TDM_THREAD_CB_OUTPUT_DPMS; + output_dpms.base.length = sizeof output_dpms; + output_dpms.base.object_stamp = private_output->stamp; + output_dpms.base.data = NULL; + output_dpms.base.sync = 0; + output_dpms.dpms = dpms; + + ret = tdm_thread_cb_call(private_output, &output_dpms.base); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -263,7 +299,6 @@ INTERN void tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, void *user_data) { tdm_private_output *private_output = user_data; - tdm_value value; tdm_error ret; TDM_RETURN_IF_FAIL(private_output); @@ -278,9 +313,7 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, private_output->caps.status = status; } - value.u32 = status; - - ret = _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_CONNECTION, value); + ret = _tdm_output_call_thread_cb_status(private_output, status); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -288,7 +321,6 @@ INTERN void tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_data) { tdm_private_output *private_output = user_data; - tdm_value value; tdm_error ret; TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(dpms)); @@ -297,9 +329,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ private_output->waiting_dpms_change = 0; TDM_INFO("output(%d) dpms async '%s' done", private_output->pipe, tdm_dpms_str(dpms)); - value.u32 = dpms; - - ret = _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_DPMS, value); + ret = _tdm_output_call_thread_cb_dpms(private_output, dpms); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -332,10 +362,21 @@ tdm_output_add_change_handler(tdm_output *output, /* LCOV_EXCL_STOP */ } - ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, change_handler); + ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); + if (ret != TDM_ERROR_NONE) { + /* LCOV_EXCL_START */ + TDM_ERR("tdm_thread_cb_add failed"); + free(change_handler); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_OPERATION_FAILED; + /* LCOV_EXCL_STOP */ + } + + ret = tdm_thread_cb_add(private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, change_handler); if (ret != TDM_ERROR_NONE) { /* LCOV_EXCL_START */ TDM_ERR("tdm_thread_cb_add failed"); + tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); free(change_handler); _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_OPERATION_FAILED; @@ -375,7 +416,8 @@ tdm_output_remove_change_handler(tdm_output *output, if (change_handler->func != func || change_handler->user_data != user_data) continue; - tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_CHANGE, NULL, tdm_output_thread_cb_change, change_handler); + tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_DPMS, NULL, tdm_output_thread_cb_change, change_handler); + tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_STATUS, NULL, tdm_output_thread_cb_change, change_handler); LIST_DEL(&change_handler->link); free(change_handler); @@ -1302,10 +1344,8 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) done: if (ret == TDM_ERROR_NONE) { if (private_output->current_dpms_value != dpms_value) { - tdm_value value; private_output->current_dpms_value = dpms_value; - value.u32 = dpms_value; - _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_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)); } } else { @@ -1446,13 +1486,11 @@ tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) /* checking with backend's value */ if (*dpms_value != private_output->current_dpms_value) { - tdm_value value; 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; - value.u32 = *dpms_value; - _tdm_output_call_thread_cb_change(private_output, TDM_OUTPUT_CHANGE_DPMS, value); + _tdm_output_call_thread_cb_dpms(private_output, *dpms_value); } return ret; diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index d1c132d..a5b4423 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -449,7 +449,8 @@ typedef enum { TDM_THREAD_CB_NONE, TDM_THREAD_CB_OUTPUT_COMMIT, TDM_THREAD_CB_OUTPUT_VBLANK, - TDM_THREAD_CB_OUTPUT_CHANGE, + TDM_THREAD_CB_OUTPUT_STATUS, + TDM_THREAD_CB_OUTPUT_DPMS, TDM_THREAD_CB_PP_DONE, TDM_THREAD_CB_CAPTURE_DONE, TDM_THREAD_CB_VBLANK_SW, @@ -461,7 +462,8 @@ typedef enum { typedef struct _tdm_thread_cb_base tdm_thread_cb_base; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_commit; typedef struct _tdm_thread_cb_output_vblank tdm_thread_cb_output_vblank; -typedef struct _tdm_thread_cb_output_change tdm_thread_cb_output_change; +typedef struct _tdm_thread_cb_output_dpms tdm_thread_cb_output_dpms; +typedef struct _tdm_thread_cb_output_status tdm_thread_cb_output_status; typedef struct _tdm_thread_cb_pp_done tdm_thread_cb_pp_done; typedef struct _tdm_thread_cb_capture_done tdm_thread_cb_capture_done; typedef struct _tdm_thread_cb_vblank_sw tdm_thread_cb_vblank_sw; @@ -483,10 +485,14 @@ struct _tdm_thread_cb_output_vblank { unsigned int tv_usec; }; -struct _tdm_thread_cb_output_change { +struct _tdm_thread_cb_output_status { tdm_thread_cb_base base; - tdm_output_change_type type; - tdm_value value; + tdm_output_conn_status status; +}; + +struct _tdm_thread_cb_output_dpms { + tdm_thread_cb_base base; + tdm_output_dpms dpms; }; struct _tdm_thread_cb_pp_done { diff --git a/src/tdm_thread.c b/src/tdm_thread.c index ff8c238..6e891d7 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -432,7 +432,8 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop) switch (base->type) { case TDM_THREAD_CB_OUTPUT_COMMIT: case TDM_THREAD_CB_OUTPUT_VBLANK: - case TDM_THREAD_CB_OUTPUT_CHANGE: + case TDM_THREAD_CB_OUTPUT_STATUS: + case TDM_THREAD_CB_OUTPUT_DPMS: case TDM_THREAD_CB_PP_DONE: case TDM_THREAD_CB_CAPTURE_DONE: case TDM_THREAD_CB_VBLANK_SW: @@ -609,16 +610,18 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) TDM_RETURN_VAL_IF_FAIL(cb_base != NULL, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->type > 0, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->length > 0, TDM_ERROR_INVALID_PARAMETER); - TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 0 || cb_base->sync == 1, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(cb_base->object_stamp > 0, TDM_ERROR_INVALID_PARAMETER); caller_tid = syscall(SYS_gettid); assert(find_funcs[cb_base->type] != NULL); - /* When there is the previous waiting sync call, the other type sync call CAN't be handlered */ - if (waiting_tid > 0 && cb_base->sync == 1) - assert(waiting_cb_type == cb_base->type); + /* handling only output-status as sync */ + if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) { + TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 1, TDM_ERROR_INVALID_PARAMETER); + } else { + TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 0, TDM_ERROR_INVALID_PARAMETER); + } if (!object) { object = find_funcs[cb_base->type](private_display, cb_base->object_stamp); -- 2.7.4 From d8df1d82aac258eb4ac81829e61e73796073ab4f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 10:17:28 +0900 Subject: [PATCH 06/16] thread: correct the infinite event propagation issue when calling tdm_thread_cb_call, 'propagation' param will help to decide if we need to propagate a event to other thread or not. and checking waiting_cb_type variable is not needed any more. Change-Id: I59929cb8dc1dd1ada2e7b8acfa9095a174e12928 --- src/tdm_capture.c | 2 +- src/tdm_output.c | 10 +++++----- src/tdm_pp.c | 2 +- src/tdm_thread.c | 43 +++++++++++++++++++++++++------------------ src/tdm_thread.h | 2 +- src/tdm_vblank.c | 4 ++-- 6 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 982230f..b0acba2 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -169,7 +169,7 @@ _tdm_capture_cb_done(tdm_capture *capture_module, tbm_surface_h buffer, void *us capture_done.base.sync = 0; capture_done.buffer = buffer; - ret = tdm_thread_cb_call(private_capture, &capture_done.base); + ret = tdm_thread_cb_call(private_capture, &capture_done.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } diff --git a/src/tdm_output.c b/src/tdm_output.c index 652e262..bf353ce 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -269,7 +269,7 @@ _tdm_output_call_thread_cb_status(tdm_private_output *private_output, tdm_output output_status.base.sync = 1; output_status.status = status; - ret = tdm_thread_cb_call(private_output, &output_status.base); + ret = tdm_thread_cb_call(private_output, &output_status.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -289,7 +289,7 @@ _tdm_output_call_thread_cb_dpms(tdm_private_output *private_output, tdm_output_d output_dpms.base.sync = 0; output_dpms.dpms = dpms; - ret = tdm_thread_cb_call(private_output, &output_dpms.base); + ret = tdm_thread_cb_call(private_output, &output_dpms.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -811,7 +811,7 @@ _tdm_output_cb_vblank(tdm_output *output_backend, unsigned int sequence, if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("output(%d) wait_vblank: handler(%p)", vblank_handler->private_output->pipe, vblank_handler); - ret = tdm_thread_cb_call(vblank_handler->private_output, &output_vblank.base); + ret = tdm_thread_cb_call(vblank_handler->private_output, &output_vblank.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -887,7 +887,7 @@ _tdm_output_cb_commit(tdm_output *output_backend, unsigned int sequence, output_commit.tv_sec = tv_sec; output_commit.tv_usec = tv_usec; - ret = tdm_thread_cb_call(private_output, &output_commit.base); + ret = tdm_thread_cb_call(private_output, &output_commit.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } @@ -2164,7 +2164,7 @@ _need_validate_handler(int fd, tdm_event_loop_mask mask, void *user_data) ev.base.data = NULL; ev.base.sync = 0; - ret = tdm_thread_cb_call(private_output, &ev.base); + ret = tdm_thread_cb_call(private_output, &ev.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); TDM_INFO("tdm-thread: get a 'need to revalidate' event for the ouptut:%p.", private_output); diff --git a/src/tdm_pp.c b/src/tdm_pp.c index d9fcc31..ae5022e 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -173,7 +173,7 @@ _tdm_pp_cb_done(tdm_pp *pp_module, tbm_surface_h src, tbm_surface_h dst, void *u pp_done.src = src; pp_done.dst = dst; - ret = tdm_thread_cb_call(private_pp, &pp_done.base); + ret = tdm_thread_cb_call(private_pp, &pp_done.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); } diff --git a/src/tdm_thread.c b/src/tdm_thread.c index 6e891d7..29d996a 100644 --- a/src/tdm_thread.c +++ b/src/tdm_thread.c @@ -439,7 +439,8 @@ tdm_thread_handle_cb(tdm_private_loop *private_loop) case TDM_THREAD_CB_VBLANK_SW: case TDM_THREAD_CB_VBLANK_CREATE: case TDM_THREAD_CB_NEED_VALIDATE: - ret = tdm_thread_cb_call(NULL, base); + /* this event comes from other thread. so we don't need to propagate this to other thread */ + ret = tdm_thread_cb_call(NULL, base, 0); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); break; default: @@ -594,7 +595,7 @@ tdm_thread_cb_remove(void *object, tdm_thread_cb_type cb_type, void *cb_data, td * because a callback is added with cb_type and cb_data. */ INTERN tdm_error -tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) +tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base, unsigned int propagation) { tdm_private_display *private_display = tdm_display_get(); tdm_private_thread_cb *cb = NULL, *hh = NULL; @@ -603,7 +604,6 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) struct list_head *list, *other_list; struct list_head call_list; static pid_t waiting_tid = 0; - static tdm_thread_cb_type waiting_cb_type = TDM_THREAD_CB_NONE; tdm_error ret; TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED); @@ -616,12 +616,15 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) assert(find_funcs[cb_base->type] != NULL); - /* handling only output-status as sync */ - if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) { - TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 1, TDM_ERROR_INVALID_PARAMETER); - } else { - TDM_RETURN_VAL_IF_FAIL(cb_base->sync == 0, TDM_ERROR_INVALID_PARAMETER); - } + if (tdm_debug_module & TDM_DEBUG_THREAD) + TDM_INFO("'%s' thread_cb (sync:%d, propagation:%d) ------", + tdm_cb_type_str(cb_base->type), cb_base->sync, propagation); + + /* handling only output-status as sync. below logic can't handle two sync-type events */ + if (cb_base->type == TDM_THREAD_CB_OUTPUT_STATUS) + assert(cb_base->sync == 1); + else + assert(cb_base->sync == 0); if (!object) { object = find_funcs[cb_base->type](private_display, cb_base->object_stamp); @@ -665,9 +668,7 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) pthread_mutex_unlock(&cb_list_lock); - assert(LIST_IS_EMPTY(&call_list)); - - if (waiting_tid == 0 || waiting_cb_type != cb_base->type) { + if (propagation) { LIST_FOR_EACH_ENTRY_SAFE(cb, hh, other_list, link) { if (cb->object != object || cb->cb_type != cb_base->type || @@ -681,27 +682,34 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) if (!handler_in_other_thread) { if (keep_private_thread) { - if (cb_base->sync) { + if (cb_base->sync && waiting_tid != 0) { waiting_tid = 0; - waiting_cb_type = TDM_THREAD_CB_NONE; pthread_cond_signal(&keep_private_thread->event_cond); if (tdm_debug_module & TDM_DEBUG_THREAD) TDM_INFO("pthread broadcase"); } } if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("'%s' thread_cb done(sync:%d)", tdm_cb_type_str(cb_base->type), cb_base->sync); + TDM_INFO("'%s' thread_cb (sync:%d, propagation:%d) ------...", + tdm_cb_type_str(cb_base->type), cb_base->sync, propagation); return TDM_ERROR_NONE; } /* Once we reach here, it means that keep_private_thread is not NULL. * Just make the crash. Avoiding it is not going to help us. */ + assert(keep_private_thread != NULL); + ret = tdm_thread_send_cb(private_display->private_loop, cb_base); TDM_RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, TDM_ERROR_OPERATION_FAILED); /* waiting until all cb are done in another thread */ if (cb_base->sync) { + /* if waiting_tid is not 0, it means there are two sync-type events at the same time. + * and it would make deadlock issue. + */ + assert(waiting_tid == 0); + if (tdm_debug_module & TDM_DEBUG_THREAD) TDM_INFO("pthread wait"); @@ -710,14 +718,13 @@ tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base) */ tdm_mutex_locked = 0; waiting_tid = caller_tid; - waiting_cb_type = cb_base->type; - pthread_cond_wait(&keep_private_thread->event_cond, &private_display->lock); tdm_mutex_locked = 1; } if (tdm_debug_module & TDM_DEBUG_THREAD) - TDM_INFO("'%s' thread_cb done(sync:%d)", tdm_cb_type_str(cb_base->type), cb_base->sync); + TDM_INFO("'%s' thread_cb (sync:%d, propagation:%d) ------...", + tdm_cb_type_str(cb_base->type), cb_base->sync, propagation); return TDM_ERROR_NONE; } diff --git a/src/tdm_thread.h b/src/tdm_thread.h index 1a91933..57c4c6f 100644 --- a/src/tdm_thread.h +++ b/src/tdm_thread.h @@ -67,7 +67,7 @@ tdm_thread_cb_add(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_t void tdm_thread_cb_remove(void *object, tdm_thread_cb_type cb_type, void *cb_data, tdm_thread_cb func, void *user_data); tdm_error -tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base); +tdm_thread_cb_call(void *object, tdm_thread_cb_base *cb_base, unsigned int propagation); #ifdef __cplusplus diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 263f825..cbedea7 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -601,7 +601,7 @@ _tdm_vblank_call_thread_cb(tdm_private_vblank *private_vblank) vblank_create.base.sync = 0; vblank_create.vblank_stamp = private_vblank->stamp; - ret = tdm_thread_cb_call(private_vblank->dpy, &vblank_create.base); + ret = tdm_thread_cb_call(private_vblank->dpy, &vblank_create.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; @@ -1410,7 +1410,7 @@ _tdm_vblank_cb_timeout_SW(void *user_data) vblank_sw.base.data = NULL; vblank_sw.base.sync = 0; - ret = tdm_thread_cb_call(private_vblank, &vblank_sw.base); + ret = tdm_thread_cb_call(private_vblank, &vblank_sw.base, 1); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); return TDM_ERROR_NONE; -- 2.7.4 From 6d40bac78103841de8b92a4438258125121cbcef Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 14:55:26 +0900 Subject: [PATCH 07/16] helper: remove unsupported format YUYV, UYVY doesn't seem to work properly Change-Id: I923f2e52d54e37c78af02cad0fec0ca994501ad7 --- include/tdm_helper.h | 4 ---- src/tdm_helper.c | 23 ----------------------- 2 files changed, 27 deletions(-) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index 99fd638..f1f305b 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -66,8 +66,6 @@ tdm_helper_get_time(void); * - TBM_FORMAT_YUV420 * - TBM_FORMAT_NV12 * - TBM_FORMAT_NV21 - * - TBM_FORMAT_YUYV - * - TBM_FORMAT_UYVY * The filename extension should be "png" for TBM_FORMAT_ARGB8888 and TBM_FORMAT_XRGB8888 * or "yuv" for YUV formats. * @param[in] buffer A TDM buffer @@ -118,8 +116,6 @@ tdm_helper_clear_buffer_color(tbm_surface_h buffer, tdm_pos *pos, unsigned int c * - TBM_FORMAT_YUV420 * - TBM_FORMAT_NV12 * - TBM_FORMAT_NV21 - * - TBM_FORMAT_YUYV - * - TBM_FORMAT_UYVY * @param[in] buffer A TDM buffer */ void diff --git a/src/tdm_helper.c b/src/tdm_helper.c index c7e0983..60a8daf 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -326,13 +326,6 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) info.planes[1].size, NULL, 0); break; - case TBM_FORMAT_YUYV: - case TBM_FORMAT_UYVY: - _tdm_helper_dump_raw((const char*)temp, - info.planes[0].ptr, - info.planes[0].size, NULL, 0, - NULL, 0); - break; default: TDM_ERR("can't dump %c%c%c%c buffer", FOURCC_STR(info.format)); tbm_surface_unmap(buffer); @@ -383,22 +376,6 @@ tdm_helper_clear_buffer_color(tbm_surface_h buffer, tdm_pos *pos, unsigned int c memset((char*)info.planes[0].ptr, 0x10, info.planes[0].stride * info.height); memset((char*)info.planes[1].ptr, 0x80, info.planes[1].stride * (info.height >> 1)); break; - case TBM_FORMAT_YUYV: { - int *ibuf = (int*)info.planes[0].ptr; - int i, size = info.planes[0].stride * info.height / 4; - - for (i = 0 ; i < size ; i++) - ibuf[i] = 0x10801080; - } - break; - case TBM_FORMAT_UYVY: { - int *ibuf = (int*)info.planes[0].ptr; - int i, size = info.planes[0].stride * info.height / 4; - - for (i = 0 ; i < size ; i++) - ibuf[i] = 0x80108010; /* YUYV -> 0xVYUY */ - } - break; default: TDM_ERR("can't clear %c%c%c%c buffer", FOURCC_STR(info.format)); break; -- 2.7.4 From 816e82e2652e1a8611fb99899b039755dc125a46 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 14:57:03 +0900 Subject: [PATCH 08/16] buffers: fill 0xFF for alpha bits if XRGB8888 Change-Id: I11fe1caf16c54a927aaf935504d26b8e01d95337 --- tools/buffers.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 74 insertions(+), 2 deletions(-) diff --git a/tools/buffers.c b/tools/buffers.c index 4d66f12..5cf58ef 100644 --- a/tools/buffers.c +++ b/tools/buffers.c @@ -125,7 +125,7 @@ static const struct format_info format_info[] = { { TBM_FORMAT_RGB888, "RG24", MAKE_RGB_INFO(8, 16, 8, 8, 8, 0, 0, 0) }, /* RGB32 */ { TBM_FORMAT_ARGB8888, "AR24", MAKE_RGB_INFO(8, 16, 8, 8, 8, 0, 8, 24) }, - { TBM_FORMAT_XRGB8888, "XR24", MAKE_RGB_INFO(8, 16, 8, 8, 8, 0, 0, 0) }, + { TBM_FORMAT_XRGB8888, "XR24", MAKE_RGB_INFO(8, 16, 8, 8, 8, 0, 0, 24) }, { TBM_FORMAT_ABGR8888, "AB24", MAKE_RGB_INFO(8, 0, 8, 8, 8, 16, 8, 24) }, { TBM_FORMAT_XBGR8888, "XB24", MAKE_RGB_INFO(8, 0, 8, 8, 8, 16, 0, 0) }, { TBM_FORMAT_RGBA8888, "RA24", MAKE_RGB_INFO(8, 24, 8, 16, 8, 8, 8, 0) }, @@ -186,6 +186,12 @@ struct color_yuv { (((b) >> (8 - (rgb)->blue.length)) << (rgb)->blue.offset) | \ (((a) >> (8 - (rgb)->alpha.length)) << (rgb)->alpha.offset)) +#define MAKE_RGBX(rgb, r, g, b) \ + ((((r) >> (8 - (rgb)->red.length)) << (rgb)->red.offset) | \ + (((g) >> (8 - (rgb)->green.length)) << (rgb)->green.offset) | \ + (((b) >> (8 - (rgb)->blue.length)) << (rgb)->blue.offset) | \ + (255 << (rgb)->alpha.offset)) + #define MAKE_RGB24(rgb, r, g, b) \ { .value = MAKE_RGBA(rgb, r, g, b, 0) } @@ -592,6 +598,70 @@ fill_smpte_rgb32(const struct rgb_info *rgb, unsigned char *mem, } static void +fill_smpte_rgb32_dont_care_alpha(const struct rgb_info *rgb, unsigned char *mem, + unsigned int width, unsigned int height, unsigned int stride) +{ + const uint32_t colors_top[] = { + MAKE_RGBX(rgb, 192, 192, 192), /* grey */ + MAKE_RGBX(rgb, 192, 192, 0), /* yellow */ + MAKE_RGBX(rgb, 0, 192, 192), /* cyan */ + MAKE_RGBX(rgb, 0, 192, 0), /* green */ + MAKE_RGBX(rgb, 192, 0, 192), /* magenta */ + MAKE_RGBX(rgb, 192, 0, 0), /* red */ + MAKE_RGBX(rgb, 0, 0, 192), /* blue */ + }; + const uint32_t colors_middle[] = { + MAKE_RGBX(rgb, 0, 0, 192), /* blue */ + MAKE_RGBX(rgb, 19, 19, 19), /* black */ + MAKE_RGBX(rgb, 192, 0, 192), /* magenta */ + MAKE_RGBX(rgb, 19, 19, 19), /* black */ + MAKE_RGBX(rgb, 0, 192, 192), /* cyan */ + MAKE_RGBX(rgb, 19, 19, 19), /* black */ + MAKE_RGBX(rgb, 192, 192, 192), /* grey */ + }; + const uint32_t colors_bottom[] = { + MAKE_RGBX(rgb, 0, 33, 76), /* in-phase */ + MAKE_RGBX(rgb, 255, 255, 255), /* super white */ + MAKE_RGBX(rgb, 50, 0, 106), /* quadrature */ + MAKE_RGBX(rgb, 19, 19, 19), /* black */ + MAKE_RGBX(rgb, 9, 9, 9), /* 3.5% */ + MAKE_RGBX(rgb, 19, 19, 19), /* 7.5% */ + MAKE_RGBX(rgb, 29, 29, 29), /* 11.5% */ + MAKE_RGBX(rgb, 19, 19, 19), /* black */ + }; + unsigned int x; + unsigned int y; + + if (width < 8) + return; + + for (y = 0; y < height * 6 / 9; ++y) { + for (x = 0; x < width; ++x) + ((uint32_t *)mem)[x] = colors_top[x * 7 / width]; + mem += stride; + } + + for (; y < height * 7 / 9; ++y) { + for (x = 0; x < width; ++x) + ((uint32_t *)mem)[x] = colors_middle[x * 7 / width]; + mem += stride; + } + + for (; y < height; ++y) { + for (x = 0; x < width * 5 / 7; ++x) + ((uint32_t *)mem)[x] = + colors_bottom[x * 4 / (width * 5 / 7)]; + for (; x < width * 6 / 7; ++x) + ((uint32_t *)mem)[x] = + colors_bottom[(x - width * 5 / 7) * 3 + / (width / 7) + 4]; + for (; x < width; ++x) + ((uint32_t *)mem)[x] = (rand_r(&rand_seed) % 2) ? MAKE_RGBX(rgb, 255, 255, 255) : MAKE_RGBX(rgb, 0, 0, 0); + mem += stride; + } +} + +static void fill_smpte(const struct format_info *info, void *planes[3], unsigned int width, unsigned int height, unsigned int stride) { @@ -648,7 +718,6 @@ fill_smpte(const struct format_info *info, void *planes[3], unsigned int width, return fill_smpte_rgb24(&info->rgb, planes[0], width, height, stride); case TBM_FORMAT_ARGB8888: - case TBM_FORMAT_XRGB8888: case TBM_FORMAT_ABGR8888: case TBM_FORMAT_XBGR8888: case TBM_FORMAT_RGBA8888: @@ -665,6 +734,9 @@ fill_smpte(const struct format_info *info, void *planes[3], unsigned int width, case TBM_FORMAT_BGRX1010102: return fill_smpte_rgb32(&info->rgb, planes[0], width, height, stride); + case TBM_FORMAT_XRGB8888: + return fill_smpte_rgb32_dont_care_alpha(&info->rgb, planes[0], + width, height, stride); } } -- 2.7.4 From 7138016dff2eb947ba4f1e60c8895210c0f61f63 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 14:57:43 +0900 Subject: [PATCH 09/16] helper: copy filename Change-Id: I5d15a165ba482aad7b1280abd411035a6c57ae22 --- src/tdm_helper.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 60a8daf..2e00648 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -291,6 +291,11 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) strncat(p, ext, 3); p += 3; *p = '\0'; + } else { + len = strnlen(file, TDM_PATH_LEN - 1); + strncat(p, file, len); + p += len; + *p = '\0'; } tdm_helper_get_buffer_full_size(buffer, &bw, &bh); -- 2.7.4 From 750de60a70390cbd90a742a0895bee9482931b08 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 14:58:57 +0900 Subject: [PATCH 10/16] utests: some modification for helper Change-Id: I3fd90c2a65425478d9bcbbdbdce77a0afd14f682 --- utests/src/ut_tdm_helper.cpp | 106 ++++++++++++------------------------------- 1 file changed, 30 insertions(+), 76 deletions(-) diff --git a/utests/src/ut_tdm_helper.cpp b/utests/src/ut_tdm_helper.cpp index 815e388..9684f64 100644 --- a/utests/src/ut_tdm_helper.cpp +++ b/utests/src/ut_tdm_helper.cpp @@ -57,7 +57,23 @@ TEST_P(TDMHelper, HelperGetTime) ASSERT_GT(tdm_helper_get_time(), 0.0); } -TEST_P(TDMHelper, HelperDumpBuffer) +TEST_P(TDMHelper, HelperDumpBufferXR24) +{ + tbm_surface_h buffer; + + buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888); + ASSERT_NE(buffer, NULL); + + tdm_test_buffer_fill(buffer, PATTERN_SMPTE); + + char filename[256]; + snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); + tdm_helper_dump_buffer(buffer, (const char*)filename); + + tbm_surface_destroy(buffer); +} + +TEST_P(TDMHelper, HelperDumpBufferAR24) { tbm_surface_h buffer; @@ -97,9 +113,7 @@ TEST_P(TDMHelper, HelperClearBufferPos) tdm_helper_clear_buffer_pos(buffer, &pos); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -117,9 +131,7 @@ TEST_P(TDMHelper, HelperClearBufferColor) tdm_helper_clear_buffer_color(buffer, &pos, color); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -135,9 +147,7 @@ TEST_P(TDMHelper, HelperClearBufferARGB) tdm_helper_clear_buffer(buffer); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -153,9 +163,7 @@ TEST_P(TDMHelper, HelperClearBufferXRGB) tdm_helper_clear_buffer(buffer); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -171,9 +179,7 @@ TEST_P(TDMHelper, HelperClearBufferYUV420) tdm_helper_clear_buffer(buffer); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -189,9 +195,7 @@ TEST_P(TDMHelper, HelperClearBufferNV12) tdm_helper_clear_buffer(buffer); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -207,45 +211,7 @@ TEST_P(TDMHelper, HelperClearBufferNV21) tdm_helper_clear_buffer(buffer); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); - - tbm_surface_destroy(buffer); -} - -TEST_P(TDMHelper, HelperClearBufferYUYV) -{ - tbm_surface_h buffer; - - buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUYV); - ASSERT_NE(buffer, NULL); - - tdm_test_buffer_fill(buffer, PATTERN_SMPTE); - - tdm_helper_clear_buffer(buffer); - - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); - - tbm_surface_destroy(buffer); -} - -TEST_P(TDMHelper, HelperClearBufferUYVY) -{ - tbm_surface_h buffer; - - buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_UYVY); - ASSERT_NE(buffer, NULL); - - tdm_test_buffer_fill(buffer, PATTERN_SMPTE); - - tdm_helper_clear_buffer(buffer); - - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(buffer, (const char*)filename); + tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); } @@ -284,9 +250,7 @@ TEST_P(TDMHelper, HelperConvertBufferRotate0) ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(temp, (const char*)filename); + tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); tbm_surface_destroy(temp); @@ -309,9 +273,7 @@ TEST_P(TDMHelper, HelperConvertBufferRotate0Flip) ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_FLIPPED, 0), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(temp, (const char*)filename); + tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); tbm_surface_destroy(temp); @@ -334,9 +296,7 @@ TEST_P(TDMHelper, HelperConvertBufferRotate90) ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_90, 0), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(temp, (const char*)filename); + tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); tbm_surface_destroy(temp); @@ -359,9 +319,7 @@ TEST_P(TDMHelper, HelperConvertBufferRotate180) ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_180, 0), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(temp, (const char*)filename); + tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); tbm_surface_destroy(temp); @@ -384,9 +342,7 @@ TEST_P(TDMHelper, HelperConvertBufferRotate270) ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_270, 0), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(temp, (const char*)filename); + tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(buffer); tbm_surface_destroy(temp); @@ -465,9 +421,7 @@ TEST_P(TDMHelper, HelperCaptureOutput) ASSERT_EQ(tdm_helper_capture_output(output, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_NONE); - char filename[256]; - snprintf(filename, sizeof filename, "%s.png", typeid(*this).name()); - tdm_helper_dump_buffer(dump, (const char*)filename); + tdm_helper_dump_buffer_str(dump, NULL, (char*)typeid(*this).name()); tbm_surface_destroy(dump); } -- 2.7.4 From 091107115925fecd09cd10d25766eda7fc61c690 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 14:59:19 +0900 Subject: [PATCH 11/16] utests: modification for macro Change-Id: Ia2a14839ca265a86e7869bd62719dd3c05681966 --- utests/src/ut_tdm.h | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/utests/src/ut_tdm.h b/utests/src/ut_tdm.h index 83f1bcb..8ffd5f2 100644 --- a/utests/src/ut_tdm.h +++ b/utests/src/ut_tdm.h @@ -122,11 +122,28 @@ extern bool enable_porting_debug; GTEST_FATAL_FAILURE_("tc failed"); \ if (ch == 'r' || ch == 'R') \ goto retry; \ - } else { \ - usleep(1000000); /* 1000 ms */ \ } \ } while (0) +#define TDM_UT_ASK_YN(fmt, ...) \ + do { \ + if (enable_porting_debug) { \ + char ch; \ + printf(fmt" [Y]es, [n]o: ", ##__VA_ARGS__); \ + do { \ + ch = getchar(); \ + if (ch == '\n') \ + ch = 'y'; \ + else { \ + char tch; \ + while ((tch = getchar()) != '\n' && tch != EOF); \ + } \ + } while (ch != 'y' && ch != 'Y' && ch != 'n' && ch != 'N'); \ + if (ch == 'n' || ch == 'N') \ + GTEST_FATAL_FAILURE_("tc failed"); \ + } \ + } while (0) + #define TDM_UT_SIZE_ALIGN(value, base) (((value) + ((base) - 1)) & ~((base) - 1)) #define TDM_UT_DUMP_DIR "/tmp/tdm_dump" -- 2.7.4 From da0e76b53bb7981c3164389cfff0e88612bd300c Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 16:42:40 +0900 Subject: [PATCH 12/16] buffers: use rand_r to draw noise color Change-Id: I44ce0464c620b77ab20540b75b9dcaeb49202040 --- tools/buffers.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/tools/buffers.c b/tools/buffers.c index 5cf58ef..ea88179 100644 --- a/tools/buffers.c +++ b/tools/buffers.c @@ -254,8 +254,12 @@ fill_smpte_yuv_planar(const struct yuv_info *yuv, for (; x < width * 6 / 7; ++x) y_mem[x] = colors_bottom[(x - width * 5 / 7) * 3 / (width / 7) + 4].y; - for (; x < width; ++x) - y_mem[x] = colors_bottom[7].y; + for (; x < width; ++x) { + if (rand_r(&rand_seed) % 2) + y_mem[x] = colors_bottom[1].y; + else + y_mem[x] = colors_bottom[7].y; + } y_mem += stride; } @@ -292,8 +296,13 @@ fill_smpte_yuv_planar(const struct yuv_info *yuv, 3 / (width / 7) + 4].v; } for (; x < width; x += xsub) { - u_mem[x * cs / xsub] = colors_bottom[7].u; - v_mem[x * cs / xsub] = colors_bottom[7].v; + if (rand_r(&rand_seed) % 2) { + u_mem[x * cs / xsub] = colors_bottom[1].u; + v_mem[x * cs / xsub] = colors_bottom[1].v; + } else { + u_mem[x * cs / xsub] = colors_bottom[7].u; + v_mem[x * cs / xsub] = colors_bottom[7].v; + } } u_mem += stride * cs / xsub; v_mem += stride * cs / xsub; -- 2.7.4 From fb7f3017b0fb6c9e569562ae38db5dbfdb206b86 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 17:05:54 +0900 Subject: [PATCH 13/16] pp: add TDM_PP_CAPABILITY_NO_CSC Change-Id: I4e71eed1b65b3194e4578ad07270f6c17af3a217 --- include/tdm_common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/tdm_common.h b/include/tdm_common.h index db7e087..f847a77 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -155,6 +155,7 @@ typedef enum { 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_NO_CSC = (1 << 7), /**< The pp device doesnt supports Color Space Conversion */ } tdm_pp_capability; /** -- 2.7.4 From 52b4aa6c9d216c59c616023e2000150ac5351915 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Fri, 16 Mar 2018 17:20:02 +0900 Subject: [PATCH 14/16] package version up to 1.16.6 Change-Id: Ic5461303138ef6207b2fcafaaa17fd45cdbf33ff --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 13b2af7..90ebc54 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define UTEST_GCOV 0 Name: libtdm -Version: 1.16.5 +Version: 1.16.6 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From c207a7469c409c109bb1b0e47fb3eb7d2ab0327a Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 19 Mar 2018 13:29:41 +0900 Subject: [PATCH 15/16] layer: add tdm_layer_get_index() Change-Id: Id0e660ba20bd586a8368c4fc4256aa4a01ea246e --- include/tdm.h | 9 +++++++++ src/tdm_layer.c | 16 ++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/tdm.h b/include/tdm.h index bc1f0ef..0340142 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -771,6 +771,15 @@ tdm_output* tdm_layer_get_output(tdm_layer *layer, tdm_error *error); /** + * @brief Get the index of a layer object. + * @param[in] layer A layer object + * @param[out] index The index of a layer object + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_layer_get_index(tdm_layer *layer, int *index); + +/** * @brief Get the capabilities of a layer object. * @param[in] layer A layer object * @param[out] capabilities The capabilities of a layer object diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 45029f5..93fe90c 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -99,6 +99,22 @@ tdm_layer_get_output(tdm_layer *layer, tdm_error *error) } EXTERN tdm_error +tdm_layer_get_index(tdm_layer *layer, int *index) +{ + LAYER_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(index != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + *index = private_layer->index; + + _pthread_mutex_unlock(&private_display->lock); + + return ret; +} + +EXTERN tdm_error tdm_layer_get_capabilities(tdm_layer *layer, tdm_layer_capability *capabilities) { LAYER_FUNC_ENTRY(); -- 2.7.4 From ebd18f713fed50ad66a14f62ba78318c2d93b809 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 19 Mar 2018 13:30:33 +0900 Subject: [PATCH 16/16] layer: enhance debugging logs Change-Id: Iccea69b432837b72158a2a864b2f6d00871a95ae --- src/tdm_layer.c | 75 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 93fe90c..daefb98 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -195,7 +195,7 @@ tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value) func_layer = &private_module->func_layer; if (private_layer->usable) - TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->index); private_layer->usable = 0; @@ -254,7 +254,7 @@ tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *in func_layer = &private_module->func_layer; if (private_layer->usable) - TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->index); private_layer->usable = 0; @@ -271,7 +271,7 @@ tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *in snprintf(fmtstr, 128, "NONE"); TDM_INFO("layer(%p,%d) info: src(%ux%u %u,%u %ux%u %s) dst(%u,%u %ux%u) trans(%d)", - private_layer, private_layer->caps.zpos, + private_layer, private_layer->index, 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, @@ -401,7 +401,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer) if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) waiting_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->waiting_buffer); + private_layer, private_layer->index, private_layer->waiting_buffer); } if (private_layer->committed_buffer) { @@ -410,7 +410,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer) if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) committed_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->committed_buffer); + private_layer, private_layer->index, private_layer->committed_buffer); } if (private_layer->showing_buffer) { @@ -419,7 +419,7 @@ _tdm_layer_free_all_buffers(tdm_private_layer *private_layer) if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) showing_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->showing_buffer); + private_layer, private_layer->index, private_layer->showing_buffer); } LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->layer_commit_handler_list, link) { @@ -482,7 +482,7 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu func_layer = &private_module->func_layer; if (private_layer->usable) - TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->index); private_layer->usable = 0; @@ -499,7 +499,7 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) pending_buffer(%p) skipped", - private_layer, private_layer->caps.zpos, private_layer->pending_buffer); + private_layer, private_layer->index, private_layer->pending_buffer); if (tdm_ttrace_module & TDM_TTRACE_LAYER) { tbm_bo bo = tbm_surface_internal_get_bo(private_layer->pending_buffer, 0); @@ -512,9 +512,12 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu tbm_surface_internal_ref(buffer); private_layer->pending_buffer = buffer; - if (tdm_debug_module & TDM_DEBUG_BUFFER) - TDM_INFO("layer(%p,%d) pending_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->pending_buffer); + if (tdm_debug_module & TDM_DEBUG_BUFFER) { + tbm_bo bo = tbm_surface_internal_get_bo(private_layer->pending_buffer, 0); + int flags = tbm_bo_get_flags(bo); + TDM_INFO("layer(%p,%d) pending_buffer(%p) bo_flags(%x)", + private_layer, private_layer->index, private_layer->pending_buffer, flags); + } if (tdm_ttrace_module & TDM_TTRACE_LAYER) { tbm_bo bo = tbm_surface_internal_get_bo(private_layer->pending_buffer, 0); @@ -555,7 +558,7 @@ tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer) private_layer->usable = 1; if (private_layer->usable) - TDM_INFO("layer(%p,%d) now usable", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) now usable", private_layer, private_layer->index); if (!func_layer->layer_unset_buffer) { /* LCOV_EXCL_START */ @@ -598,7 +601,7 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * private_layer->fps_stamp = curr; } else if ((curr - private_layer->fps_stamp) > 1.0) { TDM_INFO("output(%d) layer(%p,%d) fps: %d", - private_output->index, private_layer, private_layer->caps.zpos, private_layer->fps_count); + private_output->index, private_layer, private_layer->index, private_layer->fps_count); private_layer->fps_count = 0; private_layer->fps_stamp = curr; } else @@ -623,7 +626,7 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) committed_buffer(%p) showing_buffer(%p)", - private_layer, private_layer->caps.zpos, *committed_buffer, + private_layer, private_layer->index, *committed_buffer, (private_layer->showing_buffer) ? private_layer->showing_buffer->buffer : NULL); } @@ -658,7 +661,7 @@ _tdm_layer_got_output_vblank(tdm_private_output *private_output, unsigned int se LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &clone_list, link) { if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer(%p,%d) committed. handle(%p) commited_buffer(%p)", - lm->private_layer, lm->private_layer->caps.zpos, lm, (lm->committed_buffer) ? lm->committed_buffer->buffer : NULL); + lm->private_layer, lm->private_layer->index, lm, (lm->committed_buffer) ? lm->committed_buffer->buffer : NULL); LIST_DEL(&lm->link); tdm_layer_committed(lm->private_layer, &lm->committed_buffer); @@ -761,7 +764,7 @@ _tdm_layer_cb_output_commit(tdm_output *output, unsigned int sequence, if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer(%p,%d) commit: output(%d) committed. handle(%p)", - private_layer, private_layer->caps.zpos, private_output->pipe, layer_commit_handler); + private_layer, private_layer->index, private_output->pipe, layer_commit_handler); _pthread_mutex_lock(&private_display->lock); @@ -833,19 +836,19 @@ _tdm_layer_commit_possible(tdm_private_layer *private_layer) if (!LIST_IS_EMPTY(&private_output->layer_commit_handler_list)) { if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer(%p,%d) commit: not possible(previous commit)", - private_layer, private_layer->caps.zpos); + private_layer, private_layer->index); return 0; } if (private_output->commit_per_vblank == 1 && _tdm_lauer_get_output_used_layer_count(private_output) > 1) { if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer(%p,%d) commit: not possible(more than 2 layers)", - private_layer, private_layer->caps.zpos); + private_layer, private_layer->index); return 0; } if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: possible", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) commit: possible", private_layer, private_layer->index); return 1; } @@ -891,7 +894,7 @@ tdm_layer_commit_pending_data(tdm_private_layer *private_layer) if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) pending_buffer(%p) committed", - private_layer, private_layer->caps.zpos, private_layer->pending_buffer); + private_layer, private_layer->index, private_layer->pending_buffer); if (ret == TDM_ERROR_NONE) { if (private_layer->waiting_buffer) @@ -901,7 +904,7 @@ tdm_layer_commit_pending_data(tdm_private_layer *private_layer) private_layer->waiting_buffer->buffer = tdm_buffer_ref_backend(private_layer->pending_buffer); if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) waiting_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->waiting_buffer->buffer); + private_layer, private_layer->index, private_layer->waiting_buffer->buffer); } else tdm_layer_free_buffer(private_layer, layer_buffer); } @@ -931,7 +934,7 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da } if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: handle(%p)", private_layer, private_layer->caps.zpos, layer_commit_handler); + TDM_INFO("layer(%p,%d) commit: handle(%p)", private_layer, private_layer->index, layer_commit_handler); LIST_INITHEAD(&layer_commit_handler->link); layer_commit_handler->private_layer = private_layer; @@ -942,13 +945,13 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da private_layer->waiting_buffer = NULL; if (private_layer->committing) - TDM_WRN("layer(%p,%d) too many commit", private_layer, private_layer->caps.zpos); + TDM_WRN("layer(%p,%d) too many commit", private_layer, private_layer->index); else private_layer->committing = 1; if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) waiting_buffer(%p) committed_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->waiting_buffer, + private_layer, private_layer->index, private_layer->waiting_buffer, (layer_commit_handler->committed_buffer) ? layer_commit_handler->committed_buffer->buffer : NULL); if (!private_output->commit_per_vblank) { @@ -959,7 +962,7 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: no commit-per-vblank", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) commit: no commit-per-vblank", private_layer, private_layer->index); } else { TDM_GOTO_IF_FAIL(private_output->commit_type == TDM_COMMIT_TYPE_LAYER, commit_failed); @@ -970,13 +973,13 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: output", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) commit: output", private_layer, private_layer->index); } else { /* add to pending_commit_handler_list. It will be commited when a vblank occurs */ LIST_ADDTAIL(&layer_commit_handler->link, &private_output->pending_commit_handler_list); if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: pending", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) commit: pending", private_layer, private_layer->index); } if (!private_output->vblank) { @@ -996,7 +999,7 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da private_output->layer_waiting_vblank = 1; if (tdm_debug_module & TDM_DEBUG_COMMIT) - TDM_INFO("layer(%p,%d) commit: wait vblank", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) commit: wait vblank", private_layer, private_layer->index); } } @@ -1025,7 +1028,7 @@ tdm_layer_commit_internal(tdm_private_layer *private_layer, tdm_layer_commit_han } if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(private_output->current_dpms_value)) { - TDM_ERR("layer(%p,%d)'s output(%d) dpms: %s", private_layer, private_layer->caps.zpos, private_output->pipe, + TDM_ERR("layer(%p,%d)'s output(%d) dpms: %s", private_layer, private_layer->index, private_output->pipe, tdm_dpms_str(private_output->current_dpms_value)); return TDM_ERROR_DPMS_OFF; } @@ -1033,7 +1036,7 @@ tdm_layer_commit_internal(tdm_private_layer *private_layer, tdm_layer_commit_han /* don't call this inside of _tdm_layer_commit */ ret = tdm_layer_commit_pending_data(private_layer); if (ret != TDM_ERROR_NONE) { - TDM_ERR("layer(%p,%d) committing pending data failed", private_layer, private_layer->caps.zpos); + TDM_ERR("layer(%p,%d) committing pending data failed", private_layer, private_layer->index); return ret; } @@ -1135,7 +1138,7 @@ tdm_layer_get_displaying_buffer(tdm_layer *layer, tdm_error *error) buffer = private_layer->showing_buffer->buffer; } else { _pthread_mutex_unlock(&private_display->lock); - TDM_DBG("layer(%p,%d) showing_buffer is null", private_layer, private_layer->caps.zpos); + TDM_DBG("layer(%p,%d) showing_buffer is null", private_layer, private_layer->index); return NULL; } _pthread_mutex_unlock(&private_display->lock); @@ -1169,7 +1172,7 @@ _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data) buffer == NULL) { /* LCOV_EXCL_START */ TDM_ERR("layer(%p,%d) tbm_surface_queue_acquire() failed surface:%p", - private_layer, private_layer->caps.zpos, buffer); + private_layer, private_layer->index, buffer); _pthread_mutex_unlock(&private_display->lock); return; /* LCOV_EXCL_STOP */ @@ -1224,7 +1227,7 @@ tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue) func_layer = &private_module->func_layer; if (private_layer->usable) - TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->caps.zpos); + TDM_INFO("layer(%p,%d) not usable", private_layer, private_layer->index); private_layer->usable = 0; @@ -1247,7 +1250,7 @@ tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue) if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) waiting_buffer(%p)", - private_layer, private_layer->caps.zpos, private_layer->waiting_buffer); + private_layer, private_layer->index, private_layer->waiting_buffer); } private_layer->buffer_queue = buffer_queue; @@ -1297,7 +1300,7 @@ tdm_layer_set_video_pos(tdm_layer *layer, int zpos) func_layer = &private_module->func_layer; if (!(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) { - TDM_ERR("layer(%p,%d) is not video layer", private_layer, private_layer->caps.zpos); + TDM_ERR("layer(%p,%d) is not video layer", private_layer, private_layer->index); _pthread_mutex_unlock(&private_display->lock); return TDM_ERROR_BAD_REQUEST; } @@ -1305,7 +1308,7 @@ tdm_layer_set_video_pos(tdm_layer *layer, int zpos) if (!func_layer->layer_set_video_pos) { /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); - TDM_ERR("layer(%p,%d) not implemented!!", private_layer, private_layer->caps.zpos); + TDM_ERR("layer(%p,%d) not implemented!!", private_layer, private_layer->index); return TDM_ERROR_NOT_IMPLEMENTED; /* LCOV_EXCL_STOP */ } -- 2.7.4