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 **************************************************************************/
35 class TDMHelper : public TDMOutput
43 TDMHelper::TDMHelper()
47 void TDMHelper::SetUp(void)
52 void TDMHelper::TearDown(void)
54 TDMOutput::TearDown();
57 TEST_P(TDMHelper, HelperGetTime)
59 EXPECT_GT(tdm_helper_get_time(), 0.0);
62 TEST_P(TDMHelper, HelperDumpBufferXR24)
66 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
67 EXPECT_NE(buffer, NULL);
69 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
72 snprintf(filename, sizeof filename, "/tmp/%s.png", typeid(*this).name());
73 tdm_helper_dump_buffer(buffer, (const char*)filename);
75 tbm_surface_destroy(buffer);
78 TEST_P(TDMHelper, HelperDumpBufferAR24)
82 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
83 EXPECT_NE(buffer, NULL);
85 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
88 snprintf(filename, sizeof filename, "/tmp/%s.png", typeid(*this).name());
89 tdm_helper_dump_buffer(buffer, (const char*)filename);
91 tbm_surface_destroy(buffer);
94 TEST_P(TDMHelper, HelperDumpBufferNullObject)
97 snprintf(filename, sizeof filename, "/tmp/%s.png", typeid(*this).name());
98 tdm_helper_dump_buffer(NULL, (const char*)filename);
101 TEST_P(TDMHelper, HelperDumpBufferNullOther)
103 tbm_surface_h buffer = (tbm_surface_h)TDM_UT_INVALID_VALUE;
104 tdm_helper_dump_buffer(buffer, NULL);
107 TEST_P(TDMHelper, HelperClearBufferPos)
109 tbm_surface_h buffer;
110 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
112 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
113 EXPECT_NE(buffer, NULL);
115 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
117 tdm_helper_clear_buffer_pos(buffer, &pos);
119 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
121 tbm_surface_destroy(buffer);
124 TEST_P(TDMHelper, HelperClearBufferColor)
126 tbm_surface_h buffer;
127 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
128 unsigned int color = 0xffffff00;
130 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
131 EXPECT_NE(buffer, NULL);
133 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
135 tdm_helper_clear_buffer_color(buffer, &pos, color);
137 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
139 tbm_surface_destroy(buffer);
142 TEST_P(TDMHelper, HelperClearBufferARGB)
144 tbm_surface_h buffer;
146 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
147 EXPECT_NE(buffer, NULL);
149 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
151 tdm_helper_clear_buffer(buffer);
153 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
155 tbm_surface_destroy(buffer);
158 TEST_P(TDMHelper, HelperClearBufferXRGB)
160 tbm_surface_h buffer;
162 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
163 EXPECT_NE(buffer, NULL);
165 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
167 tdm_helper_clear_buffer(buffer);
169 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
171 tbm_surface_destroy(buffer);
174 TEST_P(TDMHelper, HelperClearBufferYUV420)
176 tbm_surface_h buffer;
178 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
179 EXPECT_NE(buffer, NULL);
181 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
183 tdm_helper_clear_buffer(buffer);
185 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
187 tbm_surface_destroy(buffer);
190 TEST_P(TDMHelper, HelperClearBufferNV12)
192 tbm_surface_h buffer;
194 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV12);
195 EXPECT_NE(buffer, NULL);
197 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
199 tdm_helper_clear_buffer(buffer);
201 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
203 tbm_surface_destroy(buffer);
206 TEST_P(TDMHelper, HelperClearBufferNV21)
208 tbm_surface_h buffer;
210 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV21);
211 EXPECT_NE(buffer, NULL);
213 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
215 tdm_helper_clear_buffer(buffer);
217 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
219 tbm_surface_destroy(buffer);
222 TEST_P(TDMHelper, HelperGetBufferFullSize)
224 tbm_surface_h buffer;
225 int w = TDM_UT_INVALID_VALUE, h = TDM_UT_INVALID_VALUE;
227 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
228 EXPECT_NE(buffer, NULL);
230 tdm_helper_get_buffer_full_size(buffer, &w, &h);
231 EXPECT_NE(w, TDM_UT_INVALID_VALUE);
232 EXPECT_GE(w, tbm_surface_get_width(buffer));
233 EXPECT_NE(h, TDM_UT_INVALID_VALUE);
234 EXPECT_GE(h, tbm_surface_get_height(buffer));
236 tbm_surface_destroy(buffer);
239 TEST_P(TDMHelper, HelperConvertBufferRotate0)
241 tbm_surface_h buffer, temp;
244 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
245 EXPECT_NE(buffer, NULL);
246 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
248 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
249 EXPECT_NE(temp, NULL);
251 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
252 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
254 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_NONE);
256 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
258 tbm_surface_destroy(buffer);
259 tbm_surface_destroy(temp);
262 TEST_P(TDMHelper, HelperConvertBufferRotate0Flip)
264 tbm_surface_h buffer, temp;
267 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
268 EXPECT_NE(buffer, NULL);
269 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
271 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
272 EXPECT_NE(temp, NULL);
274 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
275 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
277 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_FLIPPED, 0), TDM_ERROR_NONE);
279 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
281 tbm_surface_destroy(buffer);
282 tbm_surface_destroy(temp);
285 TEST_P(TDMHelper, HelperConvertBufferRotate90)
287 tbm_surface_h buffer, temp;
290 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
291 EXPECT_NE(buffer, NULL);
292 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
294 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
295 EXPECT_NE(temp, NULL);
297 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
298 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
300 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_90, 0), TDM_ERROR_NONE);
302 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
304 tbm_surface_destroy(buffer);
305 tbm_surface_destroy(temp);
308 TEST_P(TDMHelper, HelperConvertBufferRotate180)
310 tbm_surface_h buffer, temp;
313 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
314 EXPECT_NE(buffer, NULL);
315 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
317 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
318 EXPECT_NE(temp, NULL);
320 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
321 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
323 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_180, 0), TDM_ERROR_NONE);
325 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
327 tbm_surface_destroy(buffer);
328 tbm_surface_destroy(temp);
331 TEST_P(TDMHelper, HelperConvertBufferRotate270)
333 tbm_surface_h buffer, temp;
336 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
337 EXPECT_NE(buffer, NULL);
338 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
340 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
341 EXPECT_NE(temp, NULL);
343 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
344 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
346 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_270, 0), TDM_ERROR_NONE);
348 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
350 tbm_surface_destroy(buffer);
351 tbm_surface_destroy(temp);
354 TEST_P(TDMHelper, HelperConvertBufferYUV420)
356 tbm_surface_h buffer, temp;
359 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
360 EXPECT_NE(buffer, NULL);
361 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
363 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_YUV420);
364 EXPECT_NE(temp, NULL);
366 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
367 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
369 EXPECT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_OPERATION_FAILED);
371 tbm_surface_destroy(buffer);
372 tbm_surface_destroy(temp);
375 TEST_P(TDMHelper, HelperGetFD)
377 int fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD");
380 fd = tdm_helper_get_fd("BLURBLUR");
384 TEST_P(TDMHelper, HelperSetFD)
386 tdm_helper_set_fd("TDM_DRM_MASTER_FD", -1);
387 tdm_helper_set_fd("BLURBLUR", -1);
390 TEST_P(TDMHelper, HelperDumpStart)
394 snprintf(path, sizeof path, "blurblur");
395 tdm_helper_dump_start(path, &count);
396 tdm_helper_dump_stop();
400 _tc_tdm_helper_capture_cb(tbm_surface_h buffer, void *user_data)
404 TEST_P(TDMHelper, HelperCaptureOutput)
409 for (int o = 0; o < output_count; o++) {
412 output = tdm_display_get_output(dpy, o, &ret);
413 EXPECT_EQ(ret, TDM_ERROR_NONE);
414 EXPECT_NE(output, NULL);
416 if (!tc_tdm_output_is_connected(output))
419 if (tc_tdm_output_is_hwc_enable(outputs[o]))
422 EXPECT_EQ(tc_tdm_output_prepare(dpy, output, true), true);
424 dump = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
425 EXPECT_NE(dump, NULL);
427 EXPECT_EQ(tdm_helper_capture_output(output, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
428 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_NONE);
430 tdm_helper_dump_buffer_str(dump, NULL, (char*)typeid(*this).name());
432 tbm_surface_destroy(dump);
437 TEST_P(TDMHelper, HelperCaptureOutputNullObject)
439 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
441 EXPECT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
442 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
445 TEST_P(TDMHelper, HelperCaptureOutputNullOther)
447 for (int o = 0; o < output_count; o++) {
449 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
450 EXPECT_EQ(ret, TDM_ERROR_NONE);
451 EXPECT_NE(output, NULL);
452 tdm_helper_output_commit_per_vblank_enabled(output);
455 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
457 EXPECT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
458 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
461 TEST_P(TDMHelper, HelperGetDisplayInformation)
464 int len = sizeof reply;
466 for (int o = 0; o < output_count; o++) {
468 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
469 EXPECT_EQ(ret, TDM_ERROR_NONE);
470 EXPECT_NE(output, NULL);
471 if (!tc_tdm_output_is_connected(output))
473 EXPECT_EQ(tc_tdm_output_prepare(dpy, output, true), true);
476 tdm_helper_get_display_information(dpy, reply, &len);
477 TDM_INFO("%s", reply);
480 TEST_P(TDMHelper, HelperGetDisplayInformationNullObject)
483 int len = sizeof reply;
485 tdm_helper_get_display_information(NULL, reply, &len);
488 TEST_P(TDMHelper, HelperGetDisplayInformationNullOther)
490 tdm_helper_get_display_information(dpy, NULL, NULL);
493 TEST_P(TDMHelper, HelperCommitPerVblankEnabled)
495 EXPECT_EQ(tdm_helper_commit_per_vblank_enabled(dpy), 0);
498 TEST_P(TDMHelper, HelperCommitPerVblankEnabledNullOBject)
500 EXPECT_EQ(tdm_helper_commit_per_vblank_enabled(NULL), 0);
503 TEST_P(TDMHelper, HelperOutputCommitPerVblankEnabledNullObject)
505 EXPECT_EQ(tdm_helper_output_commit_per_vblank_enabled(NULL), -1);
508 #ifdef TDM_UT_TEST_WITH_PARAMS
509 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
511 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
513 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
515 Values(TDM_DEFAULT_MODULE));