From 85eff7cbb708f7c1fbafac3c2c721a0e08da9e1a Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 3 May 2019 08:41:50 +0900 Subject: [PATCH 01/16] Package version up to 2.8.5 Change-Id: Ie60e55a1c1749ef2049ddbb1d1f38bc94d9545e7 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index cb3c0c8..cfa6ed6 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.8.4 +Version: 2.8.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From ee203debcbb7e7e595c6da2663759a1bb1f429ed Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 9 Jul 2019 17:04:27 +0900 Subject: [PATCH 02/16] tdm_output: add missing mutex unlock Change-Id: Ia61c524b809cfa45a25f3415af4fea7e036a53ee Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tdm_output.c b/src/tdm_output.c index 6516b6c..8354d07 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1427,6 +1427,7 @@ tdm_output_set_voutput_commit(tdm_voutput *voutput) ret = tdm_voutput_set_commit_func(private_voutput, _tdm_voutput_cb_commit); if (ret != TDM_ERROR_NONE) { TDM_ERR("failed: tdm_voutput_set_commit_func"); + _pthread_mutex_unlock(&private_display->lock); return ret; } } -- 2.7.4 From 8beab8406229bf9f2f26954b98031f5537ffbe39 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 9 Jul 2019 17:21:47 +0900 Subject: [PATCH 03/16] tdm_client: check calloc fail Change-Id: I30ffda55cd4d44d794057321ed79c936d4b186d0 Signed-off-by: Junkyeong Kim --- client/tdm_client.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/client/tdm_client.c b/client/tdm_client.c index 3a2ab48..bde7a1f 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -2218,6 +2218,11 @@ tdm_client_voutput_set_available_modes(tdm_client_voutput *voutput, const tdm_cl if (count != 0) { private_voutput->available_modes.modes = calloc(count, sizeof(tdm_client_output_mode)); + if (private_voutput->available_modes.modes == NULL) { + private_voutput->available_modes.count = 0; + pthread_mutex_unlock(&private_client->lock); + return TDM_ERROR_OUT_OF_MEMORY; + } memcpy(private_voutput->available_modes.modes, modes, sizeof(tdm_client_output_mode) * count); } -- 2.7.4 From e315fbafc737fdcb044cba2a7f0c5b7d5a0820ee Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 9 Jul 2019 17:30:54 +0900 Subject: [PATCH 04/16] Package version up to 2.8.6 Change-Id: Icba91a8d99300925c3d6721c5f2fa85d5c0ee855 Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index cfa6ed6..3fc5591 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.8.5 +Version: 2.8.6 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From be738dc070af5710a42b3316f7f5a49fd2ac8d2c Mon Sep 17 00:00:00 2001 From: YoungJun Cho Date: Wed, 10 Jul 2019 14:57:57 +0900 Subject: [PATCH 05/16] tdm_output: fix log parameter Change-Id: If32820c0679e29f76c6dadc1df57663fc3114d98 Signed-off-by: YoungJun Cho --- src/tdm_output.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 8354d07..8272cc3 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -429,7 +429,7 @@ tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_ tdm_private_output *private_output = user_data; tdm_error ret; - TDM_INFO("output(%d) %s", private_output->pipe, tdm_status_str(dpms)); + TDM_INFO("output(%d) %s", private_output->pipe, tdm_dpms_str(dpms)); private_output->current_dpms_value = dpms; private_output->waiting_dpms_change = 0; -- 2.7.4 From 691fe1866fab25603336cc11e6bba47c0064ca98 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 12 Jul 2019 17:47:29 +0900 Subject: [PATCH 06/16] tdm_output: execute mutex unlock before call direct commit handler Change-Id: I14a8899be608cd61ae30603a5ca384d7c8da4393 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 8272cc3..285887e 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1630,8 +1630,11 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms_value)) { TDM_WRN("dpms %s. Directly call commit handler instead of commit.", tdm_dpms_str(dpms_value)); - if (func) + if (func) { + _pthread_mutex_unlock(&private_display->lock); func(output, 0, 0, 0, user_data); + _pthread_mutex_lock(&private_display->lock); + } } return ret; -- 2.7.4 From df97f112451306400c71432e1c99b7384fe58b9a Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 15 Jul 2019 16:31:31 +0900 Subject: [PATCH 07/16] Package version up to 2.8.7 Change-Id: Ia464dfe5a2ebe22ed83416a2a3cc1c62a035d94e Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 3fc5591..3a9b783 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.8.6 +Version: 2.8.7 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 7d4b4af6e3fa30d838b15fb031e2337842823d71 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 18 Jul 2019 20:42:22 +0900 Subject: [PATCH 08/16] hwc: referencing target buffer while showing the target buffer, increase ref count to prevent buffer destroy. Change-Id: I2aa715d1649e16fa91b38767411349e59b8c3d6f Signed-off-by: Junkyeong Kim --- src/tdm.c | 2 ++ src/tdm_hwc.c | 14 ++++++++++++++ src/tdm_private_types.h | 2 ++ 3 files changed, 18 insertions(+) diff --git a/src/tdm.c b/src/tdm.c index 81e653a..f20bfa4 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -335,6 +335,8 @@ tdm_display_destroy_private_output(tdm_private_output *private_output) private_hwc = private_output->private_hwc; LIST_FOR_EACH_ENTRY_SAFE(hw, hww, &private_hwc->hwc_window_list, link) tdm_hwc_window_destroy_internal(hw); + if (private_hwc->display_target_buffer) + tbm_surface_internal_unref(private_hwc->display_target_buffer); free(private_hwc); } else { LIST_FOR_EACH_ENTRY_SAFE(l, ll, &private_output->layer_list, link) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index 0589bc1..65f232c 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -357,6 +357,20 @@ tdm_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h target_buffer, tdm_ ret = func_hwc->hwc_set_client_target_buffer(private_hwc->hwc_backend, target_buffer, damage); + if (private_hwc->display_target_buffer) { + if (private_hwc->display_target_buffer != target_buffer) { + tbm_surface_internal_unref(private_hwc->display_target_buffer); + private_hwc->display_target_buffer = target_buffer; + if (target_buffer) + tbm_surface_internal_ref(private_hwc->display_target_buffer); + } + } else { + if (target_buffer) { + private_hwc->display_target_buffer = target_buffer; + tbm_surface_internal_ref(private_hwc->display_target_buffer); + } + } + _pthread_mutex_unlock(&private_display->lock); return ret; diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index 80d867f..dfea22a 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -327,6 +327,8 @@ struct _tdm_private_hwc { int regist_commit_cb; tdm_hwc *hwc_backend; + + tbm_surface_h display_target_buffer; }; struct _tdm_private_hwc_window { -- 2.7.4 From 6da3d27cabac23e7e1745374646fb88b44d4ec7b Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 18 Jul 2019 21:51:43 +0900 Subject: [PATCH 09/16] haltest: support hwc mode skip tdm_layer api and output_commit api test if hwc enabled. do not show the test result to screen if hwc enabled. Change-Id: I80bee46fa75f16bc34cdb00e3f6c7129295bfd95 Signed-off-by: Junkyeong Kim --- haltests/src/tc_tdm.h | 4 +- haltests/src/tc_tdm_backend_capture.cpp | 120 ++++++++++++------ haltests/src/tc_tdm_backend_display.cpp | 114 ++++++++++++++--- haltests/src/tc_tdm_backend_pp.cpp | 73 ++++++++++- haltests/src/tc_tdm_helper.cpp | 3 + haltests/src/tc_tdm_hwc.cpp | 22 ++-- haltests/src/tc_tdm_output.cpp | 214 ++++++++++++++++++++++---------- 7 files changed, 415 insertions(+), 135 deletions(-) diff --git a/haltests/src/tc_tdm.h b/haltests/src/tc_tdm.h index 853f45a..e118e77 100644 --- a/haltests/src/tc_tdm.h +++ b/haltests/src/tc_tdm.h @@ -49,13 +49,13 @@ extern bool enable_porting_debug; #define TDM_UT_CHECK_FLAG(FLAG) \ do {\ - if(!(FLAG)) \ + if (!(FLAG)) \ TDM_UT_WRN("[ ] not supported");\ } while(0) #define TDM_UT_SKIP_FLAG(FLAG) \ do {\ - if(!(FLAG)) {\ + if (!(FLAG)) {\ TDM_UT_WRN("[ SKIPPED ] not supported");\ return;\ }\ diff --git a/haltests/src/tc_tdm_backend_capture.cpp b/haltests/src/tc_tdm_backend_capture.cpp index 010153f..006430e 100644 --- a/haltests/src/tc_tdm_backend_capture.cpp +++ b/haltests/src/tc_tdm_backend_capture.cpp @@ -259,6 +259,9 @@ bool TDMBackendCapture::TestPrepare(int output_idx, int w, int h, tbm_format fmt flags |= TBM_BO_SCANOUT; } + if (tc_tdm_output_is_hwc_enable(outputs[output_idx])) + flags |= TBM_BO_SCANOUT; + TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(w, h, fmt, flags, false, 3, buffers) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_capture_fill_info(outputs[output_idx], buffers[0], t, c, frequency, stretch, &info) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tdm_capture_set_info(capture, &info) == TDM_ERROR_NONE); @@ -573,7 +576,10 @@ TEST_P(TDMBackendCapture, CaptureAttach) continue; for (int f = 0; f < format_count; f++) { - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else + FindLayer(o, formats[f], &dst_pos); ASSERT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f], TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true); @@ -666,7 +672,10 @@ TEST_P(TDMBackendCapture, CaptureDestroyWithoutCommit) ASSERT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else + FindLayer(o, formats[f], &dst_pos); ASSERT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f], TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true); @@ -697,7 +706,10 @@ TEST_P(TDMBackendCapture, CaptureDestroyBeforeDone) ASSERT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else + FindLayer(o, formats[f], &dst_pos); ASSERT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f], TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true); @@ -742,11 +754,15 @@ TEST_P(TDMBackendCapture, CaptureOneshotLetterboxSize) TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f])); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else { + FindLayer(o, formats[f], &dst_pos); - if (!dst_layer) { - TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); - continue; + if (!dst_layer) { + TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); + continue; + } } ASSERT_EQ(TestPrepare(o, half_size, half_size, formats[f], @@ -768,14 +784,17 @@ retry: snprintf(temp, sizeof temp, "f%d_b%d", f, b); DumpBuffer(b, temp); #endif - ShowBuffer(b, &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_WRN("hwc_enable, not support showing buffer"); + else + ShowBuffer(b, &dst_pos); } TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)", FOURCC_STR(formats[f]), pipe, dst_layer_index); - - HideLayer(); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + HideLayer(); TestDone(); } @@ -808,11 +827,15 @@ TEST_P(TDMBackendCapture, CaptureOneshotFullSize) TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f])); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else { + FindLayer(o, formats[f], &dst_pos); - if (!dst_layer) { - TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); - continue; + if (!dst_layer) { + TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); + continue; + } } ASSERT_EQ(TestPrepare(o, half_size, half_size, formats[f], @@ -834,14 +857,17 @@ retry: snprintf(temp, sizeof temp, "f%d_b%d", f, b); DumpBuffer(b, temp); #endif - ShowBuffer(b, &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_WRN("hwc_enable, not support showing buffer"); + else + ShowBuffer(b, &dst_pos); } TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as full size and show? (output: %d, layer: %d)", FOURCC_STR(formats[f]), pipe, dst_layer_index); - - HideLayer(); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + HideLayer(); TestDone(); } @@ -874,11 +900,15 @@ TEST_P(TDMBackendCapture, CaptureOneshotAttachFewTimesInOneCommit) TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f])); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else { + FindLayer(o, formats[f], &dst_pos); - if (!dst_layer) { - TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); - continue; + if (!dst_layer) { + TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); + continue; + } } ASSERT_EQ(TestPrepare(o, half_size, half_size, formats[f], @@ -902,14 +932,17 @@ retry: snprintf(temp, sizeof temp, "f%d_b%d", f, b); DumpBuffer(b, temp); #endif - ShowBuffer(b, &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_WRN("hwc_enable, not support showing buffer"); + else + ShowBuffer(b, &dst_pos); } TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)", FOURCC_STR(formats[f]), pipe, dst_layer_index); - - HideLayer(); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + HideLayer(); TestDone(); } @@ -940,7 +973,12 @@ _tc_tdm_capture_stream_done_cb(tdm_capture *capture, tbm_surface_h buffer, void DumpBuffer(b, temp); #endif tdm_buffer_add_release_handler(buffer, _tc_tdm_backend_capture_buffer_release_cb, (void*)backend_capture); - backend_capture->ShowBuffer(b, &backend_capture->dst_pos); + if (tc_tdm_output_is_hwc_enable(backend_capture->output)) { + TDM_UT_WRN("hwc_enable, not support showing buffer"); + _tc_tdm_backend_capture_buffer_release_cb(buffer, user_data); + } + else + backend_capture->ShowBuffer(b, &backend_capture->dst_pos); break; } } @@ -974,11 +1012,15 @@ TEST_P(TDMBackendCapture, CaptureStreamLetterboxSize) TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f])); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else { + FindLayer(o, formats[f], &dst_pos); - if (!dst_layer) { - TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); - continue; + if (!dst_layer) { + TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); + continue; + } } ASSERT_EQ(TestPrepare(o, half_size, half_size, formats[f], @@ -1002,8 +1044,8 @@ retry: TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)", FOURCC_STR(formats[f]), pipe, dst_layer_index); - - HideLayer(); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + HideLayer(); TestDone(); } @@ -1034,11 +1076,15 @@ TEST_P(TDMBackendCapture, CaptureStreamFullSize) TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f])); - FindLayer(o, formats[f], &dst_pos); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + dst_layer = NULL; + else { + FindLayer(o, formats[f], &dst_pos); - if (!dst_layer) { - TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); - continue; + if (!dst_layer) { + TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f])); + continue; + } } ASSERT_EQ(TestPrepare(o, half_size, half_size, formats[f], @@ -1062,8 +1108,8 @@ retry: TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as full size and show? (output: %d, layer: %d)", FOURCC_STR(formats[f]), pipe, dst_layer_index); - - HideLayer(); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + HideLayer(); TestDone(); } diff --git a/haltests/src/tc_tdm_backend_display.cpp b/haltests/src/tc_tdm_backend_display.cpp index 7fd8464..b79cbd8 100644 --- a/haltests/src/tc_tdm_backend_display.cpp +++ b/haltests/src/tc_tdm_backend_display.cpp @@ -167,6 +167,9 @@ TEST_P(TDMBackendBasic, VerifyLayerObject) tdm_output *output = tdm_display_get_output(dpy, o, &ret); ASSERT_EQ(ret, TDM_ERROR_NONE); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + int layer_count = 0; ASSERT_EQ(tdm_output_get_layer_count(output, &layer_count), TDM_ERROR_NONE); TDM_UT_ASSERT_TRUE(layer_count > 0, @@ -220,6 +223,9 @@ TEST_P(TDMBackendBasic, VerifyLayerGetProperty) tdm_output *output = tdm_display_get_output(dpy, o, &ret); ASSERT_EQ(ret, TDM_ERROR_NONE); + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + int layer_count = 0; ASSERT_EQ(tdm_output_get_layer_count(output, &layer_count), TDM_ERROR_NONE); @@ -324,6 +330,9 @@ TEST_P(TDMBackendBasic, VerifyPrimaryLayerShowOneFrame) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); @@ -354,6 +363,9 @@ TEST_P(TDMBackendBasic, VerifyPrimaryLayerShowManyFrames) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); @@ -400,6 +412,9 @@ TEST_P(TDMBackendBasic, VerifyPrimaryLayerShowOneFrameWithCommitHandler) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); @@ -433,6 +448,9 @@ TEST_P(TDMBackendBasic, VerifyOverlayLayersShowOneFrame) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); @@ -480,6 +498,9 @@ TEST_P(TDMBackendBasic, VerifyOverlayLayersShowManyFrames) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); @@ -554,14 +575,16 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblank) ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); - layer = tc_tdm_output_get_primary_layer(outputs[o]); - ASSERT_NE(layer, NULL); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + layer = tc_tdm_output_get_primary_layer(outputs[o]); + ASSERT_NE(layer, NULL); - ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); - ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); - DestroyBuffers(); + ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); + ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); + DestroyBuffers(); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + } /* start from 1 */ for (int t = 1; t < 10; t++) { @@ -604,14 +627,16 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblankInterval) ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); - layer = tc_tdm_output_get_primary_layer(outputs[o]); - ASSERT_NE(layer, NULL); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + layer = tc_tdm_output_get_primary_layer(outputs[o]); + ASSERT_NE(layer, NULL); - ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); - ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); - DestroyBuffers(); + ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); + ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); + DestroyBuffers(); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + } /* start from 1 */ for (int t = 1; t < 10; t++) { @@ -651,14 +676,16 @@ TEST_P(TDMBackendBasic, VerifyOutputWaitVblankFewTimesInOneVblank) ASSERT_EQ(tc_tdm_output_mode_setting(outputs[o]), true); ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); - layer = tc_tdm_output_get_primary_layer(outputs[o]); - ASSERT_NE(layer, NULL); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + layer = tc_tdm_output_get_primary_layer(outputs[o]); + ASSERT_NE(layer, NULL); - ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); - ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); - DestroyBuffers(); + ASSERT_EQ(tc_tdm_layer_prepare_buffer(layer, buffers, 1, true), true); + ASSERT_EQ(tc_tdm_layer_set_buffer(layer, buffers[0]), true); + DestroyBuffers(); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + } /* start from 1 */ for (int t = 1; t < 10; t++) { @@ -845,6 +872,9 @@ TEST_P(TDMBackendDisplay, VerifyPirmaryLayerFormat) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + layer = tc_tdm_output_get_primary_layer(outputs[o]); ASSERT_NE(layer, NULL); @@ -888,6 +918,13 @@ TEST_P(TDMBackendDisplay, VerifyOverlayLayerFormat) { ASSERT_EQ(tc_tdm_output_prepare_all_output(dpy, outputs, output_count, false), true); + if (output_count > 0) { + if (tc_tdm_output_is_hwc_enable(outputs[0])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[0]), true); + TDM_UT_SKIP_FLAG(0); + } + } + for (int l = 0; l < layer_count; l++) { tdm_error ret; tdm_output *output; @@ -958,6 +995,13 @@ TEST_P(TDMBackendDisplay, VerifyOverlayLayerSize) { ASSERT_EQ(tc_tdm_output_prepare_all_output(dpy, outputs, output_count, false), true); + if (output_count > 0) { + if (tc_tdm_output_is_hwc_enable(outputs[0])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[0]), true); + TDM_UT_SKIP_FLAG(0); + } + } + for (int l = 0; l < layer_count; l++) { tdm_error ret; tdm_output *output; @@ -1033,6 +1077,13 @@ TEST_P(TDMBackendDisplay, VerifyOverlayLayerScale) { ASSERT_EQ(tc_tdm_output_prepare_all_output(dpy, outputs, output_count, false), true); + if (output_count > 0) { + if (tc_tdm_output_is_hwc_enable(outputs[0])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[0]), true); + TDM_UT_SKIP_FLAG(0); + } + } + for (int l = 0; l < layer_count; l++) { tdm_error ret; tdm_output *output; @@ -1122,6 +1173,13 @@ TEST_P(TDMBackendDisplay, VerifyOverlayLayerMovePosition) { ASSERT_EQ(tc_tdm_output_prepare_all_output(dpy, outputs, output_count, false), true); + if (output_count > 0) { + if (tc_tdm_output_is_hwc_enable(outputs[0])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[0]), true); + TDM_UT_SKIP_FLAG(0); + } + } + for (int l = 0; l < layer_count; l++) { tdm_error ret; tdm_output *output; @@ -1210,6 +1268,13 @@ TEST_P(TDMBackendDisplay, VerifyOverlayLayerCrop) { ASSERT_EQ(tc_tdm_output_prepare_all_output(dpy, outputs, output_count, false), true); + if (output_count > 0) { + if (tc_tdm_output_is_hwc_enable(outputs[0])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[0]), true); + TDM_UT_SKIP_FLAG(0); + } + } + for (int l = 0; l < layer_count; l++) { tdm_error ret; tdm_output *output; @@ -1355,6 +1420,9 @@ TEST_P(TDMBackendDisplay, DISABLED_VerifyOutputSetDpmsToOffAfterUnsetWithoutComm if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); tdm_layer *layer = tc_tdm_output_get_primary_layer(outputs[o]); @@ -1375,6 +1443,11 @@ TEST_P(TDMBackendDisplay, DISABLED_VerifyOutputSetDpmsToOffAfterUnsetWithCommit) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); + if (tc_tdm_output_is_hwc_enable(outputs[o])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[o]), true); + TDM_UT_SKIP_FLAG(0); + } + tdm_layer *layer = tc_tdm_output_get_primary_layer(outputs[o]); ASSERT_NE(layer, NULL); @@ -1397,6 +1470,11 @@ TEST_P(TDMBackendDisplay, VerifyLayerGetInfo) if (!tc_tdm_output_is_connected(outputs[o])) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) { + ASSERT_EQ(tc_tdm_output_unset(dpy, outputs[o]), true); + TDM_UT_SKIP_FLAG(0); + } + tbm_surface_h displaying_buffer; tdm_error ret; tdm_info_layer info, temp; diff --git a/haltests/src/tc_tdm_backend_pp.cpp b/haltests/src/tc_tdm_backend_pp.cpp index 424b36c..f739d96 100644 --- a/haltests/src/tc_tdm_backend_pp.cpp +++ b/haltests/src/tc_tdm_backend_pp.cpp @@ -56,6 +56,7 @@ public: tdm_layer *dst_layer; const tbm_format *dst_formats; + tbm_format *pp_formats; int dst_format_count; int dst_zpos; int dst_layer_index; @@ -96,6 +97,7 @@ TDMBackendPP::TDMBackendPP() dst_format_count = 0; dst_zpos = 0; dst_layer_index = 0; + pp_formats = NULL; } void TDMBackendPP::SetUp(void) @@ -136,6 +138,7 @@ void TDMBackendPP::TearDown(void) tdm_pp_destroy(pp); DestroyBuffers(); + ASSERT_EQ(tc_tdm_output_unset(dpy, output), true); TDMBackendDisplay::TearDown(); } @@ -174,6 +177,9 @@ bool TDMBackendPP::PrepareBuffers(int sw, int sh, tbm_format sf, int dw, int dh, dst_flags |= TBM_BO_SCANOUT; } + if (tc_tdm_output_is_hwc_enable(output)) + dst_flags |= TBM_BO_SCANOUT; + TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(sw, sh, sf, src_flags, true, 3, srcbuf) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(dw, dh, df, dst_flags, false, 3, dstbuf) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_pp_fill_info(srcbuf[0], dstbuf[0], t, &info) == true); @@ -187,6 +193,19 @@ bool TDMBackendPP::FindLayerUnderPrimary(void) tdm_error ret; int count; int primary_zpos, zpos; + + if (tc_tdm_output_is_hwc_enable(output)) { + pp_formats = (tbm_format *)calloc(1, sizeof(tbm_format) * 2); + pp_formats[0] = TBM_FORMAT_NV12; + pp_formats[1] = TBM_FORMAT_YUV420; + dst_formats = pp_formats; + dst_format_count = 2; + TDM_UT_RETURN_FALSE_IF_FAIL(dst_formats != NULL); + TDM_UT_RETURN_FALSE_IF_FAIL(dst_format_count > 0); + dst_layer = NULL; + return true; + } + tdm_layer *primary = tc_tdm_output_get_primary_layer(output); TDM_UT_RETURN_FALSE_IF_FAIL(primary != NULL); TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(output, &count) == TDM_ERROR_NONE); @@ -217,6 +236,19 @@ bool TDMBackendPP::FindLayerOverPrimary(void) tdm_error ret; int count; int primary_zpos, zpos; + + if (tc_tdm_output_is_hwc_enable(output)) { + pp_formats = (tbm_format *)calloc(1, sizeof(tbm_format) * 2); + pp_formats[0] = TBM_FORMAT_ARGB8888; + pp_formats[1] = TBM_FORMAT_XRGB8888; + dst_formats = formats; + dst_format_count = 2; + TDM_UT_RETURN_FALSE_IF_FAIL(dst_formats != NULL); + TDM_UT_RETURN_FALSE_IF_FAIL(dst_format_count > 0); + dst_layer = NULL; + return true; + } + tdm_layer *primary = tc_tdm_output_get_primary_layer(output); TDM_UT_RETURN_FALSE_IF_FAIL(primary != NULL); TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(output, &count) == TDM_ERROR_NONE); @@ -254,6 +286,9 @@ _tc_tdm_backend_pp_output_commit_cb(tdm_output *output, unsigned int sequence, void TDMBackendPP::ShowBuffer(int b) { ASSERT_NE(output, NULL); + if (tc_tdm_output_is_hwc_enable(output)) + TDM_UT_SKIP_FLAG(0); + ASSERT_NE(dst_layer, NULL); bool done = false; @@ -268,6 +303,9 @@ void TDMBackendPP::ShowBuffer(int b) void TDMBackendPP::HideLayer(void) { ASSERT_NE(output, NULL); + if (tc_tdm_output_is_hwc_enable(output)) + TDM_UT_SKIP_FLAG(0); + ASSERT_NE(dst_layer, NULL); tdm_layer_unset_buffer(dst_layer); @@ -525,7 +563,8 @@ TEST_P(TDMBackendPP, PPConvertUnderlay) FindLayerUnderPrimary(); - ASSERT_NE(dst_layer, NULL); + if (!tc_tdm_output_is_hwc_enable(output)) + ASSERT_NE(dst_layer, NULL); for (int f = 0; f < dst_format_count; f++) { bool done; @@ -564,6 +603,10 @@ retry: DestroyPP(); DestroyBuffers(); } + if (tc_tdm_output_is_hwc_enable(output) && pp_formats) { + free(pp_formats); + pp_formats = NULL; + } } TEST_P(TDMBackendPP, PPConvertOverlay) @@ -572,7 +615,8 @@ TEST_P(TDMBackendPP, PPConvertOverlay) FindLayerOverPrimary(); - TDM_UT_SKIP_FLAG(dst_layer != NULL); + if (!tc_tdm_output_is_hwc_enable(output)) + TDM_UT_SKIP_FLAG(dst_layer != NULL); for (int f = 0; f < dst_format_count; f++) { bool done; @@ -611,6 +655,10 @@ retry: DestroyPP(); DestroyBuffers(); } + if (tc_tdm_output_is_hwc_enable(output) && pp_formats) { + free(pp_formats); + pp_formats = NULL; + } } TEST_P(TDMBackendPP, PPConvertScale) @@ -619,7 +667,8 @@ TEST_P(TDMBackendPP, PPConvertScale) FindLayerUnderPrimary(); - ASSERT_NE(dst_layer, NULL); + if (!tc_tdm_output_is_hwc_enable(output)) + ASSERT_NE(dst_layer, NULL); for (int f = 0; f < dst_format_count; f++) { bool done; @@ -658,6 +707,10 @@ retry: DestroyPP(); DestroyBuffers(); } + if (tc_tdm_output_is_hwc_enable(output) && pp_formats) { + free(pp_formats); + pp_formats = NULL; + } } TEST_P(TDMBackendPP, PPConvertTransform) @@ -666,7 +719,8 @@ TEST_P(TDMBackendPP, PPConvertTransform) FindLayerUnderPrimary(); - ASSERT_NE(dst_layer, NULL); + if (!tc_tdm_output_is_hwc_enable(output)) + ASSERT_NE(dst_layer, NULL); for (int f = 0; f < dst_format_count; f++) { for (int t = (int)TDM_TRANSFORM_90; t <= (int)TDM_TRANSFORM_FLIPPED_270; t++) { @@ -707,6 +761,10 @@ retry: DestroyBuffers(); } } + if (tc_tdm_output_is_hwc_enable(output) && pp_formats) { + free(pp_formats); + pp_formats = NULL; + } } TEST_P(TDMBackendPP, PPConvertCSC) @@ -716,7 +774,8 @@ TEST_P(TDMBackendPP, PPConvertCSC) FindLayerUnderPrimary(); - ASSERT_NE(dst_layer, NULL); + if (!tc_tdm_output_is_hwc_enable(output)) + ASSERT_NE(dst_layer, NULL); for (int df = 0; df < dst_format_count; df++) { for (int sf = 0; sf < format_count; sf++) { @@ -758,6 +817,10 @@ retry: DestroyBuffers(); } } + if (tc_tdm_output_is_hwc_enable(output) && pp_formats) { + free(pp_formats); + pp_formats = NULL; + } } diff --git a/haltests/src/tc_tdm_helper.cpp b/haltests/src/tc_tdm_helper.cpp index 4509cd0..6ac40da 100644 --- a/haltests/src/tc_tdm_helper.cpp +++ b/haltests/src/tc_tdm_helper.cpp @@ -415,6 +415,9 @@ TEST_P(TDMHelper, HelperCaptureOutput) if (!tc_tdm_output_is_connected(output)) continue; + if (tc_tdm_output_is_hwc_enable(outputs[o])) + TDM_UT_SKIP_FLAG(0); + ASSERT_EQ(tc_tdm_output_prepare(dpy, output, true), true); dump = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888); diff --git a/haltests/src/tc_tdm_hwc.cpp b/haltests/src/tc_tdm_hwc.cpp index 541414f..b3618e9 100644 --- a/haltests/src/tc_tdm_hwc.cpp +++ b/haltests/src/tc_tdm_hwc.cpp @@ -209,7 +209,7 @@ TEST_P(TDMHwc, GetClientTargetBufferQueueFailNullObject) } } -TEST_P(TDMHwc, GetClientTargetBufferQueueFainNoHwc) +TEST_P(TDMHwc, GetClientTargetBufferQueueFailNoHwc) { TDM_UT_SKIP_FLAG(has_outputs); @@ -221,8 +221,8 @@ TEST_P(TDMHwc, GetClientTargetBufferQueueFainNoHwc) hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { queue = tdm_hwc_get_client_target_buffer_queue(hwc, &error); - ASSERT_EQ(TDM_ERROR_NONE, error); - ASSERT_NE(NULL, queue); + ASSERT_NE(TDM_ERROR_NONE, error); + ASSERT_EQ(NULL, queue); } else { queue = tdm_hwc_get_client_target_buffer_queue(hwc, &error); ASSERT_NE(TDM_ERROR_NONE, error); @@ -240,6 +240,7 @@ TEST_P(TDMHwc, GetClientTargetBufferQueueSuccessful) tbm_surface_queue_h queue = NULL; for (int o = 0; o < output_count; o++) { + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { queue = tdm_hwc_get_client_target_buffer_queue(hwc, &error); @@ -291,9 +292,11 @@ TEST_P(TDMHwc, SetClientTargetBufferSuccessfulSetBuff) tbm_surface_h target_buff = NULL; for (int o = 0; o < output_count; o++) { + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { ASSERT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE); + ASSERT_NE(mode, NULL); target_buff = tbm_surface_internal_create_with_flags(mode->hdisplay, mode->vdisplay, TBM_FORMAT_ARGB8888, TBM_BO_DEFAULT); ASSERT_NE(NULL, target_buff); @@ -315,13 +318,12 @@ TEST_P(TDMHwc, SetClientTargetBufferSuccessfulResetBuff) tdm_hwc *hwc = NULL; tdm_error error = TDM_ERROR_NONE; tdm_region damage = {.num_rects = 0, .rects = NULL}; - tbm_surface_h target_buff = NULL; for (int o = 0; o < output_count; o++) { + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { error = tdm_hwc_set_client_target_buffer(hwc, NULL, damage); - tbm_surface_internal_destroy(target_buff); ASSERT_EQ(TDM_ERROR_NONE, error); } else { error = tdm_hwc_set_client_target_buffer(hwc, NULL, damage); @@ -396,7 +398,7 @@ TEST_P(TDMHwc, AcceptChangesFailNoHwc) hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { error = tdm_hwc_accept_validation(hwc); - ASSERT_NE(TDM_ERROR_NONE, error); + ASSERT_EQ(TDM_ERROR_NONE, error); } else { error = tdm_hwc_accept_validation(hwc); ASSERT_NE(TDM_ERROR_NONE, error); @@ -417,6 +419,7 @@ TEST_P(TDMHwc, AcceptChangesSuccessful) uint32_t get_num = 0; for (int o = 0; o < output_count; o++) { + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { for (int w = 0; w < HWC_WIN_NUM; w++) { @@ -433,11 +436,12 @@ TEST_P(TDMHwc, AcceptChangesSuccessful) changed_hwc_window = (tdm_hwc_window **)calloc(num_types, sizeof(tdm_hwc_window *)); composition_types = (tdm_hwc_window_composition *)calloc(num_types, sizeof(tdm_hwc_window_composition)); + get_num = num_types; error = tdm_hwc_get_changed_composition_types(hwc, &get_num, changed_hwc_window, composition_types); ASSERT_EQ(TDM_ERROR_NONE, error); ASSERT_EQ(get_num, num_types); - error = tdm_hwc_accept_validation(hwc); + error = tdm_hwc_accept_validation(hwc); ASSERT_EQ(TDM_ERROR_NONE, error); free(composition_types); @@ -474,6 +478,7 @@ TEST_P(TDMHwc, CommitSuccessful) uint32_t get_num = 0; for (int o = 0; o < output_count; o++) { + ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); hwc = tdm_output_get_hwc(outputs[o], &error); if (hwc) { for (int w = 0; w < HWC_WIN_NUM; w++) { @@ -490,6 +495,7 @@ TEST_P(TDMHwc, CommitSuccessful) changed_hwc_window = (tdm_hwc_window **)calloc(num_types, sizeof(tdm_hwc_window *)); composition_types = (tdm_hwc_window_composition *)calloc(num_types, sizeof(tdm_hwc_window_composition)); + get_num = num_types; error = tdm_hwc_get_changed_composition_types(hwc, &get_num, changed_hwc_window, composition_types); ASSERT_EQ(TDM_ERROR_NONE, error); ASSERT_EQ(get_num, num_types); @@ -502,7 +508,7 @@ TEST_P(TDMHwc, CommitSuccessful) } error = tdm_hwc_commit(hwc, 0, _tc_tdm_hwc_commit_cb, NULL); - ASSERT_NE(TDM_ERROR_NONE, error); + ASSERT_EQ(TDM_ERROR_NONE, error); for (int w = 0; w < HWC_WIN_NUM; w++) tdm_hwc_window_destroy(hwc_wnds[w]); diff --git a/haltests/src/tc_tdm_output.cpp b/haltests/src/tc_tdm_output.cpp index 15224f0..75aefe4 100644 --- a/haltests/src/tc_tdm_output.cpp +++ b/haltests/src/tc_tdm_output.cpp @@ -181,6 +181,23 @@ _tc_tdm_output_done_cb(tdm_output *output, unsigned int sequence, } bool +tc_tdm_output_prepare_hwc_buffer(tdm_output *output, tbm_surface_h *buffers, int buffer_count, bool fill) +{ + int w, h; + const tdm_output_mode *mode = NULL; + + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(mode != NULL); + + w = mode->hdisplay; + h = mode->vdisplay; + + TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(w, h, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT, fill, buffer_count, buffers) == true); + + return true; +} + +bool tc_tdm_output_prepare(tdm_display *dpy, tdm_output *output, bool fill) { tbm_surface_h buffer = NULL; @@ -189,27 +206,41 @@ tc_tdm_output_prepare(tdm_display *dpy, tdm_output *output, bool fill) tdm_layer *layer; bool done = false; tdm_output_conn_status status; + tdm_region fb_damage; + tdm_hwc *thwc = NULL; + uint32_t num = 0; TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_output_is_connected(output) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_output_mode_setting(output) == true); TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_ON) == TDM_ERROR_NONE); - TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_primary_index(output, &primary_index) == TDM_ERROR_NONE); - TDM_UT_RETURN_FALSE_IF_FAIL(primary_index >= 0); + if (tc_tdm_output_is_hwc_enable(output)) { + TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_output_prepare_hwc_buffer(output, &buffer, 1, fill) == true); + thwc = tdm_output_get_hwc(output, &ret); + TDM_UT_GOTO_IF_FAIL(thwc != NULL, failed); - layer = tdm_output_get_layer(output, primary_index, &ret); - TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE); - TDM_UT_RETURN_FALSE_IF_FAIL(layer != NULL); + TDM_UT_GOTO_IF_FAIL(tdm_hwc_set_client_target_buffer(thwc, buffer, fb_damage) == TDM_ERROR_NONE, failed); + TDM_UT_GOTO_IF_FAIL(tdm_hwc_validate(thwc, NULL, 0, &num) == TDM_ERROR_NONE, failed); + TDM_UT_GOTO_IF_FAIL(tdm_hwc_accept_validation(thwc) == TDM_ERROR_NONE, failed); + TDM_UT_GOTO_IF_FAIL(tdm_hwc_commit(thwc, 0, NULL, NULL) == TDM_ERROR_NONE, failed); + } else { + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_primary_index(output, &primary_index) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(primary_index >= 0); + + layer = tdm_output_get_layer(output, primary_index, &ret); + TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(layer != NULL); - TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_layer_prepare_buffer(layer, &buffer, 1, fill) == true); - TDM_UT_RETURN_FALSE_IF_FAIL(buffer != NULL); + TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_layer_prepare_buffer(layer, &buffer, 1, fill) == true); + TDM_UT_RETURN_FALSE_IF_FAIL(buffer != NULL); - TDM_UT_GOTO_IF_FAIL(tc_tdm_layer_set_buffer(layer, buffer) == true, failed); + TDM_UT_GOTO_IF_FAIL(tc_tdm_layer_set_buffer(layer, buffer) == true, failed); - if (tdm_helper_output_commit_per_vblank_enabled(output)) - TDM_UT_GOTO_IF_FAIL(tdm_layer_commit(layer, NULL, NULL) == TDM_ERROR_NONE, failed); - else - TDM_UT_GOTO_IF_FAIL(tdm_output_commit(output, 0, NULL, NULL) == TDM_ERROR_NONE, failed); + if (tdm_helper_output_commit_per_vblank_enabled(output)) + TDM_UT_GOTO_IF_FAIL(tdm_layer_commit(layer, NULL, NULL) == TDM_ERROR_NONE, failed); + else + TDM_UT_GOTO_IF_FAIL(tdm_output_commit(output, 0, NULL, NULL) == TDM_ERROR_NONE, failed); + } TDM_UT_GOTO_IF_FAIL(tdm_output_get_conn_status(output, &status) == TDM_ERROR_NONE, failed); TDM_UT_GOTO_IF_FAIL(status == TDM_OUTPUT_CONN_STATUS_MODE_SETTED, failed); @@ -246,21 +277,43 @@ tc_tdm_output_unset(tdm_display *dpy, tdm_output *output) tdm_error ret; int count = 0; unsigned int pipe = 0; + tdm_hwc *thwc = NULL; + const tdm_output_mode *mode = NULL; + tdm_output_dpms dpms = TDM_OUTPUT_DPMS_OFF; + tdm_region fb_damage; + uint32_t num = 0; + + if (tc_tdm_output_is_hwc_enable(output)) { + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE); + if (mode == NULL) + return true; + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_dpms(output, &dpms) == TDM_ERROR_NONE); + if (dpms != TDM_OUTPUT_DPMS_ON) + return true; + + thwc = tdm_output_get_hwc(output, &ret); + TDM_UT_RETURN_FALSE_IF_FAIL(thwc != NULL); + + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_hwc_set_client_target_buffer(thwc, NULL, fb_damage) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_hwc_validate(thwc, NULL, 0, &num) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_hwc_accept_validation(thwc) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_hwc_commit(thwc, 0, NULL, NULL) == TDM_ERROR_NONE); + } else { + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(output, &count) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(count > 0); - TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(output, &count) == TDM_ERROR_NONE); - TDM_UT_RETURN_FALSE_IF_FAIL(count > 0); + for (int l = 0; l < count; l++) { + tdm_layer *layer = tdm_output_get_layer(output, l, &ret); + TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(layer != NULL); - for (int l = 0; l < count; l++) { - tdm_layer *layer = tdm_output_get_layer(output, l, &ret); - TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE); - TDM_UT_RETURN_FALSE_IF_FAIL(layer != NULL); + if (tc_tdm_layer_is_cursor_layer(layer)) + continue; + if (tc_tdm_layer_is_video_layer(layer)) + continue; - if (tc_tdm_layer_is_cursor_layer(layer)) - continue; - if (tc_tdm_layer_is_video_layer(layer)) - continue; - - TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_unset_buffer(layer) == TDM_ERROR_NONE); + TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_unset_buffer(layer) == TDM_ERROR_NONE); + } } TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_pipe(output, &pipe) == TDM_ERROR_NONE); @@ -794,8 +847,12 @@ TEST_P(TDMOutput, OutputGetPrimaryIndex) for (int o = 0; o < output_count; o++) { int primary_index = TDM_UT_INVALID_VALUE; - ASSERT_EQ(tdm_output_get_primary_index(outputs[o], &primary_index), TDM_ERROR_NONE); - ASSERT_NE(primary_index, TDM_UT_INVALID_VALUE); + + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + ASSERT_EQ(tdm_output_get_primary_index(outputs[o], &primary_index), TDM_ERROR_NONE); + ASSERT_NE(primary_index, TDM_UT_INVALID_VALUE); + } else + TDM_UT_SKIP_FLAG(0); } } @@ -1450,13 +1507,16 @@ TEST_P(TDMOutput, OutputCommit) done1 = false; start = tdm_helper_get_time(); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); - while (!done1) - ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); - end = tdm_helper_get_time(); - - /* "+ interval" consider the delay of socket communication between kernel and platform */ - ASSERT_LT((end - start), (interval + interval)); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); + while (!done1) + ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + end = tdm_helper_get_time(); + + /* "+ interval" consider the delay of socket communication between kernel and platform */ + ASSERT_LT((end - start), (interval + interval)); + } else + TDM_UT_SKIP_FLAG(0); } } } @@ -1481,7 +1541,10 @@ TEST_P(TDMOutput, OutputCommitNullOther) continue; ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_ON), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + ASSERT_EQ(tdm_output_commit(outputs[o], 0, NULL, NULL), TDM_ERROR_NONE); + else + TDM_UT_SKIP_FLAG(0); } } @@ -1501,7 +1564,10 @@ TEST_P(TDMOutput, OutputCommitDpmsSuspend) ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_SUSPEND), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, NULL), TDM_ERROR_DPMS_OFF); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, NULL), TDM_ERROR_DPMS_OFF); + else + TDM_UT_SKIP_FLAG(0); } } @@ -1521,7 +1587,10 @@ TEST_P(TDMOutput, OutputCommitDpmsOff) ASSERT_EQ(tdm_output_set_dpms(outputs[o], TDM_OUTPUT_DPMS_OFF), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, NULL), TDM_ERROR_DPMS_OFF); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, NULL), TDM_ERROR_DPMS_OFF); + else + TDM_UT_SKIP_FLAG(0); } } @@ -1567,8 +1636,11 @@ TEST_P(TDMOutput, OutputCommitAfterLayerCommit) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); - ASSERT_EQ(tdm_output_get_primary_index(outputs[o], &index), TDM_ERROR_NONE); - ASSERT_NE(index, TDM_UT_INVALID_VALUE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + ASSERT_EQ(tdm_output_get_primary_index(outputs[o], &index), TDM_ERROR_NONE); + ASSERT_NE(index, TDM_UT_INVALID_VALUE); + } else + TDM_UT_SKIP_FLAG(0); layer = tdm_output_get_layer(outputs[o], index, &ret); ASSERT_EQ(ret, TDM_ERROR_NONE); @@ -1609,12 +1681,15 @@ TEST_P(TDMOutput, OutputCommitFewTimesInOneVblank) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); for (int t = 0; t < 10; t++) { - done1 = done2 = done3 = false; - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); - while (!done1 || !done2 || !done3) - ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + done1 = done2 = done3 = false; + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); + while (!done1 || !done2 || !done3) + ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + } else + TDM_UT_SKIP_FLAG(0); } } } @@ -1640,13 +1715,16 @@ TEST_P(TDMOutput, OutputRemoveCommitHandler) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); for (int t = 0; t < 10; t++) { - done1 = done2 = done3 = false; - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); - tdm_output_remove_commit_handler(outputs[o], _tc_tdm_output_done_cb, &done2); - while (!done1 || done2 || !done3) - ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + done1 = done2 = done3 = false; + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); + tdm_output_remove_commit_handler(outputs[o], _tc_tdm_output_done_cb, &done2); + while (!done1 || done2 || !done3) + ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + } else + TDM_UT_SKIP_FLAG(0); } } } @@ -1666,13 +1744,16 @@ TEST_P(TDMOutput, OutputRemoveCommitHandlerDifferentData) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); for (int t = 0; t < 10; t++) { - done1 = done2 = done3 = false; - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); - tdm_output_remove_commit_handler(outputs[o], _tc_tdm_output_done_cb, NULL); - while (!done1 || !done2 || !done3) - ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + done1 = done2 = done3 = false; + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done1), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done2), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb, &done3), TDM_ERROR_NONE); + tdm_output_remove_commit_handler(outputs[o], _tc_tdm_output_done_cb, NULL); + while (!done1 || !done2 || !done3) + ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + } else + TDM_UT_SKIP_FLAG(0); } } } @@ -1692,12 +1773,15 @@ TEST_P(TDMOutput, OutputRemoveCommitHandlerInHandler) ASSERT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true); for (int t = 0; t < 10; t++) { - done1 = done2 = done3 = false; - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done1), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done2), TDM_ERROR_NONE); - ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done3), TDM_ERROR_NONE); - while (!done1 || !done2 || !done3) - ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + if (!tc_tdm_output_is_hwc_enable(outputs[o])) { + done1 = done2 = done3 = false; + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done1), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done2), TDM_ERROR_NONE); + ASSERT_EQ(tdm_output_commit(outputs[o], 0, _tc_tdm_output_done_cb2, &done3), TDM_ERROR_NONE); + while (!done1 || !done2 || !done3) + ASSERT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE); + } else + TDM_UT_SKIP_FLAG(0); } } } @@ -1712,4 +1796,4 @@ INSTANTIATE_TEST_CASE_P(TDMOutputParams, Values(TDM_DEFAULT_MODULE)); #endif -/* LCOV_EXCL_END */ \ No newline at end of file +/* LCOV_EXCL_END */ -- 2.7.4 From 1622e07c4116392a2129f31f17c9069cf70c1006 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 22 Jul 2019 19:07:33 +0900 Subject: [PATCH 10/16] add TDM_OUTPUT_CAPABILITY_MIRROR The backend can set the TDM_OUTPUT_CAPABILITY_MIRROR when it has the ability of the output mirroring. Change-Id: I34a6d86a2c7128b93a8b9acee1306b2caefad902 --- include/tdm_common.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/tdm_common.h b/include/tdm_common.h index 70a081c..bfb4cc6 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -99,6 +99,7 @@ typedef enum { TDM_OUTPUT_CAPABILITY_ASYNC_DPMS = (1 << 0), /**< if a outupt supports asynchronous DPMS operation */ TDM_OUTPUT_CAPABILITY_HWC = (1 << 1), /**< if a outupt supports hwc operation @since 2.0.0*/ TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS = (1 << 2), /**< if a outupt supports extended DPMS operation @since 2.0.0 */ + TDM_OUTPUT_CAPABILITY_MIRROR = (1 << 3), /**< if a outupt supports the displying mirror image of the src_output @since 2.9.0 */ } tdm_output_capability; /** -- 2.7.4 From 9bd49c10734de8b55679ecd3bb663200354bc5b7 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 22 Jul 2019 09:39:10 +0900 Subject: [PATCH 11/16] add tdm_output_set_mirror This function set the mirro image of the src_output to the output. If there is the hardware or the implementation to display the mirror image of the src_output to the output, the backend does it in this function. Change-Id: Ic661793af90ce4d87684d1f0bbcb14a5052e2585 --- include/tdm.h | 10 ++++++++++ include/tdm_backend.h | 18 +++++++++++++++++- src/tdm_output.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) diff --git a/include/tdm.h b/include/tdm.h index 71f7a1c..1c10a3c 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -649,6 +649,16 @@ tdm_hwc * tdm_output_get_hwc(tdm_output *output, tdm_error *error); /** + * @brief Set the mirror image of the src_output to the output + * @param[in] output A output object to display the src_output image + * @param[in] src_output A src output object of which image is displayed on the output + * @param[in] transform A transform value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform); + +/** * @brief Get a output object of a layer object * @param[in] layer A layer object * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. diff --git a/include/tdm_backend.h b/include/tdm_backend.h index c5db80a..4075f7b 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -558,7 +558,23 @@ typedef struct _tdm_func_output { */ tdm_hwc *(*output_get_hwc)(tdm_output *output, tdm_error *error); - void (*reserved3)(void); + /** + * @brief Set the mirror image of the src_output to the output + * @details This function set the mirro image of the src_output to the output. + * If there is the hardware or the implementation to display the mirror image + * of the src_output to the output, the backend does it in this function. + * If the backend output gets the ability of the mirror displaying, it has to + * set the TDM_OUTPUT_CAPABILITY_MIRROR on the output capability. + * @param[in] output A output object to display the src_output image + * @param[in] src_output A src output object of which image is displayed on the output + * @param[in] transform A transform value + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #TDM_OUTPUT_CAPABILITY_MIRROR + */ + tdm_error (*output_set_mirror)(tdm_output *output, + tdm_output *src_output, + tdm_transform transform); + void (*reserved4)(void); void (*reserved5)(void); void (*reserved6)(void); diff --git a/src/tdm_output.c b/src/tdm_output.c index 285887e..f4c818b 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -2027,6 +2027,52 @@ tdm_output_get_hwc(tdm_output *output, tdm_error *error) return private_hwc; } +EXTERN tdm_error +tdm_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform) +{ + /* LCOV_EXCL_START */ + tdm_private_module *private_module; + tdm_func_output *func_output; + tdm_private_output *private_src_output; + + OUTPUT_FUNC_ENTRY(); + + TDM_RETURN_VAL_IF_FAIL(src_output != NULL, TDM_ERROR_INVALID_PARAMETER); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_output->private_module; + func_output = &private_module->func_output; + private_src_output = (tdm_private_output*)src_output; + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_MIRROR)) { + TDM_INFO("output(%d) doesn't support the mirror.", private_output->pipe); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + if (!func_output->output_set_mirror) { + TDM_WRN("not implemented!!"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + ret = func_output->output_set_mirror(private_output->output_backend, + private_src_output->output_backend, + transform); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("output(%p) fails to set MIRROR.", private_output); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + _pthread_mutex_unlock(&private_display->lock); + + /* LCOV_EXCL_STOP */ + + return ret; +} + INTERN tdm_error tdm_output_choose_commit_per_vblank_mode(tdm_private_output *private_output, int mode) { -- 2.7.4 From 859f51f8606bff3235d75130635ade4e8a8ce338 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 22 Jul 2019 19:05:27 +0900 Subject: [PATCH 12/16] add tdm_output_unset_mirror This function unset the mirro image of the output. Change-Id: If67805ebf0d54f2097718c4e3dd3d02ed8d0d798 --- include/tdm.h | 8 ++++++++ include/tdm_backend.h | 10 +++++++++- src/tdm_output.c | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/include/tdm.h b/include/tdm.h index 1c10a3c..c334b20 100644 --- a/include/tdm.h +++ b/include/tdm.h @@ -659,6 +659,14 @@ tdm_error tdm_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform); /** + * @brief Unset the mirror + * @param[in] output A output object + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + */ +tdm_error +tdm_output_unset_mirror(tdm_output *output); + +/** * @brief Get a output object of a layer object * @param[in] layer A layer object * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value. diff --git a/include/tdm_backend.h b/include/tdm_backend.h index 4075f7b..f9a1b22 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -569,11 +569,19 @@ typedef struct _tdm_func_output { * @param[in] src_output A src output object of which image is displayed on the output * @param[in] transform A transform value * @return #TDM_ERROR_NONE if success. Otherwise, error value. - * @see #TDM_OUTPUT_CAPABILITY_MIRROR + * @see #output_set_mirror, #TDM_OUTPUT_CAPABILITY_MIRROR */ tdm_error (*output_set_mirror)(tdm_output *output, tdm_output *src_output, tdm_transform transform); + /** + * @brief Unset the mirror image + * @details This function unset the mirro image of the output. + * @param[in] output A output object to display the src_output image + * @return #TDM_ERROR_NONE if success. Otherwise, error value. + * @see #output_set_mirror, #TDM_OUTPUT_CAPABILITY_MIRROR + */ + tdm_error (*output_unset_mirror)(tdm_output *output); void (*reserved4)(void); void (*reserved5)(void); diff --git a/src/tdm_output.c b/src/tdm_output.c index f4c818b..4605183 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -2068,9 +2068,47 @@ tdm_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform _pthread_mutex_unlock(&private_display->lock); + return ret; /* LCOV_EXCL_STOP */ +} + +tdm_error +tdm_output_unset_mirror(tdm_output *output) +{ + /* LCOV_EXCL_START */ + tdm_private_module *private_module; + tdm_func_output *func_output; + + OUTPUT_FUNC_ENTRY(); + + _pthread_mutex_lock(&private_display->lock); + + private_module = private_output->private_module; + func_output = &private_module->func_output; + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_MIRROR)) { + TDM_INFO("output(%d) doesn't support the mirror.", private_output->pipe); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + if (!func_output->output_unset_mirror) { + TDM_WRN("not implemented!!"); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + ret = func_output->output_unset_mirror(private_output->output_backend); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("output(%p) fails to unset MIRROR.", private_output); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_BAD_REQUEST; + } + + _pthread_mutex_unlock(&private_display->lock); return ret; + /* LCOV_EXCL_STOP */ } INTERN tdm_error -- 2.7.4 From 0e348eb06810ffcf9adcf9dfde1479773f1ad3b3 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 22 Jul 2019 09:39:52 +0900 Subject: [PATCH 13/16] Package version up to 2.9.0 Change-Id: I31441b3a819c6586e98ec1f43e0c320eeeb79e42 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 3a9b783..4a0282c 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.8.7 +Version: 2.9.0 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 4869e538e493732eb1ef98322c9091503a1275e4 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 24 Jul 2019 21:27:37 +0900 Subject: [PATCH 14/16] tdm_output: add sync parameter of tdm_output_set_dpms_async if backend wants async function works like sync, tdm backend set the sync parameter. if sync set, the dpms handler will not be called. Change-Id: Ibf0ca0a2a5effef02a6479f77581b54a8ab47401 Signed-off-by: Junkyeong Kim --- include/tdm_backend.h | 3 ++- src/tdm_output.c | 14 +++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/include/tdm_backend.h b/include/tdm_backend.h index f9a1b22..c5e9e8e 100644 --- a/include/tdm_backend.h +++ b/include/tdm_backend.h @@ -544,11 +544,12 @@ typedef struct _tdm_func_output { * #output_set_dpms_handler, a backend module needs to call the output dpms handler * to let the TDM frontend know the output DPMS change indeed. * @param[in] dpms_value DPMS value + * @param[out] sync A flag for sync call * @return #TDM_ERROR_NONE if success. Otherwise, error value. * @see #output_set_dpms_handler, #TDM_OUTPUT_CAPABILITY_ASYNC_DPMS * @since 1.7.0 */ - tdm_error (*output_set_dpms_async)(tdm_output *output, tdm_output_dpms dpms_value); + tdm_error (*output_set_dpms_async)(tdm_output *output, tdm_output_dpms dpms_value, int *sync); /** * @brief Get a hwc object of a output object diff --git a/src/tdm_output.c b/src/tdm_output.c index 4605183..1a0e980 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1817,6 +1817,7 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) { tdm_private_module *private_module; tdm_func_output *func_output; + int sync = 0; OUTPUT_FUNC_ENTRY(); if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_ASYNC_DPMS)) { @@ -1872,11 +1873,18 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) TDM_INFO("output(%d) dpms async '%s'", private_output->pipe, tdm_dpms_str(dpms_value)); - ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value); + ret = func_output->output_set_dpms_async(private_output->output_backend, dpms_value, &sync); if (ret == TDM_ERROR_NONE) { - private_output->waiting_dpms_change = 1; - TDM_INFO("output(%d) dpms async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value)); + if (sync) { + tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF; + + tdm_output_get_dpms_internal(output, &temp); + TDM_INFO("output(%d) dpms async '%s'(%s) done", private_output->pipe, tdm_dpms_str(dpms_value), tdm_dpms_str(temp)); + } else { + private_output->waiting_dpms_change = 1; + TDM_INFO("output(%d) dpms async '%s' waiting", private_output->pipe, tdm_dpms_str(dpms_value)); + } } else { tdm_output_dpms temp = TDM_OUTPUT_DPMS_OFF; -- 2.7.4 From 319dc18780d460662b9ce398def3681f935d5a86 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 29 Jul 2019 15:28:39 +0900 Subject: [PATCH 15/16] haltest: check calloc fail Change-Id: I4395553909638d77b870288938f6436deafbd1f9 Signed-off-by: Junkyeong Kim --- haltests/src/tc_tdm_backend_pp.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/haltests/src/tc_tdm_backend_pp.cpp b/haltests/src/tc_tdm_backend_pp.cpp index f739d96..e1087bc 100644 --- a/haltests/src/tc_tdm_backend_pp.cpp +++ b/haltests/src/tc_tdm_backend_pp.cpp @@ -196,6 +196,7 @@ bool TDMBackendPP::FindLayerUnderPrimary(void) if (tc_tdm_output_is_hwc_enable(output)) { pp_formats = (tbm_format *)calloc(1, sizeof(tbm_format) * 2); + TDM_UT_RETURN_FALSE_IF_FAIL(pp_formats != NULL); pp_formats[0] = TBM_FORMAT_NV12; pp_formats[1] = TBM_FORMAT_YUV420; dst_formats = pp_formats; @@ -239,6 +240,7 @@ bool TDMBackendPP::FindLayerOverPrimary(void) if (tc_tdm_output_is_hwc_enable(output)) { pp_formats = (tbm_format *)calloc(1, sizeof(tbm_format) * 2); + TDM_UT_RETURN_FALSE_IF_FAIL(pp_formats != NULL); pp_formats[0] = TBM_FORMAT_ARGB8888; pp_formats[1] = TBM_FORMAT_XRGB8888; dst_formats = formats; @@ -920,4 +922,4 @@ INSTANTIATE_TEST_CASE_P(TDMBackendPPParams, Values(TDM_DEFAULT_MODULE)); #endif -/* LCOV_EXCL_END */ \ No newline at end of file +/* LCOV_EXCL_END */ -- 2.7.4 From fee81d19147a62944f1cdc834d34cd2d10d62a9e Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 29 Jul 2019 21:31:40 +0900 Subject: [PATCH 16/16] Package version up to 2.9.1 Change-Id: Ia2d03d535a37891931426e763398eca537259370 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 4a0282c..377e7e3 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.9.0 +Version: 2.9.1 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4