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 bufmgr = tbm_bufmgr_init(-1);
61 ASSERT_FALSE(bufmgr == NULL);
63 dpy = tdm_display_init(&error);
64 ASSERT_TRUE(error == TDM_ERROR_NONE);
65 ASSERT_FALSE(dpy == NULL);
67 error = tdm_display_get_output_count(dpy, &output_count);
68 ASSERT_TRUE(error == TDM_ERROR_NONE);
74 for(int i = 0; i < output_count; i++) {
75 output = tdm_display_get_output(dpy, i, &error);
76 ASSERT_TRUE(error == TDM_ERROR_NONE);
77 ASSERT_FALSE(dpy == NULL);
79 error = tdm_output_get_conn_status(output, &status);
80 ASSERT_TRUE(error == TDM_ERROR_NONE);
82 if (status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
83 connected_output = output;
85 disconnected_output = output;
88 default_output = disconnected_output;
90 if (connected_output) {
91 int output_modes_cnt = 0;
92 const tdm_output_mode* output_modes;
94 error = tdm_output_get_available_modes(connected_output, &output_modes, &output_modes_cnt);
95 ASSERT_TRUE(error == TDM_ERROR_NONE);
96 if (output_modes_cnt <= 0) {
97 connected_output = NULL;
101 for(int i = 0; i < output_modes_cnt; i++) {
102 if(output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) {
103 preferred_mode = &output_modes[i];
105 default_output = connected_output;
112 connected_output = NULL;
116 if (connected_output)
117 tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
119 tbm_bufmgr_deinit(bufmgr);
121 tdm_display_deinit(dpy);
128 class TDMVblank: public TDMVblankWithoutCreating {
130 tdm_vblank *con_output_vblank = NULL;
131 tdm_vblank *discon_output_vblank = NULL;
132 tdm_output *default_vblank = NULL;
133 int setModeAndDpms = 0;
134 tbm_surface_h buffer = NULL;
135 tdm_layer *layer = NULL;
141 TDMVblankWithoutCreating::SetUp();
143 if (connected_output && setModeAndDpms) {
145 tdm_info_layer info = {0};
147 error = tdm_output_set_mode(connected_output, preferred_mode);
148 ASSERT_TRUE(error == TDM_ERROR_NONE);
150 error = tdm_output_get_primary_index(connected_output, &primary_index);
151 ASSERT_TRUE(error == TDM_ERROR_NONE);
153 layer = tdm_output_get_layer(connected_output, primary_index, &error);
154 ASSERT_TRUE(error == TDM_ERROR_NONE);
155 ASSERT_TRUE(layer != NULL);
157 info.src_config.size.h = preferred_mode->hdisplay;
158 info.src_config.size.v = preferred_mode->vdisplay;
159 info.src_config.pos.x = 0;
160 info.src_config.pos.y = 0;
161 info.src_config.pos.w = preferred_mode->hdisplay;
162 info.src_config.pos.h = preferred_mode->vdisplay;
163 info.src_config.format = TBM_FORMAT_ARGB8888;
166 info.dst_pos.w = preferred_mode->hdisplay;
167 info.dst_pos.h = preferred_mode->vdisplay;
168 info.transform = TDM_TRANSFORM_NORMAL;
170 error = tdm_layer_set_info(layer, &info);
171 ASSERT_TRUE(error == TDM_ERROR_NONE);
173 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
174 ASSERT_TRUE(error == TDM_ERROR_NONE);
176 buffer = tbm_surface_internal_create_with_flags(preferred_mode->hdisplay,
177 preferred_mode->vdisplay,
180 ASSERT_TRUE(buffer != NULL);
182 error = tdm_layer_set_buffer(layer, buffer);
183 ASSERT_TRUE(error == TDM_ERROR_NONE);
185 error = tdm_output_commit(connected_output, 0, NULL, NULL);
186 ASSERT_TRUE(error == TDM_ERROR_NONE);
187 /* TODO: use a commit handler instead of an usleep to wait when
188 * commit will be applied */
192 if (disconnected_output) {
193 discon_output_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
194 EXPECT_TRUE(discon_output_vblank != NULL);
195 EXPECT_TRUE(error == TDM_ERROR_NONE);
196 default_vblank = discon_output_vblank;
199 if (connected_output) {
200 con_output_vblank = tdm_vblank_create(dpy, connected_output, &error);
201 EXPECT_TRUE(con_output_vblank != NULL);
202 EXPECT_TRUE(error == TDM_ERROR_NONE);
203 default_vblank = con_output_vblank;
206 ASSERT_TRUE(default_vblank != NULL);
212 tdm_layer_unset_buffer(layer);
213 tdm_output_commit(connected_output, 0, NULL, NULL);
214 tbm_surface_destroy(buffer);
217 TDMVblankWithoutCreating::TearDown();
221 class TDMVblankWait : public TDMVblank {
223 static int utVblankHandlerIsCalled;
224 static void UtVblankHandler(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
225 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
227 int *data = (int *)user_data;
232 utVblankHandlerIsCalled = 1;
234 int utWaitVblankThreadHndlResult = -1;
235 friend void *UtWaitVblankThreadHndl(void *ptr);
236 int utWaitVblankSeqThreadHndlResult = -1;
237 friend void *UtWaitVblankSeqThreadHndl(void *ptr);
243 static const int timeLimitSec = 1;
248 struct epoll_event ep;
250 utVblankHandlerIsCalled = 0;
255 epFd = epoll_create1(0);
256 ASSERT_TRUE(epFd != -1);
258 timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
259 ASSERT_TRUE(timerFd != -1);
261 memset(&ep, 0, sizeof ep);
262 ep.events |= EPOLLIN;
263 ep.data.fd = timerFd;
264 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ep) == 0);
266 ASSERT_TRUE(tdm_display_get_fd(dpy, &tdmFd) == TDM_ERROR_NONE);
268 memset(&ep, 0, sizeof ep);
269 ep.events |= EPOLLIN;
271 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, tdmFd, &ep) == 0);
274 void UtHandleVblankEvent()
276 struct itimerspec its;
278 struct epoll_event ep_event[2];
280 if (utVblankHandlerIsCalled)
283 its.it_interval.tv_sec = 0;
284 its.it_interval.tv_nsec = 0;
285 its.it_value.tv_sec = timeLimitSec;
286 its.it_value.tv_nsec = 0;
288 ASSERT_TRUE(timerfd_settime(timerFd, 0, &its, NULL) == 0);
291 count = epoll_wait(epFd, ep_event, sizeof(ep_event), -1);
292 ASSERT_TRUE(count >= 0);
294 for (int i = 0; i < count; i++) {
295 if (ep_event[i].data.fd == timerFd) {
298 ASSERT_TRUE(tdm_display_handle_events(dpy) == TDM_ERROR_NONE);
299 if (utVblankHandlerIsCalled)
307 class TDMVblankWaitThread : public TDMVblankWait {
311 setenv("TDM_THREAD", "1", 1);
312 TDMVblankWait::SetUp();
316 int TDMVblankWait::utVblankHandlerIsCalled = 0;
318 /* tdm_vblank_enable_global_fps() */
320 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpFailFpsNull)
322 tdm_error error = TDM_ERROR_BAD_MODULE;
324 SKIP_FLAG(has_output);
325 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 0);
326 if (error == TDM_ERROR_NONE)
329 ::testing::ExitedWithCode(0), "");
332 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessEnable)
334 tdm_error error = TDM_ERROR_BAD_MODULE;
336 SKIP_FLAG(has_output);
337 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 60);
338 if (error != TDM_ERROR_NONE)
341 ::testing::ExitedWithCode(0), "");
344 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessDisable)
346 tdm_error error = TDM_ERROR_BAD_MODULE;
348 SKIP_FLAG(has_output);
349 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(0, 0);
350 if (error != TDM_ERROR_NONE)
353 ::testing::ExitedWithCode(0), "");
356 /* tdm_vblank_create() */
358 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullAll)
360 tdm_vblank *ret_vblank;
362 SKIP_FLAG(has_output);
364 ret_vblank = tdm_vblank_create(NULL, NULL, NULL);
365 ASSERT_TRUE(ret_vblank == NULL);
368 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullDpy)
370 tdm_vblank *ret_vblank;
373 SKIP_FLAG(has_output);
375 ret_vblank = tdm_vblank_create(NULL, default_output, &error);
376 ASSERT_TRUE(ret_vblank == NULL);
377 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
380 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullOutput)
382 tdm_vblank *ret_vblank;
385 SKIP_FLAG(has_output);
387 ret_vblank = tdm_vblank_create(dpy, NULL, &error);
388 ASSERT_TRUE(ret_vblank == NULL);
389 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
392 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongDpy)
394 tdm_vblank *ret_vblank = NULL;
397 SKIP_FLAG(has_output);
399 ASSERT_EXIT({ret_vblank = tdm_vblank_create((tdm_display *)0xFFFFFFFF, default_output, &error);
400 if (ret_vblank || error == TDM_ERROR_NONE)
404 ::testing::ExitedWithCode(0), "");
407 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongOutput)
409 tdm_vblank *ret_vblank = NULL;
412 SKIP_FLAG(has_output);
414 ASSERT_EXIT({ret_vblank = tdm_vblank_create(dpy, (tdm_output *)0xFFFFFFFF, &error);
415 if (ret_vblank || error == TDM_ERROR_NONE)
419 ::testing::ExitedWithCode(0), "");
422 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForConnectedOutput)
424 tdm_vblank *ret_vblank;
427 SKIP_FLAG(has_output);
429 if (!connected_output)
432 ret_vblank = tdm_vblank_create(dpy, connected_output, &error);
433 ASSERT_TRUE(ret_vblank != NULL);
434 ASSERT_TRUE(error == TDM_ERROR_NONE);
437 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForDisconnectedOutput)
439 tdm_vblank *ret_vblank;
442 SKIP_FLAG(has_output);
444 if (!disconnected_output)
447 ret_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
448 ASSERT_TRUE(ret_vblank != NULL);
449 ASSERT_TRUE(error == TDM_ERROR_NONE);
452 /* tdm_vblank_destroy() */
454 TEST_F(TDMVblank, VblankDestroyWrongVblankPtr)
456 SKIP_FLAG(has_output);
458 ASSERT_EXIT({tdm_vblank_destroy((tdm_vblank *)0xFFFFFFFF);},
459 ::testing::ExitedWithCode(0), "");
462 TEST_F(TDMVblank, VblankDestroySuccess)
465 SKIP_FLAG(has_output);
467 tdm_vblank_destroy(con_output_vblank);
469 error = tdm_vblank_set_enable_fake(default_vblank, 1);
470 ASSERT_TRUE(error != TDM_ERROR_NONE);
473 /* tdm_vblank_set_name() */
475 TEST_F(TDMVblank, VblankSetNameFailNullAll)
478 SKIP_FLAG(has_output);
480 error = tdm_vblank_set_name(NULL, NULL);
481 ASSERT_TRUE(error != TDM_ERROR_NONE);
484 TEST_F(TDMVblank, VblankSetNameFailWrongVblankPtr)
486 tdm_error error = TDM_ERROR_BAD_MODULE;
488 SKIP_FLAG(has_output);
490 ASSERT_EXIT({error = tdm_vblank_set_name((tdm_vblank *)0xFFFFFFFF, "ut_vblank");
491 if (error == TDM_ERROR_NONE)
495 ::testing::ExitedWithCode(0), "");
498 TEST_F(TDMVblank, VblankSetNameSuccess)
501 SKIP_FLAG(has_output);
503 error = tdm_vblank_set_name(default_vblank, "ut_vblank");
504 ASSERT_TRUE(error == TDM_ERROR_NONE);
507 TEST_F(TDMVblank, VblankSetNameSuccessNullName)
510 SKIP_FLAG(has_output);
512 error = tdm_vblank_set_name(default_vblank, NULL);
513 ASSERT_TRUE(error == TDM_ERROR_NONE);
516 /* tdm_vblank_get_name() */
518 TEST_F(TDMVblank, VblankGetNameFailNullAll)
521 SKIP_FLAG(has_output);
523 error = tdm_vblank_get_name(NULL, NULL);
524 ASSERT_TRUE(error != TDM_ERROR_NONE);
527 TEST_F(TDMVblank, VblankGetNameFailNullVblank)
530 const char *ret_name;
531 SKIP_FLAG(has_output);
533 error = tdm_vblank_get_name(NULL, &ret_name);
534 ASSERT_TRUE(error != TDM_ERROR_NONE);
537 TEST_F(TDMVblank, VblankGetNameFailWrongVblankPtr)
539 tdm_error error = TDM_ERROR_BAD_MODULE;
540 const char *ret_name;
542 SKIP_FLAG(has_output);
544 ASSERT_EXIT({error = tdm_vblank_get_name((tdm_vblank *)0xFFFFFFFF, &ret_name);
545 if (error == TDM_ERROR_NONE)
549 ::testing::ExitedWithCode(0), "");
552 TEST_F(TDMVblank, VblankGetNameFailNullName)
555 SKIP_FLAG(has_output);
557 error = tdm_vblank_get_name(default_vblank, NULL);
558 ASSERT_TRUE(error != TDM_ERROR_NONE);
561 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetName)
564 const char *ret_name;
565 SKIP_FLAG(has_output);
567 error = tdm_vblank_get_name(default_vblank, &ret_name);
568 ASSERT_TRUE(error == TDM_ERROR_NONE);
571 TEST_F(TDMVblank, VblankGetNameSuccess)
574 const char *ret_name;
575 SKIP_FLAG(has_output);
576 const char *set_name = "ut_vblank";
578 error = tdm_vblank_set_name(default_vblank, set_name);
579 ASSERT_TRUE(error == TDM_ERROR_NONE);
581 error = tdm_vblank_get_name(default_vblank, &ret_name);
582 ASSERT_TRUE(error == TDM_ERROR_NONE);
584 ASSERT_STREQ(set_name, ret_name);
587 /* tdm_vblank_set_fps() */
589 TEST_F(TDMVblank, VblankSetFpsFailNullVblank)
592 SKIP_FLAG(has_output);
594 error = tdm_vblank_set_fps(NULL, 10);
595 ASSERT_TRUE(error != TDM_ERROR_NONE);
598 TEST_F(TDMVblank, VblankSetFpsFailFpsNull)
601 SKIP_FLAG(has_output);
603 error = tdm_vblank_set_fps(default_vblank, 0);
604 ASSERT_TRUE(error != TDM_ERROR_NONE);
607 TEST_F(TDMVblank, VblankSetFpsFailWrongVblankPtr)
609 tdm_error error = TDM_ERROR_BAD_MODULE;
611 SKIP_FLAG(has_output);
613 ASSERT_EXIT({error = tdm_vblank_set_fps((tdm_vblank *)0xFFFFFFFF, 60);
614 if (error == TDM_ERROR_NONE)
618 ::testing::ExitedWithCode(0), "");
621 TEST_F(TDMVblank, VblankSetFpsSuccess)
624 SKIP_FLAG(has_output);
626 error = tdm_vblank_set_fps(default_vblank, 60);
627 ASSERT_TRUE(error == TDM_ERROR_NONE);
630 TEST_F(TDMVblank, VblankSetFpsSuccessSetTwice)
633 SKIP_FLAG(has_output);
635 error = tdm_vblank_set_fps(default_vblank, 60);
636 ASSERT_TRUE(error == TDM_ERROR_NONE);
638 error = tdm_vblank_set_fps(default_vblank, 60);
639 ASSERT_TRUE(error == TDM_ERROR_NONE);
642 /* tdm_vblank_get_fps() */
644 TEST_F(TDMVblank, VblankGetFpsFailNullAll)
647 SKIP_FLAG(has_output);
649 error = tdm_vblank_get_fps(NULL, NULL);
650 ASSERT_TRUE(error != TDM_ERROR_NONE);
653 TEST_F(TDMVblank, VblankGetFpsFailNullVblank)
656 unsigned int ret_fps;
657 SKIP_FLAG(has_output);
659 error = tdm_vblank_get_fps(NULL, &ret_fps);
660 ASSERT_TRUE(error != TDM_ERROR_NONE);
663 TEST_F(TDMVblank, VblankGetFpsFailNullFps)
666 SKIP_FLAG(has_output);
668 error = tdm_vblank_get_fps(default_vblank, NULL);
669 ASSERT_TRUE(error != TDM_ERROR_NONE);
672 TEST_F(TDMVblank, VblankGetFpsFailWrongVblankPtr)
674 tdm_error error = TDM_ERROR_BAD_MODULE;
675 unsigned int ret_fps;
677 SKIP_FLAG(has_output);
679 ASSERT_EXIT({error = tdm_vblank_get_fps((tdm_vblank *)0xFFFFFFFF, &ret_fps);
680 if (error == TDM_ERROR_NONE)
684 ::testing::ExitedWithCode(0), "");
687 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetFps)
690 unsigned int ret_fps;
691 SKIP_FLAG(has_output);
693 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
694 ASSERT_TRUE(error == TDM_ERROR_NONE);
697 TEST_F(TDMVblank, VblankGetFpsSuccess)
700 unsigned int ret_fps = 10;
701 SKIP_FLAG(has_output);
702 unsigned int set_fps = 50;
704 error = tdm_vblank_set_fps(default_vblank, set_fps);
705 ASSERT_TRUE(error == TDM_ERROR_NONE);
707 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
708 ASSERT_TRUE(error == TDM_ERROR_NONE);
710 ASSERT_TRUE(set_fps == ret_fps);
713 /* tdm_vblank_ignore_global_fps() */
715 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailNullVblank)
718 SKIP_FLAG(has_output);
720 error = tdm_vblank_ignore_global_fps(NULL, 1);
721 ASSERT_TRUE(error != TDM_ERROR_NONE);
724 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailWrongVblankPtr)
726 tdm_error error = TDM_ERROR_BAD_MODULE;
728 SKIP_FLAG(has_output);
730 ASSERT_EXIT({error = tdm_vblank_ignore_global_fps((tdm_vblank *)0xFFFFFFFF, 1);
731 if (error == TDM_ERROR_NONE)
735 ::testing::ExitedWithCode(0), "");
738 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnset)
741 SKIP_FLAG(has_output);
743 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
744 ASSERT_TRUE(error == TDM_ERROR_NONE);
747 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnsetTwice)
750 SKIP_FLAG(has_output);
752 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
753 ASSERT_TRUE(error == TDM_ERROR_NONE);
755 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
756 ASSERT_TRUE(error == TDM_ERROR_NONE);
759 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSet)
762 SKIP_FLAG(has_output);
764 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
765 ASSERT_TRUE(error == TDM_ERROR_NONE);
768 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSetTwice)
771 SKIP_FLAG(has_output);
773 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
774 ASSERT_TRUE(error == TDM_ERROR_NONE);
776 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
777 ASSERT_TRUE(error == TDM_ERROR_NONE);
780 /* tdm_vblank_set_offset() */
782 TEST_F(TDMVblank, VblankSetOffsetFailNullVblank)
785 SKIP_FLAG(has_output);
787 error = tdm_vblank_set_offset(NULL, 10);
788 ASSERT_TRUE(error != TDM_ERROR_NONE);
791 TEST_F(TDMVblank, VblankSetOffsetFailFailWrongVblankPtr)
793 tdm_error error = TDM_ERROR_BAD_MODULE;
795 SKIP_FLAG(has_output);
797 ASSERT_EXIT({error = tdm_vblank_set_offset((tdm_vblank *)0xFFFFFFFF, 10);
798 if (error == TDM_ERROR_NONE)
802 ::testing::ExitedWithCode(0), "");
805 TEST_F(TDMVblank, VblankSetOffsetSuccess)
808 SKIP_FLAG(has_output);
810 error = tdm_vblank_set_offset(default_vblank, 50);
811 ASSERT_TRUE(error == TDM_ERROR_NONE);
814 TEST_F(TDMVblank, VblankSetOffsetSuccessSuccessSetTwice)
817 SKIP_FLAG(has_output);
819 error = tdm_vblank_set_offset(default_vblank, 50);
820 ASSERT_TRUE(error == TDM_ERROR_NONE);
822 error = tdm_vblank_set_offset(default_vblank, 50);
823 ASSERT_TRUE(error == TDM_ERROR_NONE);
826 /* tdm_vblank_get_offset() */
828 TEST_F(TDMVblank, VblankGetOffsetFailNullAll)
831 SKIP_FLAG(has_output);
833 error = tdm_vblank_get_offset(NULL, NULL);
834 ASSERT_TRUE(error != TDM_ERROR_NONE);
837 TEST_F(TDMVblank, VblankGetOffsetFailNullVblank)
841 SKIP_FLAG(has_output);
843 error = tdm_vblank_get_offset(NULL, &offset);
844 ASSERT_TRUE(error != TDM_ERROR_NONE);
847 TEST_F(TDMVblank, VblankGetOffsetFailNullOffset)
850 SKIP_FLAG(has_output);
852 error = tdm_vblank_get_offset(default_vblank, NULL);
853 ASSERT_TRUE(error != TDM_ERROR_NONE);
856 TEST_F(TDMVblank, VblankGetOffsetFailWrongVblankPtr)
858 tdm_error error = TDM_ERROR_BAD_MODULE;
860 SKIP_FLAG(has_output);
862 ASSERT_EXIT({error = tdm_vblank_get_offset((tdm_vblank *)0xFFFFFFFF, &offset);
863 if (error == TDM_ERROR_NONE)
867 ::testing::ExitedWithCode(0), "");
870 TEST_F(TDMVblank, VblankGetOffsetFailWrongOffsetPtr)
872 tdm_error error = TDM_ERROR_BAD_MODULE;
873 SKIP_FLAG(has_output);
875 ASSERT_EXIT({error = tdm_vblank_get_offset(default_vblank, (int *)0xFFFFFFFF);
876 if (error == TDM_ERROR_NONE)
880 ::testing::ExitedWithCode(0), "");
883 TEST_F(TDMVblank, VblankGetOffsetSuccesWithoutSet)
888 SKIP_FLAG(has_output);
890 error = tdm_vblank_get_offset(default_vblank, &offset);
891 ASSERT_TRUE(error == TDM_ERROR_NONE);
894 TEST_F(TDMVblank, VblankGetOffsetSucces)
897 int set_offset = 567;
900 SKIP_FLAG(has_output);
902 error = tdm_vblank_set_offset(default_vblank, set_offset);
903 ASSERT_TRUE(error != TDM_ERROR_NONE);
905 error = tdm_vblank_get_offset(default_vblank, &ret_offset);
906 ASSERT_TRUE(error != TDM_ERROR_NONE);
908 ASSERT_TRUE(set_offset == ret_offset);
911 /* tdm_vblank_set_enable_fake() */
913 TEST_F(TDMVblank, VblankSetEnableFakeFailNullVblank)
916 SKIP_FLAG(has_output);
918 error = tdm_vblank_set_enable_fake(NULL, 1);
919 ASSERT_TRUE(error != TDM_ERROR_NONE);
922 TEST_F(TDMVblank, VblankSetEnableFakeFailFailWrongVblankPtr)
924 tdm_error error = TDM_ERROR_BAD_MODULE;
926 SKIP_FLAG(has_output);
928 ASSERT_EXIT({error = tdm_vblank_set_enable_fake((tdm_vblank *)0xFFFFFFFF, 1);
929 if (error == TDM_ERROR_NONE)
933 ::testing::ExitedWithCode(0), "");
936 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSet)
939 SKIP_FLAG(has_output);
941 error = tdm_vblank_set_enable_fake(default_vblank, 1);
942 ASSERT_TRUE(error == TDM_ERROR_NONE);
945 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSetTwice)
948 SKIP_FLAG(has_output);
950 error = tdm_vblank_set_enable_fake(default_vblank, 1);
951 ASSERT_TRUE(error == TDM_ERROR_NONE);
953 error = tdm_vblank_set_enable_fake(default_vblank, 1);
954 ASSERT_TRUE(error == TDM_ERROR_NONE);
957 /* tdm_vblank_get_enable_fake() */
959 TEST_F(TDMVblank, VblankGetEnableFakeFailNullAll)
962 SKIP_FLAG(has_output);
964 error = tdm_vblank_get_enable_fake(NULL, NULL);
965 ASSERT_TRUE(error != TDM_ERROR_NONE);
968 TEST_F(TDMVblank, VblankGetEnableFakeFailNullVblank)
971 unsigned int enable_fake;
972 SKIP_FLAG(has_output);
974 error = tdm_vblank_get_enable_fake(NULL, &enable_fake);
975 ASSERT_TRUE(error != TDM_ERROR_NONE);
978 TEST_F(TDMVblank, VblankGetEnableFakeFailNullEnableFake)
981 SKIP_FLAG(has_output);
983 error = tdm_vblank_get_enable_fake(default_vblank, NULL);
984 ASSERT_TRUE(error != TDM_ERROR_NONE);
987 TEST_F(TDMVblank, VblankGetEnableFakeFailWrongVblankPtr)
989 tdm_error error = TDM_ERROR_BAD_MODULE;
990 unsigned int enable_fake;
991 SKIP_FLAG(has_output);
993 ASSERT_EXIT({error = tdm_vblank_get_enable_fake((tdm_vblank *)0xFFFFFFFF, &enable_fake);
994 if (error == TDM_ERROR_NONE)
998 ::testing::ExitedWithCode(0), "");
1001 TEST_F(TDMVblank, DISABLED_VblankGetEnableFakeFailWrongOffsetPtr)
1003 tdm_error error = TDM_ERROR_BAD_MODULE;
1004 SKIP_FLAG(has_output);
1006 ASSERT_EXIT({error = tdm_vblank_get_enable_fake(default_vblank, (unsigned int *)0xFFFFFFFF);
1007 if (error == TDM_ERROR_NONE)
1011 ::testing::ExitedWithCode(0), "");
1014 TEST_F(TDMVblank, VblankGetEnableFakeSuccessWithoutSet)
1017 unsigned int enable_fake;
1019 SKIP_FLAG(has_output);
1021 error = tdm_vblank_get_enable_fake(default_vblank, &enable_fake);
1022 ASSERT_TRUE(error == TDM_ERROR_NONE);
1025 TEST_F(TDMVblank, VblankGetEnableFakeSuccess)
1028 unsigned int set_enable_fake = 1;
1029 unsigned int ret_enable_fake;
1031 SKIP_FLAG(has_output);
1033 error = tdm_vblank_set_enable_fake(default_vblank, set_enable_fake);
1034 ASSERT_TRUE(error == TDM_ERROR_NONE);
1036 error = tdm_vblank_get_enable_fake(default_vblank, &ret_enable_fake);
1037 ASSERT_TRUE(error == TDM_ERROR_NONE);
1039 ASSERT_TRUE(set_enable_fake == ret_enable_fake);
1042 /* tdm_vblank_set_client_vblank_fps() */
1044 /* TODO: need to create the tdm client */
1045 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullAll)
1049 SKIP_FLAG(has_output);
1051 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1052 ASSERT_TRUE(error != TDM_ERROR_NONE);
1055 /* TODO: need to create the tdm client */
1056 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullPid)
1060 SKIP_FLAG(has_output);
1062 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1063 ASSERT_TRUE(error != TDM_ERROR_NONE);
1066 /* tdm_vblank_wait() */
1068 TEST_F(TDMVblank, VblankWaitFailNullAll)
1072 SKIP_FLAG(has_output);
1074 error = tdm_vblank_wait(NULL, 0, 0, 0, NULL, NULL);
1075 ASSERT_TRUE(error != TDM_ERROR_NONE);
1078 TEST_F(TDMVblankWait, VblankWaitFailNullVblank)
1082 SKIP_FLAG(has_output);
1084 error = tdm_vblank_wait(NULL, 0, 0, 1, UtVblankHandler, NULL);
1085 ASSERT_TRUE(error != TDM_ERROR_NONE);
1088 TEST_F(TDMVblankWait, VblankWaitFailNullFunc)
1092 SKIP_FLAG(has_output);
1094 error = tdm_vblank_wait(default_vblank, 0, 0, 1, NULL, NULL);
1095 ASSERT_TRUE(error != TDM_ERROR_NONE);
1098 TEST_F(TDMVblankWait, VblankWaitFailWrongVblankPtr)
1100 tdm_error error = TDM_ERROR_BAD_MODULE;
1101 SKIP_FLAG(has_output);
1103 ASSERT_EXIT({error = tdm_vblank_wait((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1104 if (error == TDM_ERROR_NONE)
1108 ::testing::ExitedWithCode(0), "");
1111 void *UtWaitVblankThreadHndl(void *ptr)
1114 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1116 error = tdm_vblank_wait(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1117 if (error != TDM_ERROR_NONE)
1118 vblankWait->utWaitVblankThreadHndlResult = 0;
1120 vblankWait->utWaitVblankThreadHndlResult = 0;
1123 TEST_F(TDMVblankWait, VblankWaitFailInOtherThread)
1127 SKIP_FLAG(has_output);
1129 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankThreadHndl, this));
1131 ASSERT_FALSE(pthread_join(thread, NULL));
1133 ASSERT_FALSE(utWaitVblankThreadHndlResult);
1136 TEST_F(TDMVblankWait, VblankWaitFailDisconnectedOutput)
1140 SKIP_FLAG(has_output);
1142 if (!discon_output_vblank)
1145 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1146 ASSERT_TRUE(error != TDM_ERROR_NONE);
1149 TEST_F(TDMVblankWait, VblankWaitFailDpmsOff)
1153 SKIP_FLAG(has_output);
1155 if (!con_output_vblank)
1158 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1159 ASSERT_TRUE(error == TDM_ERROR_NONE);
1161 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1162 ASSERT_TRUE(error != TDM_ERROR_NONE);
1165 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefresh)
1170 SKIP_FLAG(has_output);
1172 if (!con_output_vblank)
1175 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1176 ASSERT_TRUE(error == TDM_ERROR_NONE);
1178 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1179 ASSERT_TRUE(error == TDM_ERROR_NONE);
1181 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1182 ASSERT_TRUE(error == TDM_ERROR_NONE);
1184 UtHandleVblankEvent();
1186 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1187 ASSERT_TRUE(data == 1);
1190 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1195 SKIP_FLAG(has_output);
1197 if (!con_output_vblank)
1200 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1201 ASSERT_TRUE(error == TDM_ERROR_NONE);
1203 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1204 ASSERT_TRUE(error == TDM_ERROR_NONE);
1206 for (int i = 0; i < 10; ++i) {
1207 utVblankHandlerIsCalled = 0;
1210 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1211 ASSERT_TRUE(error == TDM_ERROR_NONE);
1213 UtHandleVblankEvent();
1215 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1216 ASSERT_TRUE(data == 1);
1220 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutput)
1225 SKIP_FLAG(has_output);
1227 if (!discon_output_vblank)
1230 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1231 ASSERT_TRUE(error == TDM_ERROR_NONE);
1233 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1234 ASSERT_TRUE(error == TDM_ERROR_NONE);
1236 UtHandleVblankEvent();
1238 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1239 ASSERT_TRUE(data == 1);
1242 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutputRepeatedly)
1247 SKIP_FLAG(has_output);
1249 if (!discon_output_vblank)
1252 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1253 ASSERT_TRUE(error == TDM_ERROR_NONE);
1255 for (int i = 0; i < 10; ++i) {
1256 utVblankHandlerIsCalled = 0;
1259 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1260 ASSERT_TRUE(error == TDM_ERROR_NONE);
1262 UtHandleVblankEvent();
1264 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1265 ASSERT_TRUE(data == 1);
1269 TEST_F(TDMVblankWait, VblankWaitSuccessHW)
1274 SKIP_FLAG(has_output);
1276 if (!con_output_vblank)
1279 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1280 ASSERT_TRUE(error == TDM_ERROR_NONE);
1282 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1283 ASSERT_TRUE(error == TDM_ERROR_NONE);
1285 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1286 ASSERT_TRUE(error == TDM_ERROR_NONE);
1288 error = tdm_vblank_set_offset(con_output_vblank, 0);
1289 ASSERT_TRUE(error == TDM_ERROR_NONE);
1291 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1292 ASSERT_TRUE(error == TDM_ERROR_NONE);
1294 UtHandleVblankEvent();
1296 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1297 ASSERT_TRUE(data == 1);
1300 TEST_F(TDMVblankWait, VblankWaitSuccessDestroy)
1305 SKIP_FLAG(has_output);
1307 if (!con_output_vblank)
1310 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1311 ASSERT_TRUE(error == TDM_ERROR_NONE);
1313 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1314 ASSERT_TRUE(error == TDM_ERROR_NONE);
1316 error = tdm_vblank_set_offset(con_output_vblank, 0);
1317 ASSERT_TRUE(error == TDM_ERROR_NONE);
1319 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1320 ASSERT_TRUE(error == TDM_ERROR_NONE);
1322 tdm_vblank_destroy(con_output_vblank);
1324 ASSERT_TRUE(utVblankHandlerIsCalled == 0);
1325 ASSERT_TRUE(data == 0);
1328 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpms)
1333 SKIP_FLAG(has_output);
1335 if (!con_output_vblank)
1338 error = tdm_vblank_set_enable_fake(con_output_vblank, 0);
1339 ASSERT_TRUE(error == TDM_ERROR_NONE);
1341 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1342 ASSERT_TRUE(error == TDM_ERROR_NONE);
1344 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1345 ASSERT_TRUE(error == TDM_ERROR_NONE);
1347 error = tdm_vblank_set_offset(con_output_vblank, 0);
1348 ASSERT_TRUE(error == TDM_ERROR_NONE);
1350 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1351 ASSERT_TRUE(error == TDM_ERROR_NONE);
1353 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1354 ASSERT_TRUE(error == TDM_ERROR_NONE);
1356 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1357 ASSERT_TRUE(data == 1);
1360 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpmsWithEnableFake)
1365 SKIP_FLAG(has_output);
1367 if (!con_output_vblank)
1370 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1371 ASSERT_TRUE(error == TDM_ERROR_NONE);
1373 error = tdm_vblank_set_enable_fake(con_output_vblank, 1);
1374 ASSERT_TRUE(error == TDM_ERROR_NONE);
1376 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1377 ASSERT_TRUE(error == TDM_ERROR_NONE);
1379 error = tdm_vblank_set_offset(con_output_vblank, 0);
1380 ASSERT_TRUE(error == TDM_ERROR_NONE);
1382 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1383 ASSERT_TRUE(error == TDM_ERROR_NONE);
1385 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1386 ASSERT_TRUE(error == TDM_ERROR_NONE);
1388 UtHandleVblankEvent();
1390 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1391 ASSERT_TRUE(data == 1);
1394 TEST_F(TDMVblankWait, VblankWaitSuccessHWRepeatedly)
1399 SKIP_FLAG(has_output);
1401 if (!con_output_vblank)
1404 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1405 ASSERT_TRUE(error == TDM_ERROR_NONE);
1407 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1408 ASSERT_TRUE(error == TDM_ERROR_NONE);
1410 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1411 ASSERT_TRUE(error == TDM_ERROR_NONE);
1413 error = tdm_vblank_set_offset(con_output_vblank, 0);
1414 ASSERT_TRUE(error == TDM_ERROR_NONE);
1416 for (int i = 0; i < 10; ++i) {
1417 utVblankHandlerIsCalled = 0;
1420 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1421 ASSERT_TRUE(error == TDM_ERROR_NONE);
1423 UtHandleVblankEvent();
1425 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1426 ASSERT_TRUE(data == 1);
1430 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZero)
1435 SKIP_FLAG(has_output);
1437 if (!con_output_vblank)
1440 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1441 ASSERT_TRUE(error == TDM_ERROR_NONE);
1443 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1444 ASSERT_TRUE(error == TDM_ERROR_NONE);
1446 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1447 ASSERT_TRUE(error == TDM_ERROR_NONE);
1449 error = tdm_vblank_set_offset(con_output_vblank, 10);
1450 ASSERT_TRUE(error == TDM_ERROR_NONE);
1452 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1453 ASSERT_TRUE(error == TDM_ERROR_NONE);
1455 UtHandleVblankEvent();
1457 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1458 ASSERT_TRUE(data == 1);
1461 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1466 SKIP_FLAG(has_output);
1468 if (!con_output_vblank)
1471 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1472 ASSERT_TRUE(error == TDM_ERROR_NONE);
1474 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1475 ASSERT_TRUE(error == TDM_ERROR_NONE);
1477 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1478 ASSERT_TRUE(error == TDM_ERROR_NONE);
1480 error = tdm_vblank_set_offset(con_output_vblank, 10);
1481 ASSERT_TRUE(error == TDM_ERROR_NONE);
1483 for (int i = 0; i < 10; ++i) {
1484 utVblankHandlerIsCalled = 0;
1487 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1488 ASSERT_TRUE(error == TDM_ERROR_NONE);
1490 UtHandleVblankEvent();
1492 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1493 ASSERT_TRUE(data == 1);
1497 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefresh)
1502 SKIP_FLAG(has_output);
1504 if (!con_output_vblank)
1507 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1508 ASSERT_TRUE(error == TDM_ERROR_NONE);
1510 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1511 ASSERT_TRUE(error == TDM_ERROR_NONE);
1513 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1514 ASSERT_TRUE(error == TDM_ERROR_NONE);
1516 UtHandleVblankEvent();
1518 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1519 ASSERT_TRUE(data == 1);
1522 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1527 SKIP_FLAG(has_output);
1529 if (!con_output_vblank)
1532 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1533 ASSERT_TRUE(error == TDM_ERROR_NONE);
1535 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1536 ASSERT_TRUE(error == TDM_ERROR_NONE);
1538 for (int i = 0; i < 10; ++i) {
1539 utVblankHandlerIsCalled = 0;
1542 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1543 ASSERT_TRUE(error == TDM_ERROR_NONE);
1545 UtHandleVblankEvent();
1547 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1548 ASSERT_TRUE(data == 1);
1552 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutput)
1557 SKIP_FLAG(has_output);
1559 if (!discon_output_vblank)
1562 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1563 ASSERT_TRUE(error == TDM_ERROR_NONE);
1565 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1566 ASSERT_TRUE(error == TDM_ERROR_NONE);
1568 UtHandleVblankEvent();
1570 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1571 ASSERT_TRUE(data == 1);
1574 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutputRepeatedly)
1579 SKIP_FLAG(has_output);
1581 if (!discon_output_vblank)
1584 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1585 ASSERT_TRUE(error == TDM_ERROR_NONE);
1587 for (int i = 0; i < 10; ++i) {
1588 utVblankHandlerIsCalled = 0;
1591 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1592 ASSERT_TRUE(error == TDM_ERROR_NONE);
1594 UtHandleVblankEvent();
1596 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1597 ASSERT_TRUE(data == 1);
1601 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHW)
1606 SKIP_FLAG(has_output);
1608 if (!con_output_vblank)
1611 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1612 ASSERT_TRUE(error == TDM_ERROR_NONE);
1614 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1615 ASSERT_TRUE(error == TDM_ERROR_NONE);
1617 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1618 ASSERT_TRUE(error == TDM_ERROR_NONE);
1620 error = tdm_vblank_set_offset(con_output_vblank, 0);
1621 ASSERT_TRUE(error == TDM_ERROR_NONE);
1623 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1624 ASSERT_TRUE(error == TDM_ERROR_NONE);
1626 UtHandleVblankEvent();
1628 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1629 ASSERT_TRUE(data == 1);
1632 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHWRepeatedly)
1637 SKIP_FLAG(has_output);
1639 if (!con_output_vblank)
1642 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1643 ASSERT_TRUE(error == TDM_ERROR_NONE);
1645 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1646 ASSERT_TRUE(error == TDM_ERROR_NONE);
1648 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1649 ASSERT_TRUE(error == TDM_ERROR_NONE);
1651 error = tdm_vblank_set_offset(con_output_vblank, 0);
1652 ASSERT_TRUE(error == TDM_ERROR_NONE);
1654 for (int i = 0; i < 10; ++i) {
1655 utVblankHandlerIsCalled = 0;
1658 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1659 ASSERT_TRUE(error == TDM_ERROR_NONE);
1661 UtHandleVblankEvent();
1663 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1664 ASSERT_TRUE(data == 1);
1668 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZero)
1673 SKIP_FLAG(has_output);
1675 if (!con_output_vblank)
1678 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1679 ASSERT_TRUE(error == TDM_ERROR_NONE);
1681 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1682 ASSERT_TRUE(error == TDM_ERROR_NONE);
1684 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1685 ASSERT_TRUE(error == TDM_ERROR_NONE);
1687 error = tdm_vblank_set_offset(con_output_vblank, 10);
1688 ASSERT_TRUE(error == TDM_ERROR_NONE);
1690 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1691 ASSERT_TRUE(error == TDM_ERROR_NONE);
1693 UtHandleVblankEvent();
1695 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1696 ASSERT_TRUE(data == 1);
1699 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1704 SKIP_FLAG(has_output);
1706 if (!con_output_vblank)
1709 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1710 ASSERT_TRUE(error == TDM_ERROR_NONE);
1712 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1713 ASSERT_TRUE(error == TDM_ERROR_NONE);
1715 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1716 ASSERT_TRUE(error == TDM_ERROR_NONE);
1718 error = tdm_vblank_set_offset(con_output_vblank, 10);
1719 ASSERT_TRUE(error == TDM_ERROR_NONE);
1721 for (int i = 0; i < 10; ++i) {
1722 utVblankHandlerIsCalled = 0;
1725 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1726 ASSERT_TRUE(error == TDM_ERROR_NONE);
1728 UtHandleVblankEvent();
1730 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1731 ASSERT_TRUE(data == 1);
1735 /* tdm_vblank_wait_seq() */
1737 TEST_F(TDMVblank, VblankWaitSeqFailNullAll)
1741 SKIP_FLAG(has_output);
1743 error = tdm_vblank_wait_seq(NULL, 0, 0, 0, NULL, NULL);
1744 ASSERT_TRUE(error != TDM_ERROR_NONE);
1747 TEST_F(TDMVblankWait, VblankWaitSeqFailNullVblank)
1751 SKIP_FLAG(has_output);
1753 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1754 ASSERT_TRUE(error != TDM_ERROR_NONE);
1757 TEST_F(TDMVblankWait, VblankWaitSeqFailWrongVblankPtr)
1759 tdm_error error = TDM_ERROR_BAD_MODULE;
1760 SKIP_FLAG(has_output);
1762 ASSERT_EXIT({error = tdm_vblank_wait_seq((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1763 if (error == TDM_ERROR_NONE)
1767 ::testing::ExitedWithCode(0), "");
1770 TEST_F(TDMVblankWait, VblankWaitSeqFailNullFunc)
1774 SKIP_FLAG(has_output);
1776 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1777 ASSERT_TRUE(error != TDM_ERROR_NONE);
1780 void *UtWaitVblankSeqThreadHndl(void *ptr)
1783 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1785 error = tdm_vblank_wait_seq(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1786 if (error != TDM_ERROR_NONE)
1787 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1789 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1792 TEST_F(TDMVblankWait, VblankWaitSeqFailInOtherThread)
1796 SKIP_FLAG(has_output);
1798 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankSeqThreadHndl, this));
1800 ASSERT_FALSE(pthread_join(thread, NULL));
1802 ASSERT_FALSE(utWaitVblankSeqThreadHndlResult);
1805 TEST_F(TDMVblankWait, VblankWaitSeqFailDisconnectedOutput)
1809 SKIP_FLAG(has_output);
1811 if (!discon_output_vblank)
1814 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1815 ASSERT_TRUE(error != TDM_ERROR_NONE);
1818 TEST_F(TDMVblankWait, VblankWaitSeqFailDpmsOff)
1822 SKIP_FLAG(has_output);
1824 if (!con_output_vblank)
1827 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1828 ASSERT_TRUE(error == TDM_ERROR_NONE);
1830 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1831 ASSERT_TRUE(error != TDM_ERROR_NONE);
1834 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefresh)
1839 SKIP_FLAG(has_output);
1841 if (!con_output_vblank)
1844 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1845 ASSERT_TRUE(error == TDM_ERROR_NONE);
1847 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1848 ASSERT_TRUE(error == TDM_ERROR_NONE);
1850 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1851 ASSERT_TRUE(error == TDM_ERROR_NONE);
1853 UtHandleVblankEvent();
1855 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1856 ASSERT_TRUE(data == 1);
1859 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefreshRepeatedly)
1864 SKIP_FLAG(has_output);
1866 if (!con_output_vblank)
1869 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1870 ASSERT_TRUE(error == TDM_ERROR_NONE);
1872 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1873 ASSERT_TRUE(error == TDM_ERROR_NONE);
1875 for (int i = 1; i < 10; ++i) {
1876 utVblankHandlerIsCalled = 0;
1879 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1880 ASSERT_TRUE(error == TDM_ERROR_NONE);
1882 UtHandleVblankEvent();
1884 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1885 ASSERT_TRUE(data == 1);
1889 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutput)
1894 SKIP_FLAG(has_output);
1896 if (!discon_output_vblank)
1899 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1900 ASSERT_TRUE(error == TDM_ERROR_NONE);
1902 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1903 ASSERT_TRUE(error == TDM_ERROR_NONE);
1905 UtHandleVblankEvent();
1907 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1908 ASSERT_TRUE(data == 1);
1911 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutputRepeatedly)
1916 SKIP_FLAG(has_output);
1918 if (!discon_output_vblank)
1921 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1922 ASSERT_TRUE(error == TDM_ERROR_NONE);
1924 for (int i = 1; i < 10; ++i) {
1925 utVblankHandlerIsCalled = 0;
1928 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, i, UtVblankHandler, &data);
1929 ASSERT_TRUE(error == TDM_ERROR_NONE);
1931 UtHandleVblankEvent();
1933 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1934 ASSERT_TRUE(data == 1);
1938 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHW)
1943 SKIP_FLAG(has_output);
1945 if (!con_output_vblank)
1948 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1949 ASSERT_TRUE(error == TDM_ERROR_NONE);
1951 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1952 ASSERT_TRUE(error == TDM_ERROR_NONE);
1954 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1955 ASSERT_TRUE(error == TDM_ERROR_NONE);
1957 error = tdm_vblank_set_offset(con_output_vblank, 0);
1958 ASSERT_TRUE(error == TDM_ERROR_NONE);
1960 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1961 ASSERT_TRUE(error == TDM_ERROR_NONE);
1963 UtHandleVblankEvent();
1965 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1966 ASSERT_TRUE(data == 1);
1969 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHWRepeatedly)
1974 SKIP_FLAG(has_output);
1976 if (!con_output_vblank)
1979 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1980 ASSERT_TRUE(error == TDM_ERROR_NONE);
1982 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1983 ASSERT_TRUE(error == TDM_ERROR_NONE);
1985 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1986 ASSERT_TRUE(error == TDM_ERROR_NONE);
1988 error = tdm_vblank_set_offset(con_output_vblank, 0);
1989 ASSERT_TRUE(error == TDM_ERROR_NONE);
1991 for (int i = 1; i < 10; ++i) {
1992 utVblankHandlerIsCalled = 0;
1995 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1996 ASSERT_TRUE(error == TDM_ERROR_NONE);
1998 UtHandleVblankEvent();
2000 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2001 ASSERT_TRUE(data == 1);
2005 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZero)
2010 SKIP_FLAG(has_output);
2012 if (!con_output_vblank)
2015 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2016 ASSERT_TRUE(error == TDM_ERROR_NONE);
2018 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2019 ASSERT_TRUE(error == TDM_ERROR_NONE);
2021 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2022 ASSERT_TRUE(error == TDM_ERROR_NONE);
2024 error = tdm_vblank_set_offset(con_output_vblank, 10);
2025 ASSERT_TRUE(error == TDM_ERROR_NONE);
2027 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
2028 ASSERT_TRUE(error == TDM_ERROR_NONE);
2030 UtHandleVblankEvent();
2032 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2033 ASSERT_TRUE(data == 1);
2036 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZeroRepeatedly)
2041 SKIP_FLAG(has_output);
2043 if (!con_output_vblank)
2046 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2047 ASSERT_TRUE(error == TDM_ERROR_NONE);
2049 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2050 ASSERT_TRUE(error == TDM_ERROR_NONE);
2052 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2053 ASSERT_TRUE(error == TDM_ERROR_NONE);
2055 error = tdm_vblank_set_offset(con_output_vblank, 10);
2056 ASSERT_TRUE(error == TDM_ERROR_NONE);
2058 for (int i = 1; i < 10; ++i) {
2059 utVblankHandlerIsCalled = 0;
2061 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2062 ASSERT_TRUE(error == TDM_ERROR_NONE);
2064 UtHandleVblankEvent();
2066 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2067 ASSERT_TRUE(data == 1);
2071 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithSameSeq)
2076 SKIP_FLAG(has_output);
2078 if (!con_output_vblank)
2081 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2082 ASSERT_TRUE(error == TDM_ERROR_NONE);
2084 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2085 ASSERT_TRUE(error == TDM_ERROR_NONE);
2087 error = tdm_vblank_set_offset(con_output_vblank, 0);
2088 ASSERT_TRUE(error == TDM_ERROR_NONE);
2090 for (int i = 1; i < 10; ++i) {
2091 utVblankHandlerIsCalled = 0;
2094 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 2, UtVblankHandler, &data);
2095 ASSERT_TRUE(error == TDM_ERROR_NONE);
2097 UtHandleVblankEvent();
2099 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2100 ASSERT_TRUE(data == 1);
2104 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithBigFps)
2109 SKIP_FLAG(has_output);
2111 if (!con_output_vblank)
2114 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2115 ASSERT_TRUE(error == TDM_ERROR_NONE);
2117 error = tdm_vblank_set_fps(con_output_vblank, 5000);
2118 ASSERT_TRUE(error == TDM_ERROR_NONE);
2120 for (int i = 1; i < 10; ++i) {
2121 utVblankHandlerIsCalled = 0;
2124 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2125 ASSERT_TRUE(error == TDM_ERROR_NONE);
2130 UtHandleVblankEvent();
2132 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2133 ASSERT_TRUE(data == 1);
2137 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithDelay)
2142 SKIP_FLAG(has_output);
2144 if (!con_output_vblank)
2147 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2148 ASSERT_TRUE(error == TDM_ERROR_NONE);
2150 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2151 ASSERT_TRUE(error == TDM_ERROR_NONE);
2153 for (int i = 1; i < 10; ++i) {
2154 utVblankHandlerIsCalled = 0;
2157 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2158 ASSERT_TRUE(error == TDM_ERROR_NONE);
2162 UtHandleVblankEvent();
2164 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2165 ASSERT_TRUE(data == 1);