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", ".", 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 tbm_bufmgr = tbm_bufmgr_init(-1);
64 ASSERT_FALSE(tbm_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);},
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, VblankGetOffsetFailWrongOffsetPtr)
877 tdm_error error = TDM_ERROR_BAD_MODULE;
878 SKIP_FLAG(has_output);
880 ASSERT_EXIT({error = tdm_vblank_get_offset(default_vblank, (int *)0xFFFFFFFF);
881 if (error == TDM_ERROR_NONE)
885 ::testing::ExitedWithCode(0), "");
888 TEST_F(TDMVblank, VblankGetOffsetSuccesWithoutSet)
893 SKIP_FLAG(has_output);
895 error = tdm_vblank_get_offset(default_vblank, &offset);
896 ASSERT_TRUE(error == TDM_ERROR_NONE);
899 TEST_F(TDMVblank, VblankGetOffsetSucces)
902 int set_offset = 567;
905 SKIP_FLAG(has_output);
907 error = tdm_vblank_set_offset(default_vblank, set_offset);
908 ASSERT_TRUE(error != TDM_ERROR_NONE);
910 error = tdm_vblank_get_offset(default_vblank, &ret_offset);
911 ASSERT_TRUE(error != TDM_ERROR_NONE);
913 ASSERT_TRUE(set_offset == ret_offset);
916 /* tdm_vblank_set_enable_fake() */
918 TEST_F(TDMVblank, VblankSetEnableFakeFailNullVblank)
921 SKIP_FLAG(has_output);
923 error = tdm_vblank_set_enable_fake(NULL, 1);
924 ASSERT_TRUE(error != TDM_ERROR_NONE);
927 TEST_F(TDMVblank, VblankSetEnableFakeFailFailWrongVblankPtr)
929 tdm_error error = TDM_ERROR_BAD_MODULE;
931 SKIP_FLAG(has_output);
933 ASSERT_EXIT({error = tdm_vblank_set_enable_fake((tdm_vblank *)0xFFFFFFFF, 1);
934 if (error == TDM_ERROR_NONE)
938 ::testing::ExitedWithCode(0), "");
941 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSet)
944 SKIP_FLAG(has_output);
946 error = tdm_vblank_set_enable_fake(default_vblank, 1);
947 ASSERT_TRUE(error == TDM_ERROR_NONE);
950 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSetTwice)
953 SKIP_FLAG(has_output);
955 error = tdm_vblank_set_enable_fake(default_vblank, 1);
956 ASSERT_TRUE(error == TDM_ERROR_NONE);
958 error = tdm_vblank_set_enable_fake(default_vblank, 1);
959 ASSERT_TRUE(error == TDM_ERROR_NONE);
962 /* tdm_vblank_get_enable_fake() */
964 TEST_F(TDMVblank, VblankGetEnableFakeFailNullAll)
967 SKIP_FLAG(has_output);
969 error = tdm_vblank_get_enable_fake(NULL, NULL);
970 ASSERT_TRUE(error != TDM_ERROR_NONE);
973 TEST_F(TDMVblank, VblankGetEnableFakeFailNullVblank)
976 unsigned int enable_fake;
977 SKIP_FLAG(has_output);
979 error = tdm_vblank_get_enable_fake(NULL, &enable_fake);
980 ASSERT_TRUE(error != TDM_ERROR_NONE);
983 TEST_F(TDMVblank, VblankGetEnableFakeFailNullEnableFake)
986 SKIP_FLAG(has_output);
988 error = tdm_vblank_get_enable_fake(default_vblank, NULL);
989 ASSERT_TRUE(error != TDM_ERROR_NONE);
992 TEST_F(TDMVblank, VblankGetEnableFakeFailWrongVblankPtr)
994 tdm_error error = TDM_ERROR_BAD_MODULE;
995 unsigned int enable_fake;
996 SKIP_FLAG(has_output);
998 ASSERT_EXIT({error = tdm_vblank_get_enable_fake((tdm_vblank *)0xFFFFFFFF, &enable_fake);
999 if (error == TDM_ERROR_NONE)
1003 ::testing::ExitedWithCode(0), "");
1006 TEST_F(TDMVblank, DISABLED_VblankGetEnableFakeFailWrongOffsetPtr)
1008 tdm_error error = TDM_ERROR_BAD_MODULE;
1009 SKIP_FLAG(has_output);
1011 ASSERT_EXIT({error = tdm_vblank_get_enable_fake(default_vblank, (unsigned int *)0xFFFFFFFF);
1012 if (error == TDM_ERROR_NONE)
1016 ::testing::ExitedWithCode(0), "");
1019 TEST_F(TDMVblank, VblankGetEnableFakeSuccessWithoutSet)
1022 unsigned int enable_fake;
1024 SKIP_FLAG(has_output);
1026 error = tdm_vblank_get_enable_fake(default_vblank, &enable_fake);
1027 ASSERT_TRUE(error == TDM_ERROR_NONE);
1030 TEST_F(TDMVblank, VblankGetEnableFakeSuccess)
1033 unsigned int set_enable_fake = 1;
1034 unsigned int ret_enable_fake;
1036 SKIP_FLAG(has_output);
1038 error = tdm_vblank_set_enable_fake(default_vblank, set_enable_fake);
1039 ASSERT_TRUE(error == TDM_ERROR_NONE);
1041 error = tdm_vblank_get_enable_fake(default_vblank, &ret_enable_fake);
1042 ASSERT_TRUE(error == TDM_ERROR_NONE);
1044 ASSERT_TRUE(set_enable_fake == ret_enable_fake);
1047 /* tdm_vblank_set_client_vblank_fps() */
1049 /* TODO: need to create the tdm client */
1050 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullAll)
1054 SKIP_FLAG(has_output);
1056 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1057 ASSERT_TRUE(error != TDM_ERROR_NONE);
1060 /* TODO: need to create the tdm client */
1061 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullPid)
1065 SKIP_FLAG(has_output);
1067 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1068 ASSERT_TRUE(error != TDM_ERROR_NONE);
1071 /* tdm_vblank_wait() */
1073 TEST_F(TDMVblank, VblankWaitFailNullAll)
1077 SKIP_FLAG(has_output);
1079 error = tdm_vblank_wait(NULL, 0, 0, 0, NULL, NULL);
1080 ASSERT_TRUE(error != TDM_ERROR_NONE);
1083 TEST_F(TDMVblankWait, VblankWaitFailNullVblank)
1087 SKIP_FLAG(has_output);
1089 error = tdm_vblank_wait(NULL, 0, 0, 1, UtVblankHandler, NULL);
1090 ASSERT_TRUE(error != TDM_ERROR_NONE);
1093 TEST_F(TDMVblankWait, VblankWaitFailNullFunc)
1097 SKIP_FLAG(has_output);
1099 error = tdm_vblank_wait(default_vblank, 0, 0, 1, NULL, NULL);
1100 ASSERT_TRUE(error != TDM_ERROR_NONE);
1103 TEST_F(TDMVblankWait, VblankWaitFailWrongVblankPtr)
1105 tdm_error error = TDM_ERROR_BAD_MODULE;
1106 SKIP_FLAG(has_output);
1108 ASSERT_EXIT({error = tdm_vblank_wait((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1109 if (error == TDM_ERROR_NONE)
1113 ::testing::ExitedWithCode(0), "");
1116 void *UtWaitVblankThreadHndl(void *ptr)
1119 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1121 error = tdm_vblank_wait(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1122 if (error != TDM_ERROR_NONE)
1123 vblankWait->utWaitVblankThreadHndlResult = 0;
1125 vblankWait->utWaitVblankThreadHndlResult = 0;
1130 TEST_F(TDMVblankWait, VblankWaitFailInOtherThread)
1134 SKIP_FLAG(has_output);
1136 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankThreadHndl, this));
1138 ASSERT_FALSE(pthread_join(thread, NULL));
1140 ASSERT_FALSE(utWaitVblankThreadHndlResult);
1143 TEST_F(TDMVblankWait, VblankWaitFailDisconnectedOutput)
1147 SKIP_FLAG(has_output);
1149 if (!discon_output_vblank)
1152 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1153 ASSERT_TRUE(error != TDM_ERROR_NONE);
1156 TEST_F(TDMVblankWait, VblankWaitFailDpmsOff)
1160 SKIP_FLAG(has_output);
1162 if (!con_output_vblank)
1165 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1166 ASSERT_TRUE(error == TDM_ERROR_NONE);
1168 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1169 ASSERT_TRUE(error != TDM_ERROR_NONE);
1172 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefresh)
1177 SKIP_FLAG(has_output);
1179 if (!con_output_vblank)
1182 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1183 ASSERT_TRUE(error == TDM_ERROR_NONE);
1185 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1186 ASSERT_TRUE(error == TDM_ERROR_NONE);
1188 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1189 ASSERT_TRUE(error == TDM_ERROR_NONE);
1191 UtHandleVblankEvent();
1193 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1194 ASSERT_TRUE(data == 1);
1197 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1202 SKIP_FLAG(has_output);
1204 if (!con_output_vblank)
1207 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1208 ASSERT_TRUE(error == TDM_ERROR_NONE);
1210 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1211 ASSERT_TRUE(error == TDM_ERROR_NONE);
1213 for (int i = 0; i < 10; ++i) {
1214 utVblankHandlerIsCalled = 0;
1217 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1218 ASSERT_TRUE(error == TDM_ERROR_NONE);
1220 UtHandleVblankEvent();
1222 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1223 ASSERT_TRUE(data == 1);
1227 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutput)
1232 SKIP_FLAG(has_output);
1234 if (!discon_output_vblank)
1237 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1238 ASSERT_TRUE(error == TDM_ERROR_NONE);
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);
1249 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutputRepeatedly)
1254 SKIP_FLAG(has_output);
1256 if (!discon_output_vblank)
1259 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1260 ASSERT_TRUE(error == TDM_ERROR_NONE);
1262 for (int i = 0; i < 10; ++i) {
1263 utVblankHandlerIsCalled = 0;
1266 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1267 ASSERT_TRUE(error == TDM_ERROR_NONE);
1269 UtHandleVblankEvent();
1271 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1272 ASSERT_TRUE(data == 1);
1276 TEST_F(TDMVblankWait, VblankWaitSuccessHW)
1281 SKIP_FLAG(has_output);
1283 if (!con_output_vblank)
1286 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1287 ASSERT_TRUE(error == TDM_ERROR_NONE);
1289 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1290 ASSERT_TRUE(error == TDM_ERROR_NONE);
1292 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1293 ASSERT_TRUE(error == TDM_ERROR_NONE);
1295 error = tdm_vblank_set_offset(con_output_vblank, 0);
1296 ASSERT_TRUE(error == TDM_ERROR_NONE);
1298 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1299 ASSERT_TRUE(error == TDM_ERROR_NONE);
1301 UtHandleVblankEvent();
1303 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1304 ASSERT_TRUE(data == 1);
1307 TEST_F(TDMVblankWait, VblankWaitSuccessDestroy)
1312 SKIP_FLAG(has_output);
1314 if (!con_output_vblank)
1317 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1318 ASSERT_TRUE(error == TDM_ERROR_NONE);
1320 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1321 ASSERT_TRUE(error == TDM_ERROR_NONE);
1323 error = tdm_vblank_set_offset(con_output_vblank, 0);
1324 ASSERT_TRUE(error == TDM_ERROR_NONE);
1326 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1327 ASSERT_TRUE(error == TDM_ERROR_NONE);
1329 tdm_vblank_destroy(con_output_vblank);
1331 ASSERT_TRUE(utVblankHandlerIsCalled == 0);
1332 ASSERT_TRUE(data == 0);
1335 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpms)
1340 SKIP_FLAG(has_output);
1342 if (!con_output_vblank)
1345 error = tdm_vblank_set_enable_fake(con_output_vblank, 0);
1346 ASSERT_TRUE(error == TDM_ERROR_NONE);
1348 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1349 ASSERT_TRUE(error == TDM_ERROR_NONE);
1351 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1352 ASSERT_TRUE(error == TDM_ERROR_NONE);
1354 error = tdm_vblank_set_offset(con_output_vblank, 0);
1355 ASSERT_TRUE(error == TDM_ERROR_NONE);
1357 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1358 ASSERT_TRUE(error == TDM_ERROR_NONE);
1360 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1361 ASSERT_TRUE(error == TDM_ERROR_NONE);
1363 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1364 ASSERT_TRUE(data == 1);
1367 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpmsWithEnableFake)
1372 SKIP_FLAG(has_output);
1374 if (!con_output_vblank)
1377 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1378 ASSERT_TRUE(error == TDM_ERROR_NONE);
1380 error = tdm_vblank_set_enable_fake(con_output_vblank, 1);
1381 ASSERT_TRUE(error == TDM_ERROR_NONE);
1383 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1384 ASSERT_TRUE(error == TDM_ERROR_NONE);
1386 error = tdm_vblank_set_offset(con_output_vblank, 0);
1387 ASSERT_TRUE(error == TDM_ERROR_NONE);
1389 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1390 ASSERT_TRUE(error == TDM_ERROR_NONE);
1392 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1393 ASSERT_TRUE(error == TDM_ERROR_NONE);
1395 UtHandleVblankEvent();
1397 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1398 ASSERT_TRUE(data == 1);
1401 TEST_F(TDMVblankWait, VblankWaitSuccessHWRepeatedly)
1406 SKIP_FLAG(has_output);
1408 if (!con_output_vblank)
1411 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1412 ASSERT_TRUE(error == TDM_ERROR_NONE);
1414 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1415 ASSERT_TRUE(error == TDM_ERROR_NONE);
1417 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1418 ASSERT_TRUE(error == TDM_ERROR_NONE);
1420 error = tdm_vblank_set_offset(con_output_vblank, 0);
1421 ASSERT_TRUE(error == TDM_ERROR_NONE);
1423 for (int i = 0; i < 10; ++i) {
1424 utVblankHandlerIsCalled = 0;
1427 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1428 ASSERT_TRUE(error == TDM_ERROR_NONE);
1430 UtHandleVblankEvent();
1432 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1433 ASSERT_TRUE(data == 1);
1437 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZero)
1442 SKIP_FLAG(has_output);
1444 if (!con_output_vblank)
1447 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1448 ASSERT_TRUE(error == TDM_ERROR_NONE);
1450 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1451 ASSERT_TRUE(error == TDM_ERROR_NONE);
1453 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1454 ASSERT_TRUE(error == TDM_ERROR_NONE);
1456 error = tdm_vblank_set_offset(con_output_vblank, 10);
1457 ASSERT_TRUE(error == TDM_ERROR_NONE);
1459 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1460 ASSERT_TRUE(error == TDM_ERROR_NONE);
1462 UtHandleVblankEvent();
1464 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1465 ASSERT_TRUE(data == 1);
1468 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1473 SKIP_FLAG(has_output);
1475 if (!con_output_vblank)
1478 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1479 ASSERT_TRUE(error == TDM_ERROR_NONE);
1481 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1482 ASSERT_TRUE(error == TDM_ERROR_NONE);
1484 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1485 ASSERT_TRUE(error == TDM_ERROR_NONE);
1487 error = tdm_vblank_set_offset(con_output_vblank, 10);
1488 ASSERT_TRUE(error == TDM_ERROR_NONE);
1490 for (int i = 0; i < 10; ++i) {
1491 utVblankHandlerIsCalled = 0;
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);
1504 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefresh)
1509 SKIP_FLAG(has_output);
1511 if (!con_output_vblank)
1514 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1515 ASSERT_TRUE(error == TDM_ERROR_NONE);
1517 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1518 ASSERT_TRUE(error == TDM_ERROR_NONE);
1520 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1521 ASSERT_TRUE(error == TDM_ERROR_NONE);
1523 UtHandleVblankEvent();
1525 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1526 ASSERT_TRUE(data == 1);
1529 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1534 SKIP_FLAG(has_output);
1536 if (!con_output_vblank)
1539 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1540 ASSERT_TRUE(error == TDM_ERROR_NONE);
1542 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1543 ASSERT_TRUE(error == TDM_ERROR_NONE);
1545 for (int i = 0; i < 10; ++i) {
1546 utVblankHandlerIsCalled = 0;
1549 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1550 ASSERT_TRUE(error == TDM_ERROR_NONE);
1552 UtHandleVblankEvent();
1554 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1555 ASSERT_TRUE(data == 1);
1559 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutput)
1564 SKIP_FLAG(has_output);
1566 if (!discon_output_vblank)
1569 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1570 ASSERT_TRUE(error == TDM_ERROR_NONE);
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);
1581 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutputRepeatedly)
1586 SKIP_FLAG(has_output);
1588 if (!discon_output_vblank)
1591 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1592 ASSERT_TRUE(error == TDM_ERROR_NONE);
1594 for (int i = 0; i < 10; ++i) {
1595 utVblankHandlerIsCalled = 0;
1598 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1599 ASSERT_TRUE(error == TDM_ERROR_NONE);
1601 UtHandleVblankEvent();
1603 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1604 ASSERT_TRUE(data == 1);
1608 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHW)
1613 SKIP_FLAG(has_output);
1615 if (!con_output_vblank)
1618 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1619 ASSERT_TRUE(error == TDM_ERROR_NONE);
1621 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1622 ASSERT_TRUE(error == TDM_ERROR_NONE);
1624 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1625 ASSERT_TRUE(error == TDM_ERROR_NONE);
1627 error = tdm_vblank_set_offset(con_output_vblank, 0);
1628 ASSERT_TRUE(error == TDM_ERROR_NONE);
1630 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1631 ASSERT_TRUE(error == TDM_ERROR_NONE);
1633 UtHandleVblankEvent();
1635 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1636 ASSERT_TRUE(data == 1);
1639 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHWRepeatedly)
1644 SKIP_FLAG(has_output);
1646 if (!con_output_vblank)
1649 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1650 ASSERT_TRUE(error == TDM_ERROR_NONE);
1652 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1653 ASSERT_TRUE(error == TDM_ERROR_NONE);
1655 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1656 ASSERT_TRUE(error == TDM_ERROR_NONE);
1658 error = tdm_vblank_set_offset(con_output_vblank, 0);
1659 ASSERT_TRUE(error == TDM_ERROR_NONE);
1661 for (int i = 0; i < 10; ++i) {
1662 utVblankHandlerIsCalled = 0;
1665 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1666 ASSERT_TRUE(error == TDM_ERROR_NONE);
1668 UtHandleVblankEvent();
1670 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1671 ASSERT_TRUE(data == 1);
1675 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZero)
1680 SKIP_FLAG(has_output);
1682 if (!con_output_vblank)
1685 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1686 ASSERT_TRUE(error == TDM_ERROR_NONE);
1688 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1689 ASSERT_TRUE(error == TDM_ERROR_NONE);
1691 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1692 ASSERT_TRUE(error == TDM_ERROR_NONE);
1694 error = tdm_vblank_set_offset(con_output_vblank, 10);
1695 ASSERT_TRUE(error == TDM_ERROR_NONE);
1697 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1698 ASSERT_TRUE(error == TDM_ERROR_NONE);
1700 UtHandleVblankEvent();
1702 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1703 ASSERT_TRUE(data == 1);
1706 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1711 SKIP_FLAG(has_output);
1713 if (!con_output_vblank)
1716 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1717 ASSERT_TRUE(error == TDM_ERROR_NONE);
1719 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1720 ASSERT_TRUE(error == TDM_ERROR_NONE);
1722 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1723 ASSERT_TRUE(error == TDM_ERROR_NONE);
1725 error = tdm_vblank_set_offset(con_output_vblank, 10);
1726 ASSERT_TRUE(error == TDM_ERROR_NONE);
1728 for (int i = 0; i < 10; ++i) {
1729 utVblankHandlerIsCalled = 0;
1732 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1733 ASSERT_TRUE(error == TDM_ERROR_NONE);
1735 UtHandleVblankEvent();
1737 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1738 ASSERT_TRUE(data == 1);
1742 /* tdm_vblank_wait_seq() */
1744 TEST_F(TDMVblank, VblankWaitSeqFailNullAll)
1748 SKIP_FLAG(has_output);
1750 error = tdm_vblank_wait_seq(NULL, 0, 0, 0, NULL, NULL);
1751 ASSERT_TRUE(error != TDM_ERROR_NONE);
1754 TEST_F(TDMVblankWait, VblankWaitSeqFailNullVblank)
1758 SKIP_FLAG(has_output);
1760 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1761 ASSERT_TRUE(error != TDM_ERROR_NONE);
1764 TEST_F(TDMVblankWait, VblankWaitSeqFailWrongVblankPtr)
1766 tdm_error error = TDM_ERROR_BAD_MODULE;
1767 SKIP_FLAG(has_output);
1769 ASSERT_EXIT({error = tdm_vblank_wait_seq((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1770 if (error == TDM_ERROR_NONE)
1774 ::testing::ExitedWithCode(0), "");
1777 TEST_F(TDMVblankWait, VblankWaitSeqFailNullFunc)
1781 SKIP_FLAG(has_output);
1783 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1784 ASSERT_TRUE(error != TDM_ERROR_NONE);
1787 void *UtWaitVblankSeqThreadHndl(void *ptr)
1790 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1792 error = tdm_vblank_wait_seq(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1793 if (error != TDM_ERROR_NONE)
1794 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1796 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1801 TEST_F(TDMVblankWait, VblankWaitSeqFailInOtherThread)
1805 SKIP_FLAG(has_output);
1807 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankSeqThreadHndl, this));
1809 ASSERT_FALSE(pthread_join(thread, NULL));
1811 ASSERT_FALSE(utWaitVblankSeqThreadHndlResult);
1814 TEST_F(TDMVblankWait, VblankWaitSeqFailDisconnectedOutput)
1818 SKIP_FLAG(has_output);
1820 if (!discon_output_vblank)
1823 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1824 ASSERT_TRUE(error != TDM_ERROR_NONE);
1827 TEST_F(TDMVblankWait, VblankWaitSeqFailDpmsOff)
1831 SKIP_FLAG(has_output);
1833 if (!con_output_vblank)
1836 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1837 ASSERT_TRUE(error == TDM_ERROR_NONE);
1839 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1840 ASSERT_TRUE(error != TDM_ERROR_NONE);
1843 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefresh)
1848 SKIP_FLAG(has_output);
1850 if (!con_output_vblank)
1853 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1854 ASSERT_TRUE(error == TDM_ERROR_NONE);
1856 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1857 ASSERT_TRUE(error == TDM_ERROR_NONE);
1859 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1860 ASSERT_TRUE(error == TDM_ERROR_NONE);
1862 UtHandleVblankEvent();
1864 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1865 ASSERT_TRUE(data == 1);
1868 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefreshRepeatedly)
1873 SKIP_FLAG(has_output);
1875 if (!con_output_vblank)
1878 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1879 ASSERT_TRUE(error == TDM_ERROR_NONE);
1881 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1882 ASSERT_TRUE(error == TDM_ERROR_NONE);
1884 for (int i = 1; i < 10; ++i) {
1885 utVblankHandlerIsCalled = 0;
1888 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1889 ASSERT_TRUE(error == TDM_ERROR_NONE);
1891 UtHandleVblankEvent();
1893 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1894 ASSERT_TRUE(data == 1);
1898 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutput)
1903 SKIP_FLAG(has_output);
1905 if (!discon_output_vblank)
1908 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1909 ASSERT_TRUE(error == TDM_ERROR_NONE);
1911 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1912 ASSERT_TRUE(error == TDM_ERROR_NONE);
1914 UtHandleVblankEvent();
1916 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1917 ASSERT_TRUE(data == 1);
1920 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutputRepeatedly)
1925 SKIP_FLAG(has_output);
1927 if (!discon_output_vblank)
1930 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1931 ASSERT_TRUE(error == TDM_ERROR_NONE);
1933 for (int i = 1; i < 10; ++i) {
1934 utVblankHandlerIsCalled = 0;
1937 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, i, UtVblankHandler, &data);
1938 ASSERT_TRUE(error == TDM_ERROR_NONE);
1940 UtHandleVblankEvent();
1942 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1943 ASSERT_TRUE(data == 1);
1947 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHW)
1952 SKIP_FLAG(has_output);
1954 if (!con_output_vblank)
1957 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1958 ASSERT_TRUE(error == TDM_ERROR_NONE);
1960 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1961 ASSERT_TRUE(error == TDM_ERROR_NONE);
1963 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1964 ASSERT_TRUE(error == TDM_ERROR_NONE);
1966 error = tdm_vblank_set_offset(con_output_vblank, 0);
1967 ASSERT_TRUE(error == TDM_ERROR_NONE);
1969 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1970 ASSERT_TRUE(error == TDM_ERROR_NONE);
1972 UtHandleVblankEvent();
1974 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1975 ASSERT_TRUE(data == 1);
1978 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHWRepeatedly)
1983 SKIP_FLAG(has_output);
1985 if (!con_output_vblank)
1988 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1989 ASSERT_TRUE(error == TDM_ERROR_NONE);
1991 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1992 ASSERT_TRUE(error == TDM_ERROR_NONE);
1994 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1995 ASSERT_TRUE(error == TDM_ERROR_NONE);
1997 error = tdm_vblank_set_offset(con_output_vblank, 0);
1998 ASSERT_TRUE(error == TDM_ERROR_NONE);
2000 for (int i = 1; i < 10; ++i) {
2001 utVblankHandlerIsCalled = 0;
2004 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2005 ASSERT_TRUE(error == TDM_ERROR_NONE);
2007 UtHandleVblankEvent();
2009 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2010 ASSERT_TRUE(data == 1);
2014 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZero)
2019 SKIP_FLAG(has_output);
2021 if (!con_output_vblank)
2024 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2025 ASSERT_TRUE(error == TDM_ERROR_NONE);
2027 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2028 ASSERT_TRUE(error == TDM_ERROR_NONE);
2030 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2031 ASSERT_TRUE(error == TDM_ERROR_NONE);
2033 error = tdm_vblank_set_offset(con_output_vblank, 10);
2034 ASSERT_TRUE(error == TDM_ERROR_NONE);
2036 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
2037 ASSERT_TRUE(error == TDM_ERROR_NONE);
2039 UtHandleVblankEvent();
2041 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2042 ASSERT_TRUE(data == 1);
2045 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZeroRepeatedly)
2050 SKIP_FLAG(has_output);
2052 if (!con_output_vblank)
2055 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2056 ASSERT_TRUE(error == TDM_ERROR_NONE);
2058 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2059 ASSERT_TRUE(error == TDM_ERROR_NONE);
2061 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2062 ASSERT_TRUE(error == TDM_ERROR_NONE);
2064 error = tdm_vblank_set_offset(con_output_vblank, 10);
2065 ASSERT_TRUE(error == TDM_ERROR_NONE);
2067 for (int i = 1; i < 10; ++i) {
2068 utVblankHandlerIsCalled = 0;
2070 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2071 ASSERT_TRUE(error == TDM_ERROR_NONE);
2073 UtHandleVblankEvent();
2075 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2076 ASSERT_TRUE(data == 1);
2080 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithSameSeq)
2085 SKIP_FLAG(has_output);
2087 if (!con_output_vblank)
2090 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2091 ASSERT_TRUE(error == TDM_ERROR_NONE);
2093 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2094 ASSERT_TRUE(error == TDM_ERROR_NONE);
2096 error = tdm_vblank_set_offset(con_output_vblank, 0);
2097 ASSERT_TRUE(error == TDM_ERROR_NONE);
2099 for (int i = 1; i < 10; ++i) {
2100 utVblankHandlerIsCalled = 0;
2103 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 2, UtVblankHandler, &data);
2104 ASSERT_TRUE(error == TDM_ERROR_NONE);
2106 UtHandleVblankEvent();
2108 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2109 ASSERT_TRUE(data == 1);
2113 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithBigFps)
2118 SKIP_FLAG(has_output);
2120 if (!con_output_vblank)
2123 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2124 ASSERT_TRUE(error == TDM_ERROR_NONE);
2126 error = tdm_vblank_set_fps(con_output_vblank, 5000);
2127 ASSERT_TRUE(error == TDM_ERROR_NONE);
2129 for (int i = 1; i < 10; ++i) {
2130 utVblankHandlerIsCalled = 0;
2133 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2134 ASSERT_TRUE(error == TDM_ERROR_NONE);
2139 UtHandleVblankEvent();
2141 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2142 ASSERT_TRUE(data == 1);
2146 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithDelay)
2151 SKIP_FLAG(has_output);
2153 if (!con_output_vblank)
2156 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2157 ASSERT_TRUE(error == TDM_ERROR_NONE);
2159 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2160 ASSERT_TRUE(error == TDM_ERROR_NONE);
2162 for (int i = 1; i < 10; ++i) {
2163 utVblankHandlerIsCalled = 0;
2166 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2167 ASSERT_TRUE(error == TDM_ERROR_NONE);
2171 UtHandleVblankEvent();
2173 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2174 ASSERT_TRUE(data == 1);