1 /**************************************************************************
3 * Copyright 2016 Samsung Electronics co., Ltd. All Rights Reserved.
5 * Contact: Konstantin Drabeniuk <k.drabeniuk@samsung.com>
6 * Contact: Andrii Sokolenko <a.sokolenko@samsung.com>
7 * Contact: Roman Marchenko <r.marchenko@samsung.com>
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the
11 * "Software"), to deal in the Software without restriction, including
12 * without limitation the rights to use, copy, modify, merge, publish,
13 * distribute, sub license, and/or sell copies of the Software, and to
14 * permit persons to whom the Software is furnished to do so, subject to
15 * the following conditions:
17 * The above copyright notice and this permission notice (including the
18 * next paragraph) shall be included in all copies or substantial portions
21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
24 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
25 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
27 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
31 #include "gtest/gtest.h"
33 #include "tbm_bufmgr.h"
34 #include "ut_common.h"
35 #include <sys/epoll.h>
36 #include <sys/timerfd.h>
39 class TDMVblankWithoutCreating: public ::testing::Test {
41 tbm_bufmgr bufmgr = NULL;
42 tdm_display *dpy = NULL;
45 tdm_output *connected_output = NULL;
46 const tdm_output_mode *preferred_mode = NULL;
47 tdm_output *disconnected_output = NULL;
48 tdm_output *default_output = NULL;
52 tdm_output_conn_status status;
53 tdm_error error = TDM_ERROR_NONE;
55 setenv("TDM_DLOG", "1", 1);
56 setenv("XDG_RUNTIME_DIR", "/run", 1);
57 setenv("TBM_DLOG", "1", 1);
58 setenv("TBM_DISPLAY_SERVER", "1", 1);
60 /* FIXME: fix the error. If we initialize TBM before TDM we get fail
61 * in the tdm_output_set_dpms */
63 bufmgr = tbm_bufmgr_init(-1);
64 ASSERT_FALSE(bufmgr == NULL);
67 dpy = tdm_display_init(&error);
68 ASSERT_TRUE(error == TDM_ERROR_NONE);
69 ASSERT_FALSE(dpy == NULL);
71 error = tdm_display_get_output_count(dpy, &output_count);
72 ASSERT_TRUE(error == TDM_ERROR_NONE);
78 for(int i = 0; i < output_count; i++) {
79 output = tdm_display_get_output(dpy, i, &error);
80 ASSERT_TRUE(error == TDM_ERROR_NONE);
81 ASSERT_FALSE(dpy == NULL);
83 error = tdm_output_get_conn_status(output, &status);
84 ASSERT_TRUE(error == TDM_ERROR_NONE);
86 if (status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
87 connected_output = output;
89 disconnected_output = output;
92 default_output = disconnected_output;
94 if (connected_output) {
95 int output_modes_cnt = 0;
96 const tdm_output_mode* output_modes;
98 error = tdm_output_get_available_modes(connected_output, &output_modes, &output_modes_cnt);
99 ASSERT_TRUE(error == TDM_ERROR_NONE);
100 if (output_modes_cnt <= 0) {
101 connected_output = NULL;
105 for(int i = 0; i < output_modes_cnt; i++) {
106 if(output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) {
107 preferred_mode = &output_modes[i];
109 default_output = connected_output;
116 connected_output = NULL;
120 if (connected_output)
121 tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
123 tbm_bufmgr_deinit(bufmgr);
125 tdm_display_deinit(dpy);
132 class TDMVblank: public TDMVblankWithoutCreating {
134 tdm_vblank *con_output_vblank = NULL;
135 tdm_vblank *discon_output_vblank = NULL;
136 tdm_output *default_vblank = NULL;
137 int setModeAndDpms = 0;
138 tbm_surface_h buffer = NULL;
139 tdm_layer *layer = NULL;
145 ASSERT_NO_FATAL_FAILURE(TDMVblankWithoutCreating::SetUp());
147 if (connected_output && setModeAndDpms) {
149 tdm_info_layer info = {0};
151 error = tdm_output_set_mode(connected_output, preferred_mode);
152 ASSERT_TRUE(error == TDM_ERROR_NONE);
154 error = tdm_output_get_primary_index(connected_output, &primary_index);
155 ASSERT_TRUE(error == TDM_ERROR_NONE);
157 layer = tdm_output_get_layer(connected_output, primary_index, &error);
158 ASSERT_TRUE(error == TDM_ERROR_NONE);
159 ASSERT_TRUE(layer != NULL);
161 info.src_config.size.h = preferred_mode->hdisplay;
162 info.src_config.size.v = preferred_mode->vdisplay;
163 info.src_config.pos.x = 0;
164 info.src_config.pos.y = 0;
165 info.src_config.pos.w = preferred_mode->hdisplay;
166 info.src_config.pos.h = preferred_mode->vdisplay;
167 info.src_config.format = TBM_FORMAT_ARGB8888;
170 info.dst_pos.w = preferred_mode->hdisplay;
171 info.dst_pos.h = preferred_mode->vdisplay;
172 info.transform = TDM_TRANSFORM_NORMAL;
174 error = tdm_layer_set_info(layer, &info);
175 ASSERT_TRUE(error == TDM_ERROR_NONE);
177 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
178 ASSERT_TRUE(error == TDM_ERROR_NONE);
180 buffer = tbm_surface_internal_create_with_flags(preferred_mode->hdisplay,
181 preferred_mode->vdisplay,
184 ASSERT_TRUE(buffer != NULL);
186 error = tdm_layer_set_buffer(layer, buffer);
187 ASSERT_TRUE(error == TDM_ERROR_NONE);
189 error = tdm_output_commit(connected_output, 0, NULL, NULL);
190 ASSERT_TRUE(error == TDM_ERROR_NONE);
191 /* TODO: use a commit handler instead of an usleep to wait when
192 * commit will be applied */
196 if (disconnected_output) {
197 discon_output_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
198 EXPECT_TRUE(discon_output_vblank != NULL);
199 EXPECT_TRUE(error == TDM_ERROR_NONE);
200 default_vblank = discon_output_vblank;
203 if (connected_output) {
204 con_output_vblank = tdm_vblank_create(dpy, connected_output, &error);
205 EXPECT_TRUE(con_output_vblank != NULL);
206 EXPECT_TRUE(error == TDM_ERROR_NONE);
207 default_vblank = con_output_vblank;
210 ASSERT_TRUE(default_vblank != NULL);
216 tdm_layer_unset_buffer(layer);
217 tdm_output_commit(connected_output, 0, NULL, NULL);
218 tbm_surface_destroy(buffer);
221 TDMVblankWithoutCreating::TearDown();
225 class TDMVblankWait : public TDMVblank {
227 static int utVblankHandlerIsCalled;
228 static void UtVblankHandler(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
229 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
231 int *data = (int *)user_data;
236 utVblankHandlerIsCalled = 1;
238 int utWaitVblankThreadHndlResult = -1;
239 friend void *UtWaitVblankThreadHndl(void *ptr);
240 int utWaitVblankSeqThreadHndlResult = -1;
241 friend void *UtWaitVblankSeqThreadHndl(void *ptr);
247 static const int timeLimitSec = 1;
252 struct epoll_event ep;
254 utVblankHandlerIsCalled = 0;
258 ASSERT_NO_FATAL_FAILURE(TDMVblank::SetUp());
260 epFd = epoll_create1(0);
261 ASSERT_TRUE(epFd != -1);
263 timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
264 ASSERT_TRUE(timerFd != -1);
266 memset(&ep, 0, sizeof ep);
267 ep.events |= EPOLLIN;
268 ep.data.fd = timerFd;
269 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ep) == 0);
271 ASSERT_TRUE(tdm_display_get_fd(dpy, &tdmFd) == TDM_ERROR_NONE);
273 memset(&ep, 0, sizeof ep);
274 ep.events |= EPOLLIN;
276 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, tdmFd, &ep) == 0);
279 void UtHandleVblankEvent()
281 struct itimerspec its;
283 struct epoll_event ep_event[2];
285 if (utVblankHandlerIsCalled)
288 its.it_interval.tv_sec = 0;
289 its.it_interval.tv_nsec = 0;
290 its.it_value.tv_sec = timeLimitSec;
291 its.it_value.tv_nsec = 0;
293 ASSERT_TRUE(timerfd_settime(timerFd, 0, &its, NULL) == 0);
296 count = epoll_wait(epFd, ep_event, sizeof(ep_event), -1);
297 ASSERT_TRUE(count >= 0);
299 for (int i = 0; i < count; i++) {
300 if (ep_event[i].data.fd == timerFd) {
303 ASSERT_TRUE(tdm_display_handle_events(dpy) == TDM_ERROR_NONE);
304 if (utVblankHandlerIsCalled)
312 class TDMVblankWaitThread : public TDMVblankWait {
316 setenv("TDM_THREAD", "1", 1);
317 ASSERT_NO_FATAL_FAILURE(TDMVblankWait::SetUp());
321 int TDMVblankWait::utVblankHandlerIsCalled = 0;
323 /* tdm_vblank_enable_global_fps() */
325 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpFailFpsNull)
327 tdm_error error = TDM_ERROR_BAD_MODULE;
329 SKIP_FLAG(has_output);
330 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 0);
331 if (error == TDM_ERROR_NONE)
334 ::testing::ExitedWithCode(0), "");
337 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessEnable)
339 tdm_error error = TDM_ERROR_BAD_MODULE;
341 SKIP_FLAG(has_output);
342 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 60);
343 if (error != TDM_ERROR_NONE)
346 ::testing::ExitedWithCode(0), "");
349 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessDisable)
351 tdm_error error = TDM_ERROR_BAD_MODULE;
353 SKIP_FLAG(has_output);
354 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(0, 0);
355 if (error != TDM_ERROR_NONE)
358 ::testing::ExitedWithCode(0), "");
361 /* tdm_vblank_create() */
363 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullAll)
365 tdm_vblank *ret_vblank;
367 SKIP_FLAG(has_output);
369 ret_vblank = tdm_vblank_create(NULL, NULL, NULL);
370 ASSERT_TRUE(ret_vblank == NULL);
373 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullDpy)
375 tdm_vblank *ret_vblank;
378 SKIP_FLAG(has_output);
380 ret_vblank = tdm_vblank_create(NULL, default_output, &error);
381 ASSERT_TRUE(ret_vblank == NULL);
382 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
385 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullOutput)
387 tdm_vblank *ret_vblank;
390 SKIP_FLAG(has_output);
392 ret_vblank = tdm_vblank_create(dpy, NULL, &error);
393 ASSERT_TRUE(ret_vblank == NULL);
394 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
397 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongDpy)
399 tdm_vblank *ret_vblank = NULL;
402 SKIP_FLAG(has_output);
404 ASSERT_EXIT({ret_vblank = tdm_vblank_create((tdm_display *)0xFFFFFFFF, default_output, &error);
405 if (ret_vblank || error == TDM_ERROR_NONE)
409 ::testing::ExitedWithCode(0), "");
412 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongOutput)
414 tdm_vblank *ret_vblank = NULL;
417 SKIP_FLAG(has_output);
419 ASSERT_EXIT({ret_vblank = tdm_vblank_create(dpy, (tdm_output *)0xFFFFFFFF, &error);
420 if (ret_vblank || error == TDM_ERROR_NONE)
424 ::testing::ExitedWithCode(0), "");
427 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForConnectedOutput)
429 tdm_vblank *ret_vblank;
432 SKIP_FLAG(has_output);
434 if (!connected_output)
437 ret_vblank = tdm_vblank_create(dpy, connected_output, &error);
438 ASSERT_TRUE(ret_vblank != NULL);
439 ASSERT_TRUE(error == TDM_ERROR_NONE);
442 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForDisconnectedOutput)
444 tdm_vblank *ret_vblank;
447 SKIP_FLAG(has_output);
449 if (!disconnected_output)
452 ret_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
453 ASSERT_TRUE(ret_vblank != NULL);
454 ASSERT_TRUE(error == TDM_ERROR_NONE);
457 /* tdm_vblank_destroy() */
459 TEST_F(TDMVblank, VblankDestroyWrongVblankPtr)
461 SKIP_FLAG(has_output);
463 ASSERT_EXIT({tdm_vblank_destroy((tdm_vblank *)0xFFFFFFFF); exit(0);},
464 ::testing::ExitedWithCode(0), "");
467 TEST_F(TDMVblank, VblankDestroySuccess)
470 SKIP_FLAG(has_output);
472 tdm_vblank_destroy(con_output_vblank);
474 error = tdm_vblank_set_enable_fake(default_vblank, 1);
475 ASSERT_TRUE(error != TDM_ERROR_NONE);
478 /* tdm_vblank_set_name() */
480 TEST_F(TDMVblank, VblankSetNameFailNullAll)
483 SKIP_FLAG(has_output);
485 error = tdm_vblank_set_name(NULL, NULL);
486 ASSERT_TRUE(error != TDM_ERROR_NONE);
489 TEST_F(TDMVblank, VblankSetNameFailWrongVblankPtr)
491 tdm_error error = TDM_ERROR_BAD_MODULE;
493 SKIP_FLAG(has_output);
495 ASSERT_EXIT({error = tdm_vblank_set_name((tdm_vblank *)0xFFFFFFFF, "ut_vblank");
496 if (error == TDM_ERROR_NONE)
500 ::testing::ExitedWithCode(0), "");
503 TEST_F(TDMVblank, VblankSetNameSuccess)
506 SKIP_FLAG(has_output);
508 error = tdm_vblank_set_name(default_vblank, "ut_vblank");
509 ASSERT_TRUE(error == TDM_ERROR_NONE);
512 TEST_F(TDMVblank, VblankSetNameSuccessNullName)
515 SKIP_FLAG(has_output);
517 error = tdm_vblank_set_name(default_vblank, NULL);
518 ASSERT_TRUE(error == TDM_ERROR_NONE);
521 /* tdm_vblank_get_name() */
523 TEST_F(TDMVblank, VblankGetNameFailNullAll)
526 SKIP_FLAG(has_output);
528 error = tdm_vblank_get_name(NULL, NULL);
529 ASSERT_TRUE(error != TDM_ERROR_NONE);
532 TEST_F(TDMVblank, VblankGetNameFailNullVblank)
535 const char *ret_name;
536 SKIP_FLAG(has_output);
538 error = tdm_vblank_get_name(NULL, &ret_name);
539 ASSERT_TRUE(error != TDM_ERROR_NONE);
542 TEST_F(TDMVblank, VblankGetNameFailWrongVblankPtr)
544 tdm_error error = TDM_ERROR_BAD_MODULE;
545 const char *ret_name;
547 SKIP_FLAG(has_output);
549 ASSERT_EXIT({error = tdm_vblank_get_name((tdm_vblank *)0xFFFFFFFF, &ret_name);
550 if (error == TDM_ERROR_NONE)
554 ::testing::ExitedWithCode(0), "");
557 TEST_F(TDMVblank, VblankGetNameFailNullName)
560 SKIP_FLAG(has_output);
562 error = tdm_vblank_get_name(default_vblank, NULL);
563 ASSERT_TRUE(error != TDM_ERROR_NONE);
566 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetName)
569 const char *ret_name;
570 SKIP_FLAG(has_output);
572 error = tdm_vblank_get_name(default_vblank, &ret_name);
573 ASSERT_TRUE(error == TDM_ERROR_NONE);
576 TEST_F(TDMVblank, VblankGetNameSuccess)
579 const char *ret_name;
580 SKIP_FLAG(has_output);
581 const char *set_name = "ut_vblank";
583 error = tdm_vblank_set_name(default_vblank, set_name);
584 ASSERT_TRUE(error == TDM_ERROR_NONE);
586 error = tdm_vblank_get_name(default_vblank, &ret_name);
587 ASSERT_TRUE(error == TDM_ERROR_NONE);
589 ASSERT_STREQ(set_name, ret_name);
592 /* tdm_vblank_set_fps() */
594 TEST_F(TDMVblank, VblankSetFpsFailNullVblank)
597 SKIP_FLAG(has_output);
599 error = tdm_vblank_set_fps(NULL, 10);
600 ASSERT_TRUE(error != TDM_ERROR_NONE);
603 TEST_F(TDMVblank, VblankSetFpsFailFpsNull)
606 SKIP_FLAG(has_output);
608 error = tdm_vblank_set_fps(default_vblank, 0);
609 ASSERT_TRUE(error != TDM_ERROR_NONE);
612 TEST_F(TDMVblank, VblankSetFpsFailWrongVblankPtr)
614 tdm_error error = TDM_ERROR_BAD_MODULE;
616 SKIP_FLAG(has_output);
618 ASSERT_EXIT({error = tdm_vblank_set_fps((tdm_vblank *)0xFFFFFFFF, 60);
619 if (error == TDM_ERROR_NONE)
623 ::testing::ExitedWithCode(0), "");
626 TEST_F(TDMVblank, VblankSetFpsSuccess)
629 SKIP_FLAG(has_output);
631 error = tdm_vblank_set_fps(default_vblank, 60);
632 ASSERT_TRUE(error == TDM_ERROR_NONE);
635 TEST_F(TDMVblank, VblankSetFpsSuccessSetTwice)
638 SKIP_FLAG(has_output);
640 error = tdm_vblank_set_fps(default_vblank, 60);
641 ASSERT_TRUE(error == TDM_ERROR_NONE);
643 error = tdm_vblank_set_fps(default_vblank, 60);
644 ASSERT_TRUE(error == TDM_ERROR_NONE);
647 /* tdm_vblank_get_fps() */
649 TEST_F(TDMVblank, VblankGetFpsFailNullAll)
652 SKIP_FLAG(has_output);
654 error = tdm_vblank_get_fps(NULL, NULL);
655 ASSERT_TRUE(error != TDM_ERROR_NONE);
658 TEST_F(TDMVblank, VblankGetFpsFailNullVblank)
661 unsigned int ret_fps;
662 SKIP_FLAG(has_output);
664 error = tdm_vblank_get_fps(NULL, &ret_fps);
665 ASSERT_TRUE(error != TDM_ERROR_NONE);
668 TEST_F(TDMVblank, VblankGetFpsFailNullFps)
671 SKIP_FLAG(has_output);
673 error = tdm_vblank_get_fps(default_vblank, NULL);
674 ASSERT_TRUE(error != TDM_ERROR_NONE);
677 TEST_F(TDMVblank, VblankGetFpsFailWrongVblankPtr)
679 tdm_error error = TDM_ERROR_BAD_MODULE;
680 unsigned int ret_fps;
682 SKIP_FLAG(has_output);
684 ASSERT_EXIT({error = tdm_vblank_get_fps((tdm_vblank *)0xFFFFFFFF, &ret_fps);
685 if (error == TDM_ERROR_NONE)
689 ::testing::ExitedWithCode(0), "");
692 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetFps)
695 unsigned int ret_fps;
696 SKIP_FLAG(has_output);
698 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
699 ASSERT_TRUE(error == TDM_ERROR_NONE);
702 TEST_F(TDMVblank, VblankGetFpsSuccess)
705 unsigned int ret_fps = 10;
706 SKIP_FLAG(has_output);
707 unsigned int set_fps = 50;
709 error = tdm_vblank_set_fps(default_vblank, set_fps);
710 ASSERT_TRUE(error == TDM_ERROR_NONE);
712 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
713 ASSERT_TRUE(error == TDM_ERROR_NONE);
715 ASSERT_TRUE(set_fps == ret_fps);
718 /* tdm_vblank_ignore_global_fps() */
720 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailNullVblank)
723 SKIP_FLAG(has_output);
725 error = tdm_vblank_ignore_global_fps(NULL, 1);
726 ASSERT_TRUE(error != TDM_ERROR_NONE);
729 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailWrongVblankPtr)
731 tdm_error error = TDM_ERROR_BAD_MODULE;
733 SKIP_FLAG(has_output);
735 ASSERT_EXIT({error = tdm_vblank_ignore_global_fps((tdm_vblank *)0xFFFFFFFF, 1);
736 if (error == TDM_ERROR_NONE)
740 ::testing::ExitedWithCode(0), "");
743 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnset)
746 SKIP_FLAG(has_output);
748 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
749 ASSERT_TRUE(error == TDM_ERROR_NONE);
752 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnsetTwice)
755 SKIP_FLAG(has_output);
757 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
758 ASSERT_TRUE(error == TDM_ERROR_NONE);
760 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
761 ASSERT_TRUE(error == TDM_ERROR_NONE);
764 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSet)
767 SKIP_FLAG(has_output);
769 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
770 ASSERT_TRUE(error == TDM_ERROR_NONE);
773 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSetTwice)
776 SKIP_FLAG(has_output);
778 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
779 ASSERT_TRUE(error == TDM_ERROR_NONE);
781 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
782 ASSERT_TRUE(error == TDM_ERROR_NONE);
785 /* tdm_vblank_set_offset() */
787 TEST_F(TDMVblank, VblankSetOffsetFailNullVblank)
790 SKIP_FLAG(has_output);
792 error = tdm_vblank_set_offset(NULL, 10);
793 ASSERT_TRUE(error != TDM_ERROR_NONE);
796 TEST_F(TDMVblank, VblankSetOffsetFailFailWrongVblankPtr)
798 tdm_error error = TDM_ERROR_BAD_MODULE;
800 SKIP_FLAG(has_output);
802 ASSERT_EXIT({error = tdm_vblank_set_offset((tdm_vblank *)0xFFFFFFFF, 10);
803 if (error == TDM_ERROR_NONE)
807 ::testing::ExitedWithCode(0), "");
810 TEST_F(TDMVblank, VblankSetOffsetSuccess)
813 SKIP_FLAG(has_output);
815 error = tdm_vblank_set_offset(default_vblank, 50);
816 ASSERT_TRUE(error == TDM_ERROR_NONE);
819 TEST_F(TDMVblank, VblankSetOffsetSuccessSuccessSetTwice)
822 SKIP_FLAG(has_output);
824 error = tdm_vblank_set_offset(default_vblank, 50);
825 ASSERT_TRUE(error == TDM_ERROR_NONE);
827 error = tdm_vblank_set_offset(default_vblank, 50);
828 ASSERT_TRUE(error == TDM_ERROR_NONE);
831 /* tdm_vblank_get_offset() */
833 TEST_F(TDMVblank, VblankGetOffsetFailNullAll)
836 SKIP_FLAG(has_output);
838 error = tdm_vblank_get_offset(NULL, NULL);
839 ASSERT_TRUE(error != TDM_ERROR_NONE);
842 TEST_F(TDMVblank, VblankGetOffsetFailNullVblank)
846 SKIP_FLAG(has_output);
848 error = tdm_vblank_get_offset(NULL, &offset);
849 ASSERT_TRUE(error != TDM_ERROR_NONE);
852 TEST_F(TDMVblank, VblankGetOffsetFailNullOffset)
855 SKIP_FLAG(has_output);
857 error = tdm_vblank_get_offset(default_vblank, NULL);
858 ASSERT_TRUE(error != TDM_ERROR_NONE);
861 TEST_F(TDMVblank, VblankGetOffsetFailWrongVblankPtr)
863 tdm_error error = TDM_ERROR_BAD_MODULE;
865 SKIP_FLAG(has_output);
867 ASSERT_EXIT({error = tdm_vblank_get_offset((tdm_vblank *)0xFFFFFFFF, &offset);
868 if (error == TDM_ERROR_NONE)
872 ::testing::ExitedWithCode(0), "");
875 TEST_F(TDMVblank, VblankGetOffsetSuccesWithoutSet)
880 SKIP_FLAG(has_output);
882 error = tdm_vblank_get_offset(default_vblank, &offset);
883 ASSERT_TRUE(error == TDM_ERROR_NONE);
886 TEST_F(TDMVblank, VblankGetOffsetSucces)
889 int set_offset = 567;
892 SKIP_FLAG(has_output);
894 error = tdm_vblank_set_offset(default_vblank, set_offset);
895 ASSERT_TRUE(error == TDM_ERROR_NONE);
897 error = tdm_vblank_get_offset(default_vblank, &ret_offset);
898 ASSERT_TRUE(error == TDM_ERROR_NONE);
900 ASSERT_TRUE(set_offset == ret_offset);
903 /* tdm_vblank_set_enable_fake() */
905 TEST_F(TDMVblank, VblankSetEnableFakeFailNullVblank)
908 SKIP_FLAG(has_output);
910 error = tdm_vblank_set_enable_fake(NULL, 1);
911 ASSERT_TRUE(error != TDM_ERROR_NONE);
914 TEST_F(TDMVblank, VblankSetEnableFakeFailFailWrongVblankPtr)
916 tdm_error error = TDM_ERROR_BAD_MODULE;
918 SKIP_FLAG(has_output);
920 ASSERT_EXIT({error = tdm_vblank_set_enable_fake((tdm_vblank *)0xFFFFFFFF, 1);
921 if (error == TDM_ERROR_NONE)
925 ::testing::ExitedWithCode(0), "");
928 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSet)
931 SKIP_FLAG(has_output);
933 error = tdm_vblank_set_enable_fake(default_vblank, 1);
934 ASSERT_TRUE(error == TDM_ERROR_NONE);
937 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSetTwice)
940 SKIP_FLAG(has_output);
942 error = tdm_vblank_set_enable_fake(default_vblank, 1);
943 ASSERT_TRUE(error == TDM_ERROR_NONE);
945 error = tdm_vblank_set_enable_fake(default_vblank, 1);
946 ASSERT_TRUE(error == TDM_ERROR_NONE);
949 /* tdm_vblank_get_enable_fake() */
951 TEST_F(TDMVblank, VblankGetEnableFakeFailNullAll)
954 SKIP_FLAG(has_output);
956 error = tdm_vblank_get_enable_fake(NULL, NULL);
957 ASSERT_TRUE(error != TDM_ERROR_NONE);
960 TEST_F(TDMVblank, VblankGetEnableFakeFailNullVblank)
963 unsigned int enable_fake;
964 SKIP_FLAG(has_output);
966 error = tdm_vblank_get_enable_fake(NULL, &enable_fake);
967 ASSERT_TRUE(error != TDM_ERROR_NONE);
970 TEST_F(TDMVblank, VblankGetEnableFakeFailNullEnableFake)
973 SKIP_FLAG(has_output);
975 error = tdm_vblank_get_enable_fake(default_vblank, NULL);
976 ASSERT_TRUE(error != TDM_ERROR_NONE);
979 TEST_F(TDMVblank, VblankGetEnableFakeFailWrongVblankPtr)
981 tdm_error error = TDM_ERROR_BAD_MODULE;
982 unsigned int enable_fake;
983 SKIP_FLAG(has_output);
985 ASSERT_EXIT({error = tdm_vblank_get_enable_fake((tdm_vblank *)0xFFFFFFFF, &enable_fake);
986 if (error == TDM_ERROR_NONE)
990 ::testing::ExitedWithCode(0), "");
993 TEST_F(TDMVblank, VblankGetEnableFakeSuccessWithoutSet)
996 unsigned int enable_fake;
998 SKIP_FLAG(has_output);
1000 error = tdm_vblank_get_enable_fake(default_vblank, &enable_fake);
1001 ASSERT_TRUE(error == TDM_ERROR_NONE);
1004 TEST_F(TDMVblank, VblankGetEnableFakeSuccess)
1007 unsigned int set_enable_fake = 1;
1008 unsigned int ret_enable_fake;
1010 SKIP_FLAG(has_output);
1012 error = tdm_vblank_set_enable_fake(default_vblank, set_enable_fake);
1013 ASSERT_TRUE(error == TDM_ERROR_NONE);
1015 error = tdm_vblank_get_enable_fake(default_vblank, &ret_enable_fake);
1016 ASSERT_TRUE(error == TDM_ERROR_NONE);
1018 ASSERT_TRUE(set_enable_fake == ret_enable_fake);
1021 /* tdm_vblank_set_client_vblank_fps() */
1023 /* TODO: need to create the tdm client */
1024 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullAll)
1028 SKIP_FLAG(has_output);
1030 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1031 ASSERT_TRUE(error != TDM_ERROR_NONE);
1034 /* TODO: need to create the tdm client */
1035 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullPid)
1039 SKIP_FLAG(has_output);
1041 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1042 ASSERT_TRUE(error != TDM_ERROR_NONE);
1045 /* tdm_vblank_wait() */
1047 TEST_F(TDMVblank, VblankWaitFailNullAll)
1051 SKIP_FLAG(has_output);
1053 error = tdm_vblank_wait(NULL, 0, 0, 0, NULL, NULL);
1054 ASSERT_TRUE(error != TDM_ERROR_NONE);
1057 TEST_F(TDMVblankWait, VblankWaitFailNullVblank)
1061 SKIP_FLAG(has_output);
1063 error = tdm_vblank_wait(NULL, 0, 0, 1, UtVblankHandler, NULL);
1064 ASSERT_TRUE(error != TDM_ERROR_NONE);
1067 TEST_F(TDMVblankWait, VblankWaitFailNullFunc)
1071 SKIP_FLAG(has_output);
1073 error = tdm_vblank_wait(default_vblank, 0, 0, 1, NULL, NULL);
1074 ASSERT_TRUE(error != TDM_ERROR_NONE);
1077 TEST_F(TDMVblankWait, VblankWaitFailWrongVblankPtr)
1079 tdm_error error = TDM_ERROR_BAD_MODULE;
1080 SKIP_FLAG(has_output);
1082 ASSERT_EXIT({error = tdm_vblank_wait((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1083 if (error == TDM_ERROR_NONE)
1087 ::testing::ExitedWithCode(0), "");
1090 void *UtWaitVblankThreadHndl(void *ptr)
1093 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1095 error = tdm_vblank_wait(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1096 if (error != TDM_ERROR_NONE)
1097 vblankWait->utWaitVblankThreadHndlResult = 0;
1099 vblankWait->utWaitVblankThreadHndlResult = 1;
1104 TEST_F(TDMVblankWait, VblankWaitFailInOtherThread)
1106 pthread_t thread = 0;
1108 SKIP_FLAG(has_output);
1110 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankThreadHndl, this));
1112 ASSERT_FALSE(pthread_join(thread, NULL));
1114 ASSERT_FALSE(utWaitVblankThreadHndlResult);
1117 TEST_F(TDMVblankWait, VblankWaitFailDisconnectedOutput)
1121 SKIP_FLAG(has_output);
1123 if (!discon_output_vblank)
1126 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1127 ASSERT_TRUE(error != TDM_ERROR_NONE);
1130 TEST_F(TDMVblankWait, VblankWaitFailDpmsOff)
1134 SKIP_FLAG(has_output);
1136 if (!con_output_vblank)
1139 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1140 ASSERT_TRUE(error == TDM_ERROR_NONE);
1142 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1143 ASSERT_TRUE(error != TDM_ERROR_NONE);
1146 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefresh)
1151 SKIP_FLAG(has_output);
1153 if (!con_output_vblank)
1156 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1157 ASSERT_TRUE(error == TDM_ERROR_NONE);
1159 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1160 ASSERT_TRUE(error == TDM_ERROR_NONE);
1162 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1163 ASSERT_TRUE(error == TDM_ERROR_NONE);
1165 UtHandleVblankEvent();
1167 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1168 ASSERT_TRUE(data == 1);
1171 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1176 SKIP_FLAG(has_output);
1178 if (!con_output_vblank)
1181 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1182 ASSERT_TRUE(error == TDM_ERROR_NONE);
1184 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1185 ASSERT_TRUE(error == TDM_ERROR_NONE);
1187 for (int i = 0; i < 10; ++i) {
1188 utVblankHandlerIsCalled = 0;
1191 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1192 ASSERT_TRUE(error == TDM_ERROR_NONE);
1194 UtHandleVblankEvent();
1196 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1197 ASSERT_TRUE(data == 1);
1201 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutput)
1206 SKIP_FLAG(has_output);
1208 if (!discon_output_vblank)
1211 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1212 ASSERT_TRUE(error == TDM_ERROR_NONE);
1214 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1215 ASSERT_TRUE(error == TDM_ERROR_NONE);
1217 UtHandleVblankEvent();
1219 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1220 ASSERT_TRUE(data == 1);
1223 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutputRepeatedly)
1228 SKIP_FLAG(has_output);
1230 if (!discon_output_vblank)
1233 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1234 ASSERT_TRUE(error == TDM_ERROR_NONE);
1236 for (int i = 0; i < 10; ++i) {
1237 utVblankHandlerIsCalled = 0;
1240 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1241 ASSERT_TRUE(error == TDM_ERROR_NONE);
1243 UtHandleVblankEvent();
1245 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1246 ASSERT_TRUE(data == 1);
1250 TEST_F(TDMVblankWait, VblankWaitSuccessHW)
1255 SKIP_FLAG(has_output);
1257 if (!con_output_vblank)
1260 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1261 ASSERT_TRUE(error == TDM_ERROR_NONE);
1263 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1264 ASSERT_TRUE(error == TDM_ERROR_NONE);
1266 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1267 ASSERT_TRUE(error == TDM_ERROR_NONE);
1269 error = tdm_vblank_set_offset(con_output_vblank, 0);
1270 ASSERT_TRUE(error == TDM_ERROR_NONE);
1272 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1273 ASSERT_TRUE(error == TDM_ERROR_NONE);
1275 UtHandleVblankEvent();
1277 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1278 ASSERT_TRUE(data == 1);
1281 TEST_F(TDMVblankWait, VblankWaitSuccessDestroy)
1286 SKIP_FLAG(has_output);
1288 if (!con_output_vblank)
1291 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1292 ASSERT_TRUE(error == TDM_ERROR_NONE);
1294 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1295 ASSERT_TRUE(error == TDM_ERROR_NONE);
1297 error = tdm_vblank_set_offset(con_output_vblank, 0);
1298 ASSERT_TRUE(error == TDM_ERROR_NONE);
1300 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1301 ASSERT_TRUE(error == TDM_ERROR_NONE);
1303 tdm_vblank_destroy(con_output_vblank);
1305 ASSERT_TRUE(utVblankHandlerIsCalled == 0);
1306 ASSERT_TRUE(data == 0);
1309 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpms)
1314 SKIP_FLAG(has_output);
1316 if (!con_output_vblank)
1319 error = tdm_vblank_set_enable_fake(con_output_vblank, 0);
1320 ASSERT_TRUE(error == TDM_ERROR_NONE);
1322 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1323 ASSERT_TRUE(error == TDM_ERROR_NONE);
1325 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1326 ASSERT_TRUE(error == TDM_ERROR_NONE);
1328 error = tdm_vblank_set_offset(con_output_vblank, 0);
1329 ASSERT_TRUE(error == TDM_ERROR_NONE);
1331 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1332 ASSERT_TRUE(error == TDM_ERROR_NONE);
1334 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1335 ASSERT_TRUE(error == TDM_ERROR_NONE);
1337 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1338 ASSERT_TRUE(data == 1);
1341 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpmsWithEnableFake)
1346 SKIP_FLAG(has_output);
1348 if (!con_output_vblank)
1351 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1352 ASSERT_TRUE(error == TDM_ERROR_NONE);
1354 error = tdm_vblank_set_enable_fake(con_output_vblank, 1);
1355 ASSERT_TRUE(error == TDM_ERROR_NONE);
1357 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1358 ASSERT_TRUE(error == TDM_ERROR_NONE);
1360 error = tdm_vblank_set_offset(con_output_vblank, 0);
1361 ASSERT_TRUE(error == TDM_ERROR_NONE);
1363 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1364 ASSERT_TRUE(error == TDM_ERROR_NONE);
1366 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1367 ASSERT_TRUE(error == TDM_ERROR_NONE);
1369 UtHandleVblankEvent();
1371 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1372 ASSERT_TRUE(data == 1);
1375 TEST_F(TDMVblankWait, VblankWaitSuccessHWRepeatedly)
1380 SKIP_FLAG(has_output);
1382 if (!con_output_vblank)
1385 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1386 ASSERT_TRUE(error == TDM_ERROR_NONE);
1388 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1389 ASSERT_TRUE(error == TDM_ERROR_NONE);
1391 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1392 ASSERT_TRUE(error == TDM_ERROR_NONE);
1394 error = tdm_vblank_set_offset(con_output_vblank, 0);
1395 ASSERT_TRUE(error == TDM_ERROR_NONE);
1397 for (int i = 0; i < 10; ++i) {
1398 utVblankHandlerIsCalled = 0;
1401 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1402 ASSERT_TRUE(error == TDM_ERROR_NONE);
1404 UtHandleVblankEvent();
1406 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1407 ASSERT_TRUE(data == 1);
1411 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZero)
1416 SKIP_FLAG(has_output);
1418 if (!con_output_vblank)
1421 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1422 ASSERT_TRUE(error == TDM_ERROR_NONE);
1424 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1425 ASSERT_TRUE(error == TDM_ERROR_NONE);
1427 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1428 ASSERT_TRUE(error == TDM_ERROR_NONE);
1430 error = tdm_vblank_set_offset(con_output_vblank, 10);
1431 ASSERT_TRUE(error == TDM_ERROR_NONE);
1433 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1434 ASSERT_TRUE(error == TDM_ERROR_NONE);
1436 UtHandleVblankEvent();
1438 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1439 ASSERT_TRUE(data == 1);
1442 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1447 SKIP_FLAG(has_output);
1449 if (!con_output_vblank)
1452 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1453 ASSERT_TRUE(error == TDM_ERROR_NONE);
1455 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1456 ASSERT_TRUE(error == TDM_ERROR_NONE);
1458 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1459 ASSERT_TRUE(error == TDM_ERROR_NONE);
1461 error = tdm_vblank_set_offset(con_output_vblank, 10);
1462 ASSERT_TRUE(error == TDM_ERROR_NONE);
1464 for (int i = 0; i < 10; ++i) {
1465 utVblankHandlerIsCalled = 0;
1468 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1469 ASSERT_TRUE(error == TDM_ERROR_NONE);
1471 UtHandleVblankEvent();
1473 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1474 ASSERT_TRUE(data == 1);
1478 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefresh)
1483 SKIP_FLAG(has_output);
1485 if (!con_output_vblank)
1488 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1489 ASSERT_TRUE(error == TDM_ERROR_NONE);
1491 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1492 ASSERT_TRUE(error == TDM_ERROR_NONE);
1494 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1495 ASSERT_TRUE(error == TDM_ERROR_NONE);
1497 UtHandleVblankEvent();
1499 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1500 ASSERT_TRUE(data == 1);
1503 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1508 SKIP_FLAG(has_output);
1510 if (!con_output_vblank)
1513 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1514 ASSERT_TRUE(error == TDM_ERROR_NONE);
1516 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1517 ASSERT_TRUE(error == TDM_ERROR_NONE);
1519 for (int i = 0; i < 10; ++i) {
1520 utVblankHandlerIsCalled = 0;
1523 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1524 ASSERT_TRUE(error == TDM_ERROR_NONE);
1526 UtHandleVblankEvent();
1528 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1529 ASSERT_TRUE(data == 1);
1533 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutput)
1538 SKIP_FLAG(has_output);
1540 if (!discon_output_vblank)
1543 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1544 ASSERT_TRUE(error == TDM_ERROR_NONE);
1546 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1547 ASSERT_TRUE(error == TDM_ERROR_NONE);
1549 UtHandleVblankEvent();
1551 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1552 ASSERT_TRUE(data == 1);
1555 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutputRepeatedly)
1560 SKIP_FLAG(has_output);
1562 if (!discon_output_vblank)
1565 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1566 ASSERT_TRUE(error == TDM_ERROR_NONE);
1568 for (int i = 0; i < 10; ++i) {
1569 utVblankHandlerIsCalled = 0;
1572 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1573 ASSERT_TRUE(error == TDM_ERROR_NONE);
1575 UtHandleVblankEvent();
1577 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1578 ASSERT_TRUE(data == 1);
1582 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHW)
1587 SKIP_FLAG(has_output);
1589 if (!con_output_vblank)
1592 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1593 ASSERT_TRUE(error == TDM_ERROR_NONE);
1595 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1596 ASSERT_TRUE(error == TDM_ERROR_NONE);
1598 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1599 ASSERT_TRUE(error == TDM_ERROR_NONE);
1601 error = tdm_vblank_set_offset(con_output_vblank, 0);
1602 ASSERT_TRUE(error == TDM_ERROR_NONE);
1604 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1605 ASSERT_TRUE(error == TDM_ERROR_NONE);
1607 UtHandleVblankEvent();
1609 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1610 ASSERT_TRUE(data == 1);
1613 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHWRepeatedly)
1618 SKIP_FLAG(has_output);
1620 if (!con_output_vblank)
1623 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1624 ASSERT_TRUE(error == TDM_ERROR_NONE);
1626 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1627 ASSERT_TRUE(error == TDM_ERROR_NONE);
1629 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1630 ASSERT_TRUE(error == TDM_ERROR_NONE);
1632 error = tdm_vblank_set_offset(con_output_vblank, 0);
1633 ASSERT_TRUE(error == TDM_ERROR_NONE);
1635 for (int i = 0; i < 10; ++i) {
1636 utVblankHandlerIsCalled = 0;
1639 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1640 ASSERT_TRUE(error == TDM_ERROR_NONE);
1642 UtHandleVblankEvent();
1644 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1645 ASSERT_TRUE(data == 1);
1649 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZero)
1654 SKIP_FLAG(has_output);
1656 if (!con_output_vblank)
1659 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1660 ASSERT_TRUE(error == TDM_ERROR_NONE);
1662 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1663 ASSERT_TRUE(error == TDM_ERROR_NONE);
1665 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1666 ASSERT_TRUE(error == TDM_ERROR_NONE);
1668 error = tdm_vblank_set_offset(con_output_vblank, 10);
1669 ASSERT_TRUE(error == TDM_ERROR_NONE);
1671 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1672 ASSERT_TRUE(error == TDM_ERROR_NONE);
1674 UtHandleVblankEvent();
1676 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1677 ASSERT_TRUE(data == 1);
1680 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1685 SKIP_FLAG(has_output);
1687 if (!con_output_vblank)
1690 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1691 ASSERT_TRUE(error == TDM_ERROR_NONE);
1693 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1694 ASSERT_TRUE(error == TDM_ERROR_NONE);
1696 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1697 ASSERT_TRUE(error == TDM_ERROR_NONE);
1699 error = tdm_vblank_set_offset(con_output_vblank, 10);
1700 ASSERT_TRUE(error == TDM_ERROR_NONE);
1702 for (int i = 0; i < 10; ++i) {
1703 utVblankHandlerIsCalled = 0;
1706 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1707 ASSERT_TRUE(error == TDM_ERROR_NONE);
1709 UtHandleVblankEvent();
1711 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1712 ASSERT_TRUE(data == 1);
1716 /* tdm_vblank_wait_seq() */
1718 TEST_F(TDMVblank, VblankWaitSeqFailNullAll)
1722 SKIP_FLAG(has_output);
1724 error = tdm_vblank_wait_seq(NULL, 0, 0, 0, NULL, NULL);
1725 ASSERT_TRUE(error != TDM_ERROR_NONE);
1728 TEST_F(TDMVblankWait, VblankWaitSeqFailNullVblank)
1732 SKIP_FLAG(has_output);
1734 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1735 ASSERT_TRUE(error != TDM_ERROR_NONE);
1738 TEST_F(TDMVblankWait, VblankWaitSeqFailWrongVblankPtr)
1740 tdm_error error = TDM_ERROR_BAD_MODULE;
1741 SKIP_FLAG(has_output);
1743 ASSERT_EXIT({error = tdm_vblank_wait_seq((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1744 if (error == TDM_ERROR_NONE)
1748 ::testing::ExitedWithCode(0), "");
1751 TEST_F(TDMVblankWait, VblankWaitSeqFailNullFunc)
1755 SKIP_FLAG(has_output);
1757 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1758 ASSERT_TRUE(error != TDM_ERROR_NONE);
1761 void *UtWaitVblankSeqThreadHndl(void *ptr)
1764 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1766 error = tdm_vblank_wait_seq(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1767 if (error != TDM_ERROR_NONE)
1768 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1770 vblankWait->utWaitVblankSeqThreadHndlResult = 1;
1775 TEST_F(TDMVblankWait, VblankWaitSeqFailInOtherThread)
1777 pthread_t thread = 0;
1779 SKIP_FLAG(has_output);
1781 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankSeqThreadHndl, this));
1783 ASSERT_FALSE(pthread_join(thread, NULL));
1785 ASSERT_FALSE(utWaitVblankSeqThreadHndlResult);
1788 TEST_F(TDMVblankWait, VblankWaitSeqFailDisconnectedOutput)
1792 SKIP_FLAG(has_output);
1794 if (!discon_output_vblank)
1797 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1798 ASSERT_TRUE(error != TDM_ERROR_NONE);
1801 TEST_F(TDMVblankWait, VblankWaitSeqFailDpmsOff)
1805 SKIP_FLAG(has_output);
1807 if (!con_output_vblank)
1810 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1811 ASSERT_TRUE(error == TDM_ERROR_NONE);
1813 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1814 ASSERT_TRUE(error != TDM_ERROR_NONE);
1817 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefresh)
1822 SKIP_FLAG(has_output);
1824 if (!con_output_vblank)
1827 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1828 ASSERT_TRUE(error == TDM_ERROR_NONE);
1830 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1831 ASSERT_TRUE(error == TDM_ERROR_NONE);
1833 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1834 ASSERT_TRUE(error == TDM_ERROR_NONE);
1836 UtHandleVblankEvent();
1838 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1839 ASSERT_TRUE(data == 1);
1842 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefreshRepeatedly)
1847 SKIP_FLAG(has_output);
1849 if (!con_output_vblank)
1852 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1853 ASSERT_TRUE(error == TDM_ERROR_NONE);
1855 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1856 ASSERT_TRUE(error == TDM_ERROR_NONE);
1858 for (int i = 1; i < 10; ++i) {
1859 utVblankHandlerIsCalled = 0;
1862 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1863 ASSERT_TRUE(error == TDM_ERROR_NONE);
1865 UtHandleVblankEvent();
1867 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1868 ASSERT_TRUE(data == 1);
1872 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutput)
1877 SKIP_FLAG(has_output);
1879 if (!discon_output_vblank)
1882 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1883 ASSERT_TRUE(error == TDM_ERROR_NONE);
1885 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1886 ASSERT_TRUE(error == TDM_ERROR_NONE);
1888 UtHandleVblankEvent();
1890 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1891 ASSERT_TRUE(data == 1);
1894 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutputRepeatedly)
1899 SKIP_FLAG(has_output);
1901 if (!discon_output_vblank)
1904 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1905 ASSERT_TRUE(error == TDM_ERROR_NONE);
1907 for (int i = 1; i < 10; ++i) {
1908 utVblankHandlerIsCalled = 0;
1911 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, i, UtVblankHandler, &data);
1912 ASSERT_TRUE(error == TDM_ERROR_NONE);
1914 UtHandleVblankEvent();
1916 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1917 ASSERT_TRUE(data == 1);
1921 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHW)
1926 SKIP_FLAG(has_output);
1928 if (!con_output_vblank)
1931 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1932 ASSERT_TRUE(error == TDM_ERROR_NONE);
1934 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1935 ASSERT_TRUE(error == TDM_ERROR_NONE);
1937 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1938 ASSERT_TRUE(error == TDM_ERROR_NONE);
1940 error = tdm_vblank_set_offset(con_output_vblank, 0);
1941 ASSERT_TRUE(error == TDM_ERROR_NONE);
1943 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1944 ASSERT_TRUE(error == TDM_ERROR_NONE);
1946 UtHandleVblankEvent();
1948 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1949 ASSERT_TRUE(data == 1);
1952 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHWRepeatedly)
1957 SKIP_FLAG(has_output);
1959 if (!con_output_vblank)
1962 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1963 ASSERT_TRUE(error == TDM_ERROR_NONE);
1965 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1966 ASSERT_TRUE(error == TDM_ERROR_NONE);
1968 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1969 ASSERT_TRUE(error == TDM_ERROR_NONE);
1971 error = tdm_vblank_set_offset(con_output_vblank, 0);
1972 ASSERT_TRUE(error == TDM_ERROR_NONE);
1974 for (int i = 1; i < 10; ++i) {
1975 utVblankHandlerIsCalled = 0;
1978 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1979 ASSERT_TRUE(error == TDM_ERROR_NONE);
1981 UtHandleVblankEvent();
1983 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1984 ASSERT_TRUE(data == 1);
1988 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZero)
1993 SKIP_FLAG(has_output);
1995 if (!con_output_vblank)
1998 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1999 ASSERT_TRUE(error == TDM_ERROR_NONE);
2001 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2002 ASSERT_TRUE(error == TDM_ERROR_NONE);
2004 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2005 ASSERT_TRUE(error == TDM_ERROR_NONE);
2007 error = tdm_vblank_set_offset(con_output_vblank, 10);
2008 ASSERT_TRUE(error == TDM_ERROR_NONE);
2010 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
2011 ASSERT_TRUE(error == TDM_ERROR_NONE);
2013 UtHandleVblankEvent();
2015 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2016 ASSERT_TRUE(data == 1);
2019 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZeroRepeatedly)
2024 SKIP_FLAG(has_output);
2026 if (!con_output_vblank)
2029 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2030 ASSERT_TRUE(error == TDM_ERROR_NONE);
2032 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2033 ASSERT_TRUE(error == TDM_ERROR_NONE);
2035 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2036 ASSERT_TRUE(error == TDM_ERROR_NONE);
2038 error = tdm_vblank_set_offset(con_output_vblank, 10);
2039 ASSERT_TRUE(error == TDM_ERROR_NONE);
2041 for (int i = 1; i < 10; ++i) {
2042 utVblankHandlerIsCalled = 0;
2044 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2045 ASSERT_TRUE(error == TDM_ERROR_NONE);
2047 UtHandleVblankEvent();
2049 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2050 ASSERT_TRUE(data == 1);
2054 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithSameSeq)
2059 SKIP_FLAG(has_output);
2061 if (!con_output_vblank)
2064 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2065 ASSERT_TRUE(error == TDM_ERROR_NONE);
2067 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2068 ASSERT_TRUE(error == TDM_ERROR_NONE);
2070 error = tdm_vblank_set_offset(con_output_vblank, 0);
2071 ASSERT_TRUE(error == TDM_ERROR_NONE);
2073 for (int i = 1; i < 10; ++i) {
2074 utVblankHandlerIsCalled = 0;
2077 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 2, UtVblankHandler, &data);
2078 ASSERT_TRUE(error == TDM_ERROR_NONE);
2080 UtHandleVblankEvent();
2082 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2083 ASSERT_TRUE(data == 1);
2087 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithBigFps)
2092 SKIP_FLAG(has_output);
2094 if (!con_output_vblank)
2097 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2098 ASSERT_TRUE(error == TDM_ERROR_NONE);
2100 error = tdm_vblank_set_fps(con_output_vblank, 5000);
2101 ASSERT_TRUE(error == TDM_ERROR_NONE);
2103 for (int i = 1; i < 10; ++i) {
2104 utVblankHandlerIsCalled = 0;
2107 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2108 ASSERT_TRUE(error == TDM_ERROR_NONE);
2113 UtHandleVblankEvent();
2115 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2116 ASSERT_TRUE(data == 1);
2120 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithDelay)
2125 SKIP_FLAG(has_output);
2127 if (!con_output_vblank)
2130 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2131 ASSERT_TRUE(error == TDM_ERROR_NONE);
2133 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2134 ASSERT_TRUE(error == TDM_ERROR_NONE);
2136 for (int i = 1; i < 10; ++i) {
2137 utVblankHandlerIsCalled = 0;
2140 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2141 ASSERT_TRUE(error == TDM_ERROR_NONE);
2145 UtHandleVblankEvent();
2147 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2148 ASSERT_TRUE(data == 1);