5 #include <sys/timerfd.h>
11 #include <gtest/gtest.h>
17 #include <tbm_bufmgr.h>
18 #include <tbm_drm_helper.h>
22 #include "tdm_helper.h"
23 #include "tdm_config.h"
25 #include "tdm_macro.h"
28 //#define TDM_UT_TEST_WITH_PARAMS
30 extern bool enable_porting_debug;
36 #define TDM_DBG(fmt, args...) tdm_log_print(TDM_LOG_LEVEL_DBG, fmt, ##args)
37 #define TDM_INFO(fmt, args...) tdm_log_print(TDM_LOG_LEVEL_INFO, fmt, ##args)
38 #define TDM_WRN(fmt, args...) tdm_log_print(TDM_LOG_LEVEL_WRN, fmt, ##args)
39 #define TDM_ERR(fmt, args...) tdm_log_print(TDM_LOG_LEVEL_ERR, fmt, ##args)
41 #define TDM_UT_INFO(fmt, args...) tdm_log_printf(TDM_LOG_LEVEL_INFO, fmt, ##args)
42 #define TDM_UT_WRN(fmt, args...) tdm_log_printf(TDM_LOG_LEVEL_WRN, fmt, ##args)
43 #define TDM_UT_ERR(fmt, args...) tdm_log_printf(TDM_LOG_LEVEL_ERR, fmt, ##args)
45 #define TDM_UT_ENTRY() \
46 TDM_ERR("--------------------------------------------- %s", typeid(*this).name())
48 #define TDM_UT_CHECK_FLAG(FLAG) \
51 TDM_UT_WRN("[ ] not supported");\
54 #define TDM_UT_SKIP_FLAG(FLAG) \
57 TDM_UT_WRN("[ SKIPPED ] not supported");\
62 #define TDM_UT_RETURN_IF_FAIL(cond) \
65 TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
69 #define TDM_UT_RETURN_FALSE_IF_FAIL(cond) \
72 TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
76 #define TDM_UT_RETURN_VAL_IF_FAIL(cond, val) \
79 TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
83 #define TDM_UT_GOTO_IF_FAIL(cond, dst) \
86 TDM_UT_ERR("[%s,%d] '%s' failed", __FUNCTION__, __LINE__, #cond); \
91 #define TDM_UT_ASSERT_TRUE(cond, fmt, args...) \
94 if (enable_porting_debug) \
95 TDM_UT_ERR(fmt, ##args); \
96 GTEST_TEST_BOOLEAN_((cond), #cond, false, true, GTEST_FATAL_FAILURE_); \
99 #define TDM_UT_EXPECT_TRUE(cond, fmt, args...) \
102 if (enable_porting_debug) \
103 TDM_UT_ERR(fmt, ##args); \
104 GTEST_TEST_BOOLEAN_((cond), #cond, false, true, GTEST_NONFATAL_FAILURE_); \
108 #define TDM_UT_SIZE_ALIGN(value, base) (((value) + ((base) - 1)) & ~((base) - 1))
110 #define TDM_UT_DUMP_DIR "/tmp/tdm_dump"
111 #define TDM_UT_INVALID_VALUE -42
112 #define TDM_UT_BUFFER_SIZE 256
113 #define TDM_UT_VBLANK_NAME "ut_tdm_vblank"
115 using ::testing::TestWithParam;
116 using ::testing::Bool;
117 using ::testing::Values;
118 using ::testing::Combine;
120 #ifdef TDM_UT_TEST_WITH_PARAMS
121 class TDMEnv : public TestWithParam< ::testing::tuple<bool, bool, const char*> >
128 class TDMEnv : public TestWithParam< ::testing::tuple<const char*> >
136 class TDMDisplay : public TDMEnv
143 bool has_capture_cap;
150 class TDMOutput : public TDMDisplay
154 tdm_output **outputs;
157 bool done1, done2, done3;
164 #ifdef TIZEN_TEST_GCOV
165 extern "C" void __gcov_flush(void);
168 tdm_error ut_tdm_display_handle_events(tdm_display *dpy);
169 bool ut_tdm_display_has_pp_capability(tdm_display *dpy);
170 bool ut_tdm_display_has_capture_capability(tdm_display *dpy);
172 bool ut_tdm_buffer_create(int width, int height, tbm_format format, int flags, bool fill,
173 int count, tbm_surface_h *buffers);
175 bool ut_tdm_output_is_async_dpms_enable(tdm_output *output);
176 bool ut_tdm_output_is_hwc_enable(tdm_output *output);
177 bool ut_tdm_output_is_aod_enable(tdm_output *output);
178 bool ut_tdm_output_is_connected(tdm_output *output);
179 bool ut_tdm_output_mode_setting(tdm_output *output);
180 bool ut_tdm_output_prepare(tdm_display *dpy, tdm_output *output, bool fill);
181 bool ut_tdm_output_prepare_all_output(tdm_display *dpy, tdm_output **outputs, int output_count, bool fill);
182 bool ut_tdm_output_unset(tdm_display *dpy, tdm_output *output);
183 double ut_tdm_output_get_vblank_interval_time(tdm_output *output);
184 tdm_layer *ut_tdm_output_get_primary_layer(tdm_output *output);
186 bool ut_tdm_layer_is_cursor_layer(tdm_layer *layer);
187 bool ut_tdm_layer_is_primary_layer(tdm_layer *layer);
188 bool ut_tdm_layer_is_video_layer(tdm_layer *layer);
189 bool ut_tdm_layer_support_scale(tdm_layer *layer);
190 bool ut_tdm_layer_support_no_crop(tdm_layer *layer);
191 bool ut_tdm_layer_prepare_buffer(tdm_layer *layer, tbm_surface_h *buffers, int buffer_count, bool fill);
192 bool ut_tdm_layer_prepare_buffer_queue(tdm_layer *layer, tbm_surface_queue_h *buffer_queue);
193 bool ut_tdm_layer_fill_info(tdm_layer *layer, tbm_surface_h buffer, tbm_surface_queue_h buffer_queue, tdm_info_layer *info);
194 bool ut_tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
195 bool ut_tdm_layer_set_buffer_with_pos(tdm_layer *layer, tbm_surface_h buffer, tdm_pos *pos);
196 unsigned int ut_tdm_layer_get_output_pipe(tdm_layer *layer);
197 tbm_format ut_tdm_layer_find_best_format(tdm_layer *layer);
198 bool ut_tdm_layer_is_avaiable(tdm_layer *layer);
200 bool ut_tdm_pp_fill_info(tbm_surface_h srcbuf, tbm_surface_h dstbuf, tdm_transform transform, tdm_info_pp *info);
201 bool ut_tdm_capture_fill_info(tdm_output *output, tbm_surface_h buffer, tdm_transform transform,
202 tdm_capture_type type, int frequency, bool stretch, tdm_info_capture *info);
204 /******************************************************************************/
205 /** testing for checking backend's basic implementation **/
206 /******************************************************************************/
207 class TDMBackendEnv : public TDMEnv
214 class TDMBackendBasic : public TDMBackendEnv
219 tdm_output **outputs;
225 tbm_surface_h buffers[3];
230 void UnsetOutput(void);
231 void DestroyBuffers(void);
234 class TDMBackendDisplay : public TDMBackendBasic
237 void SetUp(void) { TDMBackendBasic::SetUp(); }
238 void TearDown(void) { TDMBackendBasic::TearDown(); }
241 char ut_tdm_backend_getchar(void);
243 #define TDM_UT_ASK_YNR(fmt, ...) \
245 if (enable_porting_debug) { \
248 printf(fmt" [Y]es, [n]o, [r]etry): ", ##__VA_ARGS__); \
249 ch = ut_tdm_backend_getchar(); \
250 } while(ch != 'y' && ch != 'n' && ch != 'r'); \
252 GTEST_FATAL_FAILURE_("tc failed"); \