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 "tdm_config.h"
34 #include "tbm_bufmgr.h"
36 #include <sys/epoll.h>
37 #include <sys/timerfd.h>
40 class TDMVblankWithoutCreating: public ::testing::Test {
42 tbm_bufmgr bufmgr = NULL;
43 tdm_display *dpy = NULL;
46 tdm_output *connected_output = NULL;
47 const tdm_output_mode *preferred_mode = NULL;
48 tdm_output *disconnected_output = NULL;
49 tdm_output *default_output = NULL;
53 tdm_output_conn_status status;
54 tdm_error error = TDM_ERROR_NONE;
56 setenv("XDG_RUNTIME_DIR", "/run", 1);
57 setenv("TBM_DISPLAY_SERVER", "1", 1);
58 tdm_config_set_int(TDM_CONFIG_KEY_DEBUG_DLOG, 1);
59 tdm_config_set_int(TDM_CONFIG_KEY_GENERAL_THREAD, 0);
60 tdm_config_set_int(TDM_CONFIG_KEY_GENERAL_COMMIT_PER_VBLANK, 0);
61 tdm_config_set_int(TDM_CONFIG_KEY_DEBUG_LOG_LEVEL, 4);
62 tdm_config_set_string(TDM_CONFIG_KEY_DEBUG_MODULE, "vblank,thread");
64 /* FIXME: fix the error. If we initialize TBM before TDM we get fail
65 * in the tdm_output_set_dpms */
67 bufmgr = tbm_bufmgr_init(-1);
68 ASSERT_FALSE(bufmgr == NULL);
71 dpy = tdm_display_init(&error);
72 ASSERT_TRUE(error == TDM_ERROR_NONE);
73 ASSERT_FALSE(dpy == NULL);
75 error = tdm_display_get_output_count(dpy, &output_count);
76 ASSERT_TRUE(error == TDM_ERROR_NONE);
82 for(int i = 0; i < output_count; i++) {
83 output = tdm_display_get_output(dpy, i, &error);
84 ASSERT_TRUE(error == TDM_ERROR_NONE);
85 ASSERT_FALSE(dpy == NULL);
87 error = tdm_output_get_conn_status(output, &status);
88 ASSERT_TRUE(error == TDM_ERROR_NONE);
90 if (status != TDM_OUTPUT_CONN_STATUS_DISCONNECTED)
91 connected_output = output;
93 disconnected_output = output;
96 default_output = disconnected_output;
98 if (connected_output) {
99 int output_modes_cnt = 0;
100 const tdm_output_mode* output_modes;
102 error = tdm_output_get_available_modes(connected_output, &output_modes, &output_modes_cnt);
103 ASSERT_TRUE(error == TDM_ERROR_NONE);
104 if (output_modes_cnt <= 0) {
105 connected_output = NULL;
109 for(int i = 0; i < output_modes_cnt; i++) {
110 if(output_modes[i].type & TDM_OUTPUT_MODE_TYPE_PREFERRED) {
111 preferred_mode = &output_modes[i];
113 default_output = connected_output;
120 connected_output = NULL;
124 if (connected_output)
125 tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
127 tbm_bufmgr_deinit(bufmgr);
129 tdm_display_deinit(dpy);
136 class TDMVblank: public TDMVblankWithoutCreating {
138 tdm_vblank *con_output_vblank = NULL;
139 tdm_vblank *discon_output_vblank = NULL;
140 tdm_output *default_vblank = NULL;
141 int setModeAndDpms = 0;
142 tbm_surface_h buffer = NULL;
143 tdm_layer *layer = NULL;
149 ASSERT_NO_FATAL_FAILURE(TDMVblankWithoutCreating::SetUp());
151 if (connected_output && setModeAndDpms) {
153 tdm_info_layer info = {0};
155 error = tdm_output_set_mode(connected_output, preferred_mode);
156 ASSERT_TRUE(error == TDM_ERROR_NONE);
158 error = tdm_output_get_primary_index(connected_output, &primary_index);
159 ASSERT_TRUE(error == TDM_ERROR_NONE);
161 layer = tdm_output_get_layer(connected_output, primary_index, &error);
162 ASSERT_TRUE(error == TDM_ERROR_NONE);
163 ASSERT_TRUE(layer != NULL);
165 info.src_config.size.h = preferred_mode->hdisplay;
166 info.src_config.size.v = preferred_mode->vdisplay;
167 info.src_config.pos.x = 0;
168 info.src_config.pos.y = 0;
169 info.src_config.pos.w = preferred_mode->hdisplay;
170 info.src_config.pos.h = preferred_mode->vdisplay;
171 info.src_config.format = TBM_FORMAT_ARGB8888;
174 info.dst_pos.w = preferred_mode->hdisplay;
175 info.dst_pos.h = preferred_mode->vdisplay;
176 info.transform = TDM_TRANSFORM_NORMAL;
178 error = tdm_layer_set_info(layer, &info);
179 ASSERT_TRUE(error == TDM_ERROR_NONE);
181 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_ON);
182 ASSERT_TRUE(error == TDM_ERROR_NONE);
184 buffer = tbm_surface_internal_create_with_flags(preferred_mode->hdisplay,
185 preferred_mode->vdisplay,
188 ASSERT_TRUE(buffer != NULL);
190 error = tdm_layer_set_buffer(layer, buffer);
191 ASSERT_TRUE(error == TDM_ERROR_NONE);
193 error = tdm_output_commit(connected_output, 0, NULL, NULL);
194 ASSERT_TRUE(error == TDM_ERROR_NONE);
195 /* TODO: use a commit handler instead of an usleep to wait when
196 * commit will be applied */
200 if (disconnected_output) {
201 discon_output_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
202 EXPECT_TRUE(discon_output_vblank != NULL);
203 EXPECT_TRUE(error == TDM_ERROR_NONE);
204 default_vblank = discon_output_vblank;
207 if (connected_output) {
208 con_output_vblank = tdm_vblank_create(dpy, connected_output, &error);
209 EXPECT_TRUE(con_output_vblank != NULL);
210 EXPECT_TRUE(error == TDM_ERROR_NONE);
211 default_vblank = con_output_vblank;
214 ASSERT_TRUE(default_vblank != NULL);
220 tdm_layer_unset_buffer(layer);
221 tdm_output_commit(connected_output, 0, NULL, NULL);
222 tbm_surface_destroy(buffer);
225 TDMVblankWithoutCreating::TearDown();
229 class TDMVblankWait : public TDMVblank {
231 static int utVblankHandlerIsCalled;
232 static void UtVblankHandler(tdm_vblank *vblank, tdm_error error, unsigned int sequence,
233 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
235 int *data = (int *)user_data;
240 utVblankHandlerIsCalled = 1;
242 int utWaitVblankThreadHndlResult = -1;
243 friend void *UtWaitVblankThreadHndl(void *ptr);
244 int utWaitVblankSeqThreadHndlResult = -1;
245 friend void *UtWaitVblankSeqThreadHndl(void *ptr);
251 static const int timeLimitSec = 1;
256 struct epoll_event ep;
258 utVblankHandlerIsCalled = 0;
262 ASSERT_NO_FATAL_FAILURE(TDMVblank::SetUp());
264 epFd = epoll_create1(0);
265 ASSERT_TRUE(epFd != -1);
267 timerFd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC | TFD_NONBLOCK);
268 ASSERT_TRUE(timerFd != -1);
270 memset(&ep, 0, sizeof ep);
271 ep.events |= EPOLLIN;
272 ep.data.fd = timerFd;
273 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, timerFd, &ep) == 0);
275 ASSERT_TRUE(tdm_display_get_fd(dpy, &tdmFd) == TDM_ERROR_NONE);
277 memset(&ep, 0, sizeof ep);
278 ep.events |= EPOLLIN;
280 ASSERT_TRUE(epoll_ctl(epFd, EPOLL_CTL_ADD, tdmFd, &ep) == 0);
283 void UtHandleVblankEvent()
285 struct itimerspec its;
287 struct epoll_event ep_event[2];
289 if (utVblankHandlerIsCalled)
292 its.it_interval.tv_sec = 0;
293 its.it_interval.tv_nsec = 0;
294 its.it_value.tv_sec = timeLimitSec;
295 its.it_value.tv_nsec = 0;
297 ASSERT_TRUE(timerfd_settime(timerFd, 0, &its, NULL) == 0);
300 count = epoll_wait(epFd, ep_event, sizeof(ep_event), -1);
301 ASSERT_TRUE(count >= 0);
303 for (int i = 0; i < count; i++) {
304 if (ep_event[i].data.fd == timerFd) {
307 ASSERT_TRUE(tdm_display_handle_events(dpy) == TDM_ERROR_NONE);
308 if (utVblankHandlerIsCalled)
316 class TDMVblankWaitThread : public TDMVblankWait {
320 setenv("TDM_THREAD", "1", 1);
321 ASSERT_NO_FATAL_FAILURE(TDMVblankWait::SetUp());
325 int TDMVblankWait::utVblankHandlerIsCalled = 0;
327 /* tdm_vblank_enable_global_fps() */
329 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpFailFpsNull)
331 tdm_error error = TDM_ERROR_BAD_MODULE;
333 SKIP_FLAG(has_output);
334 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 0);
335 if (error == TDM_ERROR_NONE)
338 ::testing::ExitedWithCode(0), "");
341 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessEnable)
343 tdm_error error = TDM_ERROR_BAD_MODULE;
345 SKIP_FLAG(has_output);
346 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(1, 60);
347 if (error != TDM_ERROR_NONE)
350 ::testing::ExitedWithCode(0), "");
353 TEST_F(TDMVblankWithoutCreating, VblankEnableGlobalFpsSuccessDisable)
355 tdm_error error = TDM_ERROR_BAD_MODULE;
357 SKIP_FLAG(has_output);
358 ASSERT_EXIT({error = tdm_vblank_enable_global_fps(0, 0);
359 if (error != TDM_ERROR_NONE)
362 ::testing::ExitedWithCode(0), "");
365 /* tdm_vblank_create() */
367 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullAll)
369 tdm_vblank *ret_vblank;
371 SKIP_FLAG(has_output);
373 ret_vblank = tdm_vblank_create(NULL, NULL, NULL);
374 ASSERT_TRUE(ret_vblank == NULL);
377 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullDpy)
379 tdm_vblank *ret_vblank;
382 SKIP_FLAG(has_output);
384 ret_vblank = tdm_vblank_create(NULL, default_output, &error);
385 ASSERT_TRUE(ret_vblank == NULL);
386 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
389 TEST_F(TDMVblankWithoutCreating, VblankCreateFailNullOutput)
391 tdm_vblank *ret_vblank;
394 SKIP_FLAG(has_output);
396 ret_vblank = tdm_vblank_create(dpy, NULL, &error);
397 ASSERT_TRUE(ret_vblank == NULL);
398 ASSERT_TRUE(error == TDM_ERROR_INVALID_PARAMETER);
401 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongDpy)
403 tdm_vblank *ret_vblank = NULL;
406 SKIP_FLAG(has_output);
408 ASSERT_EXIT({ret_vblank = tdm_vblank_create((tdm_display *)0xFFFFFFFF, default_output, &error);
409 if (ret_vblank || error == TDM_ERROR_NONE)
413 ::testing::ExitedWithCode(0), "");
416 TEST_F(TDMVblankWithoutCreating, VblankCreateFailWrongOutput)
418 tdm_vblank *ret_vblank = NULL;
421 SKIP_FLAG(has_output);
423 ASSERT_EXIT({ret_vblank = tdm_vblank_create(dpy, (tdm_output *)0xFFFFFFFF, &error);
424 if (ret_vblank || error == TDM_ERROR_NONE)
428 ::testing::ExitedWithCode(0), "");
431 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForConnectedOutput)
433 tdm_vblank *ret_vblank;
436 SKIP_FLAG(has_output);
438 if (!connected_output)
441 ret_vblank = tdm_vblank_create(dpy, connected_output, &error);
442 ASSERT_TRUE(ret_vblank != NULL);
443 ASSERT_TRUE(error == TDM_ERROR_NONE);
446 TEST_F(TDMVblankWithoutCreating, VblankCreateSuccessForDisconnectedOutput)
448 tdm_vblank *ret_vblank;
451 SKIP_FLAG(has_output);
453 if (!disconnected_output)
456 ret_vblank = tdm_vblank_create(dpy, disconnected_output, &error);
457 ASSERT_TRUE(ret_vblank != NULL);
458 ASSERT_TRUE(error == TDM_ERROR_NONE);
461 /* tdm_vblank_destroy() */
463 TEST_F(TDMVblank, VblankDestroyWrongVblankPtr)
465 SKIP_FLAG(has_output);
467 ASSERT_EXIT({tdm_vblank_destroy((tdm_vblank *)0xFFFFFFFF); exit(0);},
468 ::testing::ExitedWithCode(0), "");
471 TEST_F(TDMVblank, VblankDestroySuccess)
474 SKIP_FLAG(has_output);
476 tdm_vblank_destroy(con_output_vblank);
478 error = tdm_vblank_set_enable_fake(default_vblank, 1);
479 ASSERT_TRUE(error != TDM_ERROR_NONE);
482 /* tdm_vblank_set_name() */
484 TEST_F(TDMVblank, VblankSetNameFailNullAll)
487 SKIP_FLAG(has_output);
489 error = tdm_vblank_set_name(NULL, NULL);
490 ASSERT_TRUE(error != TDM_ERROR_NONE);
493 TEST_F(TDMVblank, VblankSetNameFailWrongVblankPtr)
495 tdm_error error = TDM_ERROR_BAD_MODULE;
497 SKIP_FLAG(has_output);
499 ASSERT_EXIT({error = tdm_vblank_set_name((tdm_vblank *)0xFFFFFFFF, "ut_vblank");
500 if (error == TDM_ERROR_NONE)
504 ::testing::ExitedWithCode(0), "");
507 TEST_F(TDMVblank, VblankSetNameSuccess)
510 SKIP_FLAG(has_output);
512 error = tdm_vblank_set_name(default_vblank, "ut_vblank");
513 ASSERT_TRUE(error == TDM_ERROR_NONE);
516 TEST_F(TDMVblank, VblankSetNameSuccessNullName)
519 SKIP_FLAG(has_output);
521 error = tdm_vblank_set_name(default_vblank, NULL);
522 ASSERT_TRUE(error == TDM_ERROR_NONE);
525 /* tdm_vblank_get_name() */
527 TEST_F(TDMVblank, VblankGetNameFailNullAll)
530 SKIP_FLAG(has_output);
532 error = tdm_vblank_get_name(NULL, NULL);
533 ASSERT_TRUE(error != TDM_ERROR_NONE);
536 TEST_F(TDMVblank, VblankGetNameFailNullVblank)
539 const char *ret_name;
540 SKIP_FLAG(has_output);
542 error = tdm_vblank_get_name(NULL, &ret_name);
543 ASSERT_TRUE(error != TDM_ERROR_NONE);
546 TEST_F(TDMVblank, VblankGetNameFailWrongVblankPtr)
548 tdm_error error = TDM_ERROR_BAD_MODULE;
549 const char *ret_name;
551 SKIP_FLAG(has_output);
553 ASSERT_EXIT({error = tdm_vblank_get_name((tdm_vblank *)0xFFFFFFFF, &ret_name);
554 if (error == TDM_ERROR_NONE)
558 ::testing::ExitedWithCode(0), "");
561 TEST_F(TDMVblank, VblankGetNameFailNullName)
564 SKIP_FLAG(has_output);
566 error = tdm_vblank_get_name(default_vblank, NULL);
567 ASSERT_TRUE(error != TDM_ERROR_NONE);
570 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetName)
573 const char *ret_name;
574 SKIP_FLAG(has_output);
576 error = tdm_vblank_get_name(default_vblank, &ret_name);
577 ASSERT_TRUE(error == TDM_ERROR_NONE);
580 TEST_F(TDMVblank, VblankGetNameSuccess)
583 const char *ret_name;
584 SKIP_FLAG(has_output);
585 const char *set_name = "ut_vblank";
587 error = tdm_vblank_set_name(default_vblank, set_name);
588 ASSERT_TRUE(error == TDM_ERROR_NONE);
590 error = tdm_vblank_get_name(default_vblank, &ret_name);
591 ASSERT_TRUE(error == TDM_ERROR_NONE);
593 ASSERT_STREQ(set_name, ret_name);
596 /* tdm_vblank_set_fps() */
598 TEST_F(TDMVblank, VblankSetFpsFailNullVblank)
601 SKIP_FLAG(has_output);
603 error = tdm_vblank_set_fps(NULL, 10);
604 ASSERT_TRUE(error != TDM_ERROR_NONE);
607 TEST_F(TDMVblank, VblankSetFpsFailFpsNull)
610 SKIP_FLAG(has_output);
612 error = tdm_vblank_set_fps(default_vblank, 0);
613 ASSERT_TRUE(error != TDM_ERROR_NONE);
616 TEST_F(TDMVblank, VblankSetFpsFailWrongVblankPtr)
618 tdm_error error = TDM_ERROR_BAD_MODULE;
620 SKIP_FLAG(has_output);
622 ASSERT_EXIT({error = tdm_vblank_set_fps((tdm_vblank *)0xFFFFFFFF, 60);
623 if (error == TDM_ERROR_NONE)
627 ::testing::ExitedWithCode(0), "");
630 TEST_F(TDMVblank, VblankSetFpsSuccess)
633 SKIP_FLAG(has_output);
635 error = tdm_vblank_set_fps(default_vblank, 60);
636 ASSERT_TRUE(error == TDM_ERROR_NONE);
639 TEST_F(TDMVblank, VblankSetFpsSuccessSetTwice)
642 SKIP_FLAG(has_output);
644 error = tdm_vblank_set_fps(default_vblank, 60);
645 ASSERT_TRUE(error == TDM_ERROR_NONE);
647 error = tdm_vblank_set_fps(default_vblank, 60);
648 ASSERT_TRUE(error == TDM_ERROR_NONE);
651 /* tdm_vblank_get_fps() */
653 TEST_F(TDMVblank, VblankGetFpsFailNullAll)
656 SKIP_FLAG(has_output);
658 error = tdm_vblank_get_fps(NULL, NULL);
659 ASSERT_TRUE(error != TDM_ERROR_NONE);
662 TEST_F(TDMVblank, VblankGetFpsFailNullVblank)
665 unsigned int ret_fps;
666 SKIP_FLAG(has_output);
668 error = tdm_vblank_get_fps(NULL, &ret_fps);
669 ASSERT_TRUE(error != TDM_ERROR_NONE);
672 TEST_F(TDMVblank, VblankGetFpsFailNullFps)
675 SKIP_FLAG(has_output);
677 error = tdm_vblank_get_fps(default_vblank, NULL);
678 ASSERT_TRUE(error != TDM_ERROR_NONE);
681 TEST_F(TDMVblank, VblankGetFpsFailWrongVblankPtr)
683 tdm_error error = TDM_ERROR_BAD_MODULE;
684 unsigned int ret_fps;
686 SKIP_FLAG(has_output);
688 ASSERT_EXIT({error = tdm_vblank_get_fps((tdm_vblank *)0xFFFFFFFF, &ret_fps);
689 if (error == TDM_ERROR_NONE)
693 ::testing::ExitedWithCode(0), "");
696 TEST_F(TDMVblank, VblankGetNameSuccessWhithoutSetFps)
699 unsigned int ret_fps;
700 SKIP_FLAG(has_output);
702 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
703 ASSERT_TRUE(error == TDM_ERROR_NONE);
706 TEST_F(TDMVblank, VblankGetFpsSuccess)
709 unsigned int ret_fps = 10;
710 SKIP_FLAG(has_output);
711 unsigned int set_fps = 50;
713 error = tdm_vblank_set_fps(default_vblank, set_fps);
714 ASSERT_TRUE(error == TDM_ERROR_NONE);
716 error = tdm_vblank_get_fps(default_vblank, &ret_fps);
717 ASSERT_TRUE(error == TDM_ERROR_NONE);
719 ASSERT_TRUE(set_fps == ret_fps);
722 /* tdm_vblank_ignore_global_fps() */
724 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailNullVblank)
727 SKIP_FLAG(has_output);
729 error = tdm_vblank_ignore_global_fps(NULL, 1);
730 ASSERT_TRUE(error != TDM_ERROR_NONE);
733 TEST_F(TDMVblank, VblankIgnoreGlobalFpsFailWrongVblankPtr)
735 tdm_error error = TDM_ERROR_BAD_MODULE;
737 SKIP_FLAG(has_output);
739 ASSERT_EXIT({error = tdm_vblank_ignore_global_fps((tdm_vblank *)0xFFFFFFFF, 1);
740 if (error == TDM_ERROR_NONE)
744 ::testing::ExitedWithCode(0), "");
747 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnset)
750 SKIP_FLAG(has_output);
752 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
753 ASSERT_TRUE(error == TDM_ERROR_NONE);
756 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessUnsetTwice)
759 SKIP_FLAG(has_output);
761 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
762 ASSERT_TRUE(error == TDM_ERROR_NONE);
764 error = tdm_vblank_ignore_global_fps(default_vblank, 0);
765 ASSERT_TRUE(error == TDM_ERROR_NONE);
768 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSet)
771 SKIP_FLAG(has_output);
773 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
774 ASSERT_TRUE(error == TDM_ERROR_NONE);
777 TEST_F(TDMVblank, VblankIgnoreGlobalFpsSuccessSetTwice)
780 SKIP_FLAG(has_output);
782 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
783 ASSERT_TRUE(error == TDM_ERROR_NONE);
785 error = tdm_vblank_ignore_global_fps(default_vblank, 1);
786 ASSERT_TRUE(error == TDM_ERROR_NONE);
789 /* tdm_vblank_set_offset() */
791 TEST_F(TDMVblank, VblankSetOffsetFailNullVblank)
794 SKIP_FLAG(has_output);
796 error = tdm_vblank_set_offset(NULL, 10);
797 ASSERT_TRUE(error != TDM_ERROR_NONE);
800 TEST_F(TDMVblank, VblankSetOffsetFailFailWrongVblankPtr)
802 tdm_error error = TDM_ERROR_BAD_MODULE;
804 SKIP_FLAG(has_output);
806 ASSERT_EXIT({error = tdm_vblank_set_offset((tdm_vblank *)0xFFFFFFFF, 10);
807 if (error == TDM_ERROR_NONE)
811 ::testing::ExitedWithCode(0), "");
814 TEST_F(TDMVblank, VblankSetOffsetSuccess)
817 SKIP_FLAG(has_output);
819 error = tdm_vblank_set_offset(default_vblank, 50);
820 ASSERT_TRUE(error == TDM_ERROR_NONE);
823 TEST_F(TDMVblank, VblankSetOffsetSuccessSuccessSetTwice)
826 SKIP_FLAG(has_output);
828 error = tdm_vblank_set_offset(default_vblank, 50);
829 ASSERT_TRUE(error == TDM_ERROR_NONE);
831 error = tdm_vblank_set_offset(default_vblank, 50);
832 ASSERT_TRUE(error == TDM_ERROR_NONE);
835 /* tdm_vblank_get_offset() */
837 TEST_F(TDMVblank, VblankGetOffsetFailNullAll)
840 SKIP_FLAG(has_output);
842 error = tdm_vblank_get_offset(NULL, NULL);
843 ASSERT_TRUE(error != TDM_ERROR_NONE);
846 TEST_F(TDMVblank, VblankGetOffsetFailNullVblank)
850 SKIP_FLAG(has_output);
852 error = tdm_vblank_get_offset(NULL, &offset);
853 ASSERT_TRUE(error != TDM_ERROR_NONE);
856 TEST_F(TDMVblank, VblankGetOffsetFailNullOffset)
859 SKIP_FLAG(has_output);
861 error = tdm_vblank_get_offset(default_vblank, NULL);
862 ASSERT_TRUE(error != TDM_ERROR_NONE);
865 TEST_F(TDMVblank, VblankGetOffsetFailWrongVblankPtr)
867 tdm_error error = TDM_ERROR_BAD_MODULE;
869 SKIP_FLAG(has_output);
871 ASSERT_EXIT({error = tdm_vblank_get_offset((tdm_vblank *)0xFFFFFFFF, &offset);
872 if (error == TDM_ERROR_NONE)
876 ::testing::ExitedWithCode(0), "");
879 TEST_F(TDMVblank, VblankGetOffsetSuccesWithoutSet)
884 SKIP_FLAG(has_output);
886 error = tdm_vblank_get_offset(default_vblank, &offset);
887 ASSERT_TRUE(error == TDM_ERROR_NONE);
890 TEST_F(TDMVblank, VblankGetOffsetSucces)
893 int set_offset = 567;
896 SKIP_FLAG(has_output);
898 error = tdm_vblank_set_offset(default_vblank, set_offset);
899 ASSERT_TRUE(error == TDM_ERROR_NONE);
901 error = tdm_vblank_get_offset(default_vblank, &ret_offset);
902 ASSERT_TRUE(error == TDM_ERROR_NONE);
904 ASSERT_TRUE(set_offset == ret_offset);
907 /* tdm_vblank_set_enable_fake() */
909 TEST_F(TDMVblank, VblankSetEnableFakeFailNullVblank)
912 SKIP_FLAG(has_output);
914 error = tdm_vblank_set_enable_fake(NULL, 1);
915 ASSERT_TRUE(error != TDM_ERROR_NONE);
918 TEST_F(TDMVblank, VblankSetEnableFakeFailFailWrongVblankPtr)
920 tdm_error error = TDM_ERROR_BAD_MODULE;
922 SKIP_FLAG(has_output);
924 ASSERT_EXIT({error = tdm_vblank_set_enable_fake((tdm_vblank *)0xFFFFFFFF, 1);
925 if (error == TDM_ERROR_NONE)
929 ::testing::ExitedWithCode(0), "");
932 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSet)
935 SKIP_FLAG(has_output);
937 error = tdm_vblank_set_enable_fake(default_vblank, 1);
938 ASSERT_TRUE(error == TDM_ERROR_NONE);
941 TEST_F(TDMVblank, VblankSetEnableFakeSuccessSetTwice)
944 SKIP_FLAG(has_output);
946 error = tdm_vblank_set_enable_fake(default_vblank, 1);
947 ASSERT_TRUE(error == TDM_ERROR_NONE);
949 error = tdm_vblank_set_enable_fake(default_vblank, 1);
950 ASSERT_TRUE(error == TDM_ERROR_NONE);
953 /* tdm_vblank_get_enable_fake() */
955 TEST_F(TDMVblank, VblankGetEnableFakeFailNullAll)
958 SKIP_FLAG(has_output);
960 error = tdm_vblank_get_enable_fake(NULL, NULL);
961 ASSERT_TRUE(error != TDM_ERROR_NONE);
964 TEST_F(TDMVblank, VblankGetEnableFakeFailNullVblank)
967 unsigned int enable_fake;
968 SKIP_FLAG(has_output);
970 error = tdm_vblank_get_enable_fake(NULL, &enable_fake);
971 ASSERT_TRUE(error != TDM_ERROR_NONE);
974 TEST_F(TDMVblank, VblankGetEnableFakeFailNullEnableFake)
977 SKIP_FLAG(has_output);
979 error = tdm_vblank_get_enable_fake(default_vblank, NULL);
980 ASSERT_TRUE(error != TDM_ERROR_NONE);
983 TEST_F(TDMVblank, VblankGetEnableFakeFailWrongVblankPtr)
985 tdm_error error = TDM_ERROR_BAD_MODULE;
986 unsigned int enable_fake;
987 SKIP_FLAG(has_output);
989 ASSERT_EXIT({error = tdm_vblank_get_enable_fake((tdm_vblank *)0xFFFFFFFF, &enable_fake);
990 if (error == TDM_ERROR_NONE)
994 ::testing::ExitedWithCode(0), "");
997 TEST_F(TDMVblank, VblankGetEnableFakeSuccessWithoutSet)
1000 unsigned int enable_fake;
1002 SKIP_FLAG(has_output);
1004 error = tdm_vblank_get_enable_fake(default_vblank, &enable_fake);
1005 ASSERT_TRUE(error == TDM_ERROR_NONE);
1008 TEST_F(TDMVblank, VblankGetEnableFakeSuccess)
1011 unsigned int set_enable_fake = 1;
1012 unsigned int ret_enable_fake;
1014 SKIP_FLAG(has_output);
1016 error = tdm_vblank_set_enable_fake(default_vblank, set_enable_fake);
1017 ASSERT_TRUE(error == TDM_ERROR_NONE);
1019 error = tdm_vblank_get_enable_fake(default_vblank, &ret_enable_fake);
1020 ASSERT_TRUE(error == TDM_ERROR_NONE);
1022 ASSERT_TRUE(set_enable_fake == ret_enable_fake);
1025 /* tdm_vblank_set_client_vblank_fps() */
1027 /* TODO: need to create the tdm client */
1028 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullAll)
1032 SKIP_FLAG(has_output);
1034 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1035 ASSERT_TRUE(error != TDM_ERROR_NONE);
1038 /* TODO: need to create the tdm client */
1039 TEST_F(TDMVblank, VblankSetClientVblankFpsFailNullPid)
1043 SKIP_FLAG(has_output);
1045 error = tdm_vblank_set_client_vblank_fps(0, 0, 0);
1046 ASSERT_TRUE(error != TDM_ERROR_NONE);
1049 /* tdm_vblank_wait() */
1051 TEST_F(TDMVblank, VblankWaitFailNullAll)
1055 SKIP_FLAG(has_output);
1057 error = tdm_vblank_wait(NULL, 0, 0, 0, NULL, NULL);
1058 ASSERT_TRUE(error != TDM_ERROR_NONE);
1061 TEST_F(TDMVblankWait, VblankWaitFailNullVblank)
1065 SKIP_FLAG(has_output);
1067 error = tdm_vblank_wait(NULL, 0, 0, 1, UtVblankHandler, NULL);
1068 ASSERT_TRUE(error != TDM_ERROR_NONE);
1071 TEST_F(TDMVblankWait, VblankWaitFailNullFunc)
1075 SKIP_FLAG(has_output);
1077 error = tdm_vblank_wait(default_vblank, 0, 0, 1, NULL, NULL);
1078 ASSERT_TRUE(error != TDM_ERROR_NONE);
1081 TEST_F(TDMVblankWait, VblankWaitFailWrongVblankPtr)
1083 tdm_error error = TDM_ERROR_BAD_MODULE;
1084 SKIP_FLAG(has_output);
1086 ASSERT_EXIT({error = tdm_vblank_wait((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1087 if (error == TDM_ERROR_NONE)
1091 ::testing::ExitedWithCode(0), "");
1094 void *UtWaitVblankThreadHndl(void *ptr)
1097 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1099 error = tdm_vblank_wait(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1100 if (error != TDM_ERROR_NONE)
1101 vblankWait->utWaitVblankThreadHndlResult = 0;
1103 vblankWait->utWaitVblankThreadHndlResult = 1;
1108 TEST_F(TDMVblankWait, VblankWaitFailInOtherThread)
1110 pthread_t thread = 0;
1112 SKIP_FLAG(has_output);
1114 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankThreadHndl, this));
1116 ASSERT_FALSE(pthread_join(thread, NULL));
1118 ASSERT_FALSE(utWaitVblankThreadHndlResult);
1121 TEST_F(TDMVblankWait, VblankWaitFailDisconnectedOutput)
1125 SKIP_FLAG(has_output);
1127 if (!discon_output_vblank)
1130 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1131 ASSERT_TRUE(error != TDM_ERROR_NONE);
1134 TEST_F(TDMVblankWait, VblankWaitFailDpmsOff)
1138 SKIP_FLAG(has_output);
1140 if (!con_output_vblank)
1143 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1144 ASSERT_TRUE(error == TDM_ERROR_NONE);
1146 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1147 ASSERT_TRUE(error != TDM_ERROR_NONE);
1150 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefresh)
1155 SKIP_FLAG(has_output);
1157 if (!con_output_vblank)
1160 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1161 ASSERT_TRUE(error == TDM_ERROR_NONE);
1163 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1164 ASSERT_TRUE(error == TDM_ERROR_NONE);
1166 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1167 ASSERT_TRUE(error == TDM_ERROR_NONE);
1169 UtHandleVblankEvent();
1171 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1172 ASSERT_TRUE(data == 1);
1175 TEST_F(TDMVblankWait, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1180 SKIP_FLAG(has_output);
1182 if (!con_output_vblank)
1185 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1186 ASSERT_TRUE(error == TDM_ERROR_NONE);
1188 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1189 ASSERT_TRUE(error == TDM_ERROR_NONE);
1191 for (int i = 0; i < 10; ++i) {
1192 utVblankHandlerIsCalled = 0;
1195 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1196 ASSERT_TRUE(error == TDM_ERROR_NONE);
1198 UtHandleVblankEvent();
1200 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1201 ASSERT_TRUE(data == 1);
1205 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutput)
1210 SKIP_FLAG(has_output);
1212 if (!discon_output_vblank)
1215 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1216 ASSERT_TRUE(error == TDM_ERROR_NONE);
1218 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1219 ASSERT_TRUE(error == TDM_ERROR_NONE);
1221 UtHandleVblankEvent();
1223 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1224 ASSERT_TRUE(data == 1);
1227 TEST_F(TDMVblankWait, VblankWaitSuccessDisconnectedOutputRepeatedly)
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 for (int i = 0; i < 10; ++i) {
1241 utVblankHandlerIsCalled = 0;
1244 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1245 ASSERT_TRUE(error == TDM_ERROR_NONE);
1247 UtHandleVblankEvent();
1249 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1250 ASSERT_TRUE(data == 1);
1254 TEST_F(TDMVblankWait, VblankWaitSuccessHW)
1259 SKIP_FLAG(has_output);
1261 if (!con_output_vblank)
1264 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1265 ASSERT_TRUE(error == TDM_ERROR_NONE);
1267 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1268 ASSERT_TRUE(error == TDM_ERROR_NONE);
1270 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1271 ASSERT_TRUE(error == TDM_ERROR_NONE);
1273 error = tdm_vblank_set_offset(con_output_vblank, 0);
1274 ASSERT_TRUE(error == TDM_ERROR_NONE);
1276 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1277 ASSERT_TRUE(error == TDM_ERROR_NONE);
1279 UtHandleVblankEvent();
1281 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1282 ASSERT_TRUE(data == 1);
1285 TEST_F(TDMVblankWait, VblankWaitSuccessDestroy)
1290 SKIP_FLAG(has_output);
1292 if (!con_output_vblank)
1295 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1296 ASSERT_TRUE(error == TDM_ERROR_NONE);
1298 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1299 ASSERT_TRUE(error == TDM_ERROR_NONE);
1301 error = tdm_vblank_set_offset(con_output_vblank, 0);
1302 ASSERT_TRUE(error == TDM_ERROR_NONE);
1304 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1305 ASSERT_TRUE(error == TDM_ERROR_NONE);
1307 tdm_vblank_destroy(con_output_vblank);
1309 ASSERT_TRUE(utVblankHandlerIsCalled == 0);
1310 ASSERT_TRUE(data == 0);
1313 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpms)
1318 SKIP_FLAG(has_output);
1320 if (!con_output_vblank)
1323 error = tdm_vblank_set_enable_fake(con_output_vblank, 0);
1324 ASSERT_TRUE(error == TDM_ERROR_NONE);
1326 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1327 ASSERT_TRUE(error == TDM_ERROR_NONE);
1329 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1330 ASSERT_TRUE(error == TDM_ERROR_NONE);
1332 error = tdm_vblank_set_offset(con_output_vblank, 0);
1333 ASSERT_TRUE(error == TDM_ERROR_NONE);
1335 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1336 ASSERT_TRUE(error == TDM_ERROR_NONE);
1338 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1339 ASSERT_TRUE(error == TDM_ERROR_NONE);
1341 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1342 ASSERT_TRUE(data == 1);
1345 TEST_F(TDMVblankWait, VblankWaitSuccessChangeDpmsWithEnableFake)
1350 SKIP_FLAG(has_output);
1352 if (!con_output_vblank)
1355 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1356 ASSERT_TRUE(error == TDM_ERROR_NONE);
1358 error = tdm_vblank_set_enable_fake(con_output_vblank, 1);
1359 ASSERT_TRUE(error == TDM_ERROR_NONE);
1361 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1362 ASSERT_TRUE(error == TDM_ERROR_NONE);
1364 error = tdm_vblank_set_offset(con_output_vblank, 0);
1365 ASSERT_TRUE(error == TDM_ERROR_NONE);
1367 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1368 ASSERT_TRUE(error == TDM_ERROR_NONE);
1370 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1371 ASSERT_TRUE(error == TDM_ERROR_NONE);
1373 UtHandleVblankEvent();
1375 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1376 ASSERT_TRUE(data == 1);
1379 TEST_F(TDMVblankWait, VblankWaitSuccessHWRepeatedly)
1384 SKIP_FLAG(has_output);
1386 if (!con_output_vblank)
1389 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1390 ASSERT_TRUE(error == TDM_ERROR_NONE);
1392 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1393 ASSERT_TRUE(error == TDM_ERROR_NONE);
1395 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1396 ASSERT_TRUE(error == TDM_ERROR_NONE);
1398 error = tdm_vblank_set_offset(con_output_vblank, 0);
1399 ASSERT_TRUE(error == TDM_ERROR_NONE);
1401 for (int i = 0; i < 10; ++i) {
1402 utVblankHandlerIsCalled = 0;
1405 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1406 ASSERT_TRUE(error == TDM_ERROR_NONE);
1408 UtHandleVblankEvent();
1410 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1411 ASSERT_TRUE(data == 1);
1415 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZero)
1420 SKIP_FLAG(has_output);
1422 if (!con_output_vblank)
1425 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1426 ASSERT_TRUE(error == TDM_ERROR_NONE);
1428 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1429 ASSERT_TRUE(error == TDM_ERROR_NONE);
1431 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1432 ASSERT_TRUE(error == TDM_ERROR_NONE);
1434 error = tdm_vblank_set_offset(con_output_vblank, 10);
1435 ASSERT_TRUE(error == TDM_ERROR_NONE);
1437 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1438 ASSERT_TRUE(error == TDM_ERROR_NONE);
1440 UtHandleVblankEvent();
1442 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1443 ASSERT_TRUE(data == 1);
1446 TEST_F(TDMVblankWait, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1451 SKIP_FLAG(has_output);
1453 if (!con_output_vblank)
1456 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1457 ASSERT_TRUE(error == TDM_ERROR_NONE);
1459 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1460 ASSERT_TRUE(error == TDM_ERROR_NONE);
1462 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1463 ASSERT_TRUE(error == TDM_ERROR_NONE);
1465 error = tdm_vblank_set_offset(con_output_vblank, 10);
1466 ASSERT_TRUE(error == TDM_ERROR_NONE);
1468 for (int i = 0; i < 10; ++i) {
1469 utVblankHandlerIsCalled = 0;
1472 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1473 ASSERT_TRUE(error == TDM_ERROR_NONE);
1475 UtHandleVblankEvent();
1477 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1478 ASSERT_TRUE(data == 1);
1482 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefresh)
1487 SKIP_FLAG(has_output);
1489 if (!con_output_vblank)
1492 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1493 ASSERT_TRUE(error == TDM_ERROR_NONE);
1495 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1496 ASSERT_TRUE(error == TDM_ERROR_NONE);
1498 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1499 ASSERT_TRUE(error == TDM_ERROR_NONE);
1501 UtHandleVblankEvent();
1503 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1504 ASSERT_TRUE(data == 1);
1507 TEST_F(TDMVblankWaitThread, VblankWaitSuccessFpsNonMultipleVrefreshRepeatedly)
1512 SKIP_FLAG(has_output);
1514 if (!con_output_vblank)
1517 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1518 ASSERT_TRUE(error == TDM_ERROR_NONE);
1520 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1521 ASSERT_TRUE(error == TDM_ERROR_NONE);
1523 for (int i = 0; i < 10; ++i) {
1524 utVblankHandlerIsCalled = 0;
1527 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1528 ASSERT_TRUE(error == TDM_ERROR_NONE);
1530 UtHandleVblankEvent();
1532 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1533 ASSERT_TRUE(data == 1);
1537 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutput)
1542 SKIP_FLAG(has_output);
1544 if (!discon_output_vblank)
1547 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1548 ASSERT_TRUE(error == TDM_ERROR_NONE);
1550 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1551 ASSERT_TRUE(error == TDM_ERROR_NONE);
1553 UtHandleVblankEvent();
1555 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1556 ASSERT_TRUE(data == 1);
1559 TEST_F(TDMVblankWaitThread, VblankWaitSuccessDisconnectedOutputRepeatedly)
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 for (int i = 0; i < 10; ++i) {
1573 utVblankHandlerIsCalled = 0;
1576 error = tdm_vblank_wait(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1577 ASSERT_TRUE(error == TDM_ERROR_NONE);
1579 UtHandleVblankEvent();
1581 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1582 ASSERT_TRUE(data == 1);
1586 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHW)
1591 SKIP_FLAG(has_output);
1593 if (!con_output_vblank)
1596 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1597 ASSERT_TRUE(error == TDM_ERROR_NONE);
1599 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1600 ASSERT_TRUE(error == TDM_ERROR_NONE);
1602 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1603 ASSERT_TRUE(error == TDM_ERROR_NONE);
1605 error = tdm_vblank_set_offset(con_output_vblank, 0);
1606 ASSERT_TRUE(error == TDM_ERROR_NONE);
1608 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1609 ASSERT_TRUE(error == TDM_ERROR_NONE);
1611 UtHandleVblankEvent();
1613 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1614 ASSERT_TRUE(data == 1);
1617 TEST_F(TDMVblankWaitThread, VblankWaitSuccessHWRepeatedly)
1622 SKIP_FLAG(has_output);
1624 if (!con_output_vblank)
1627 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1628 ASSERT_TRUE(error == TDM_ERROR_NONE);
1630 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1631 ASSERT_TRUE(error == TDM_ERROR_NONE);
1633 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1634 ASSERT_TRUE(error == TDM_ERROR_NONE);
1636 error = tdm_vblank_set_offset(con_output_vblank, 0);
1637 ASSERT_TRUE(error == TDM_ERROR_NONE);
1639 for (int i = 0; i < 10; ++i) {
1640 utVblankHandlerIsCalled = 0;
1643 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1644 ASSERT_TRUE(error == TDM_ERROR_NONE);
1646 UtHandleVblankEvent();
1648 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1649 ASSERT_TRUE(data == 1);
1653 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZero)
1658 SKIP_FLAG(has_output);
1660 if (!con_output_vblank)
1663 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1664 ASSERT_TRUE(error == TDM_ERROR_NONE);
1666 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1667 ASSERT_TRUE(error == TDM_ERROR_NONE);
1669 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1670 ASSERT_TRUE(error == TDM_ERROR_NONE);
1672 error = tdm_vblank_set_offset(con_output_vblank, 10);
1673 ASSERT_TRUE(error == TDM_ERROR_NONE);
1675 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1676 ASSERT_TRUE(error == TDM_ERROR_NONE);
1678 UtHandleVblankEvent();
1680 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1681 ASSERT_TRUE(data == 1);
1684 TEST_F(TDMVblankWaitThread, VblankWaitSuccessOffsenGreaterThanZeroRepeatedly)
1689 SKIP_FLAG(has_output);
1691 if (!con_output_vblank)
1694 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1695 ASSERT_TRUE(error == TDM_ERROR_NONE);
1697 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1698 ASSERT_TRUE(error == TDM_ERROR_NONE);
1700 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1701 ASSERT_TRUE(error == TDM_ERROR_NONE);
1703 error = tdm_vblank_set_offset(con_output_vblank, 10);
1704 ASSERT_TRUE(error == TDM_ERROR_NONE);
1706 for (int i = 0; i < 10; ++i) {
1707 utVblankHandlerIsCalled = 0;
1710 error = tdm_vblank_wait(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1711 ASSERT_TRUE(error == TDM_ERROR_NONE);
1713 UtHandleVblankEvent();
1715 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1716 ASSERT_TRUE(data == 1);
1720 /* tdm_vblank_wait_seq() */
1722 TEST_F(TDMVblank, VblankWaitSeqFailNullAll)
1726 SKIP_FLAG(has_output);
1728 error = tdm_vblank_wait_seq(NULL, 0, 0, 0, NULL, NULL);
1729 ASSERT_TRUE(error != TDM_ERROR_NONE);
1732 TEST_F(TDMVblankWait, VblankWaitSeqFailNullVblank)
1736 SKIP_FLAG(has_output);
1738 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1739 ASSERT_TRUE(error != TDM_ERROR_NONE);
1742 TEST_F(TDMVblankWait, VblankWaitSeqFailWrongVblankPtr)
1744 tdm_error error = TDM_ERROR_BAD_MODULE;
1745 SKIP_FLAG(has_output);
1747 ASSERT_EXIT({error = tdm_vblank_wait_seq((tdm_vblank *)0xFFFFFFFF, 0, 0, 1, UtVblankHandler, NULL);;
1748 if (error == TDM_ERROR_NONE)
1752 ::testing::ExitedWithCode(0), "");
1755 TEST_F(TDMVblankWait, VblankWaitSeqFailNullFunc)
1759 SKIP_FLAG(has_output);
1761 error = tdm_vblank_wait_seq(NULL, 0, 0, 1, UtVblankHandler, NULL);
1762 ASSERT_TRUE(error != TDM_ERROR_NONE);
1765 void *UtWaitVblankSeqThreadHndl(void *ptr)
1768 TDMVblankWait *vblankWait = (TDMVblankWait *)ptr;
1770 error = tdm_vblank_wait_seq(vblankWait->default_vblank, 0, 0, 1, TDMVblankWait::UtVblankHandler, NULL);
1771 if (error != TDM_ERROR_NONE)
1772 vblankWait->utWaitVblankSeqThreadHndlResult = 0;
1774 vblankWait->utWaitVblankSeqThreadHndlResult = 1;
1779 TEST_F(TDMVblankWait, VblankWaitSeqFailInOtherThread)
1781 pthread_t thread = 0;
1783 SKIP_FLAG(has_output);
1785 ASSERT_FALSE(pthread_create(&thread, NULL, UtWaitVblankSeqThreadHndl, this));
1787 ASSERT_FALSE(pthread_join(thread, NULL));
1789 ASSERT_FALSE(utWaitVblankSeqThreadHndlResult);
1792 TEST_F(TDMVblankWait, VblankWaitSeqFailDisconnectedOutput)
1796 SKIP_FLAG(has_output);
1798 if (!discon_output_vblank)
1801 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1802 ASSERT_TRUE(error != TDM_ERROR_NONE);
1805 TEST_F(TDMVblankWait, VblankWaitSeqFailDpmsOff)
1809 SKIP_FLAG(has_output);
1811 if (!con_output_vblank)
1814 error = tdm_output_set_dpms(connected_output, TDM_OUTPUT_DPMS_OFF);
1815 ASSERT_TRUE(error == TDM_ERROR_NONE);
1817 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, NULL);
1818 ASSERT_TRUE(error != TDM_ERROR_NONE);
1821 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefresh)
1826 SKIP_FLAG(has_output);
1828 if (!con_output_vblank)
1831 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1832 ASSERT_TRUE(error == TDM_ERROR_NONE);
1834 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1835 ASSERT_TRUE(error == TDM_ERROR_NONE);
1837 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1838 ASSERT_TRUE(error == TDM_ERROR_NONE);
1840 UtHandleVblankEvent();
1842 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1843 ASSERT_TRUE(data == 1);
1846 TEST_F(TDMVblankWait, VblankWaitSeqSuccessFpsNonMultipleVrefreshRepeatedly)
1851 SKIP_FLAG(has_output);
1853 if (!con_output_vblank)
1856 error = tdm_vblank_ignore_global_fps(con_output_vblank, 1);
1857 ASSERT_TRUE(error == TDM_ERROR_NONE);
1859 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh - 1);
1860 ASSERT_TRUE(error == TDM_ERROR_NONE);
1862 for (int i = 1; i < 10; ++i) {
1863 utVblankHandlerIsCalled = 0;
1866 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1867 ASSERT_TRUE(error == TDM_ERROR_NONE);
1869 UtHandleVblankEvent();
1871 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1872 ASSERT_TRUE(data == 1);
1876 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutput)
1881 SKIP_FLAG(has_output);
1883 if (!discon_output_vblank)
1886 error = tdm_vblank_set_enable_fake(discon_output_vblank, 1);
1887 ASSERT_TRUE(error == TDM_ERROR_NONE);
1889 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1890 ASSERT_TRUE(error == TDM_ERROR_NONE);
1892 UtHandleVblankEvent();
1894 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1895 ASSERT_TRUE(data == 1);
1898 TEST_F(TDMVblankWait, VblankWaitSeqSuccessDisconnectedOutputRepeatedly)
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 for (int i = 1; i < 10; ++i) {
1912 utVblankHandlerIsCalled = 0;
1915 error = tdm_vblank_wait_seq(discon_output_vblank, 0, 0, i, UtVblankHandler, &data);
1916 ASSERT_TRUE(error == TDM_ERROR_NONE);
1918 UtHandleVblankEvent();
1920 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1921 ASSERT_TRUE(data == 1);
1925 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHW)
1930 SKIP_FLAG(has_output);
1932 if (!con_output_vblank)
1935 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1936 ASSERT_TRUE(error == TDM_ERROR_NONE);
1938 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1939 ASSERT_TRUE(error == TDM_ERROR_NONE);
1941 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1942 ASSERT_TRUE(error == TDM_ERROR_NONE);
1944 error = tdm_vblank_set_offset(con_output_vblank, 0);
1945 ASSERT_TRUE(error == TDM_ERROR_NONE);
1947 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
1948 ASSERT_TRUE(error == TDM_ERROR_NONE);
1950 UtHandleVblankEvent();
1952 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1953 ASSERT_TRUE(data == 1);
1956 TEST_F(TDMVblankWait, VblankWaitSeqSuccessHWRepeatedly)
1961 SKIP_FLAG(has_output);
1963 if (!con_output_vblank)
1966 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
1967 ASSERT_TRUE(error == TDM_ERROR_NONE);
1969 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
1970 ASSERT_TRUE(error == TDM_ERROR_NONE);
1972 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
1973 ASSERT_TRUE(error == TDM_ERROR_NONE);
1975 error = tdm_vblank_set_offset(con_output_vblank, 0);
1976 ASSERT_TRUE(error == TDM_ERROR_NONE);
1978 for (int i = 1; i < 10; ++i) {
1979 utVblankHandlerIsCalled = 0;
1982 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
1983 ASSERT_TRUE(error == TDM_ERROR_NONE);
1985 UtHandleVblankEvent();
1987 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
1988 ASSERT_TRUE(data == 1);
1992 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZero)
1997 SKIP_FLAG(has_output);
1999 if (!con_output_vblank)
2002 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2003 ASSERT_TRUE(error == TDM_ERROR_NONE);
2005 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2006 ASSERT_TRUE(error == TDM_ERROR_NONE);
2008 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2009 ASSERT_TRUE(error == TDM_ERROR_NONE);
2011 error = tdm_vblank_set_offset(con_output_vblank, 10);
2012 ASSERT_TRUE(error == TDM_ERROR_NONE);
2014 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 1, UtVblankHandler, &data);
2015 ASSERT_TRUE(error == TDM_ERROR_NONE);
2017 UtHandleVblankEvent();
2019 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2020 ASSERT_TRUE(data == 1);
2023 TEST_F(TDMVblankWait, VblankWaitSeqSuccessOffsenGreaterThanZeroRepeatedly)
2028 SKIP_FLAG(has_output);
2030 if (!con_output_vblank)
2033 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2034 ASSERT_TRUE(error == TDM_ERROR_NONE);
2036 error = tdm_vblank_enable_global_fps(1, preferred_mode->vrefresh);
2037 ASSERT_TRUE(error == TDM_ERROR_NONE);
2039 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2040 ASSERT_TRUE(error == TDM_ERROR_NONE);
2042 error = tdm_vblank_set_offset(con_output_vblank, 10);
2043 ASSERT_TRUE(error == TDM_ERROR_NONE);
2045 for (int i = 1; i < 10; ++i) {
2046 utVblankHandlerIsCalled = 0;
2048 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2049 ASSERT_TRUE(error == TDM_ERROR_NONE);
2051 UtHandleVblankEvent();
2053 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2054 ASSERT_TRUE(data == 1);
2058 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithSameSeq)
2063 SKIP_FLAG(has_output);
2065 if (!con_output_vblank)
2068 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2069 ASSERT_TRUE(error == TDM_ERROR_NONE);
2071 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2072 ASSERT_TRUE(error == TDM_ERROR_NONE);
2074 error = tdm_vblank_set_offset(con_output_vblank, 0);
2075 ASSERT_TRUE(error == TDM_ERROR_NONE);
2077 for (int i = 1; i < 10; ++i) {
2078 utVblankHandlerIsCalled = 0;
2081 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, 2, UtVblankHandler, &data);
2082 ASSERT_TRUE(error == TDM_ERROR_NONE);
2084 UtHandleVblankEvent();
2086 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2087 ASSERT_TRUE(data == 1);
2091 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithBigFps)
2096 SKIP_FLAG(has_output);
2098 if (!con_output_vblank)
2101 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2102 ASSERT_TRUE(error == TDM_ERROR_NONE);
2104 error = tdm_vblank_set_fps(con_output_vblank, 5000);
2105 ASSERT_TRUE(error == TDM_ERROR_NONE);
2107 for (int i = 1; i < 10; ++i) {
2108 utVblankHandlerIsCalled = 0;
2111 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2112 ASSERT_TRUE(error == TDM_ERROR_NONE);
2117 UtHandleVblankEvent();
2119 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2120 ASSERT_TRUE(data == 1);
2124 TEST_F(TDMVblankWait, VblankWaitSeqSuccessRepeatedlyWithDelay)
2129 SKIP_FLAG(has_output);
2131 if (!con_output_vblank)
2134 error = tdm_vblank_ignore_global_fps(con_output_vblank, 0);
2135 ASSERT_TRUE(error == TDM_ERROR_NONE);
2137 error = tdm_vblank_set_fps(con_output_vblank, preferred_mode->vrefresh);
2138 ASSERT_TRUE(error == TDM_ERROR_NONE);
2140 for (int i = 1; i < 10; ++i) {
2141 utVblankHandlerIsCalled = 0;
2144 error = tdm_vblank_wait_seq(con_output_vblank, 0, 0, i, UtVblankHandler, &data);
2145 ASSERT_TRUE(error == TDM_ERROR_NONE);
2149 UtHandleVblankEvent();
2151 ASSERT_TRUE(utVblankHandlerIsCalled == 1);
2152 ASSERT_TRUE(data == 1);