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 **************************************************************************/
33 class TDMHelper : public TDMOutput
41 TDMHelper::TDMHelper()
45 void TDMHelper::SetUp(void)
50 void TDMHelper::TearDown(void)
52 TDMOutput::TearDown();
55 TEST_P(TDMHelper, HelperGetTime)
57 ASSERT_GT(tdm_helper_get_time(), 0.0);
60 TEST_P(TDMHelper, HelperDumpBufferXR24)
64 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
65 ASSERT_NE(buffer, NULL);
67 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
70 snprintf(filename, sizeof filename, "%s.png", typeid(*this).name());
71 tdm_helper_dump_buffer(buffer, (const char*)filename);
73 tbm_surface_destroy(buffer);
76 TEST_P(TDMHelper, HelperDumpBufferAR24)
80 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
81 ASSERT_NE(buffer, NULL);
83 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
86 snprintf(filename, sizeof filename, "%s.png", typeid(*this).name());
87 tdm_helper_dump_buffer(buffer, (const char*)filename);
89 tbm_surface_destroy(buffer);
92 TEST_P(TDMHelper, HelperDumpBufferNullObject)
95 tdm_helper_dump_buffer(NULL, (const char*)filename);
98 TEST_P(TDMHelper, HelperDumpBufferNullOther)
100 tbm_surface_h buffer = (tbm_surface_h)TDM_UT_INVALID_VALUE;
101 tdm_helper_dump_buffer(buffer, NULL);
104 TEST_P(TDMHelper, HelperClearBufferPos)
106 tbm_surface_h buffer;
107 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
109 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
110 ASSERT_NE(buffer, NULL);
112 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
114 tdm_helper_clear_buffer_pos(buffer, &pos);
116 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
118 tbm_surface_destroy(buffer);
121 TEST_P(TDMHelper, HelperClearBufferColor)
123 tbm_surface_h buffer;
124 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
125 unsigned int color = 0xffffff00;
127 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
128 ASSERT_NE(buffer, NULL);
130 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
132 tdm_helper_clear_buffer_color(buffer, &pos, color);
134 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
136 tbm_surface_destroy(buffer);
139 TEST_P(TDMHelper, HelperClearBufferARGB)
141 tbm_surface_h buffer;
143 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
144 ASSERT_NE(buffer, NULL);
146 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
148 tdm_helper_clear_buffer(buffer);
150 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
152 tbm_surface_destroy(buffer);
155 TEST_P(TDMHelper, HelperClearBufferXRGB)
157 tbm_surface_h buffer;
159 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
160 ASSERT_NE(buffer, NULL);
162 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
164 tdm_helper_clear_buffer(buffer);
166 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
168 tbm_surface_destroy(buffer);
171 TEST_P(TDMHelper, HelperClearBufferYUV420)
173 tbm_surface_h buffer;
175 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
176 ASSERT_NE(buffer, NULL);
178 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
180 tdm_helper_clear_buffer(buffer);
182 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
184 tbm_surface_destroy(buffer);
187 TEST_P(TDMHelper, HelperClearBufferNV12)
189 tbm_surface_h buffer;
191 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV12);
192 ASSERT_NE(buffer, NULL);
194 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
196 tdm_helper_clear_buffer(buffer);
198 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
200 tbm_surface_destroy(buffer);
203 TEST_P(TDMHelper, HelperClearBufferNV21)
205 tbm_surface_h buffer;
207 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV21);
208 ASSERT_NE(buffer, NULL);
210 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
212 tdm_helper_clear_buffer(buffer);
214 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
216 tbm_surface_destroy(buffer);
219 TEST_P(TDMHelper, HelperGetBufferFullSize)
221 tbm_surface_h buffer;
222 int w = TDM_UT_INVALID_VALUE, h = TDM_UT_INVALID_VALUE;
224 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
225 ASSERT_NE(buffer, NULL);
227 tdm_helper_get_buffer_full_size(buffer, &w, &h);
228 ASSERT_NE(w, TDM_UT_INVALID_VALUE);
229 ASSERT_GE(w, tbm_surface_get_width(buffer));
230 ASSERT_NE(h, TDM_UT_INVALID_VALUE);
231 ASSERT_GE(h, tbm_surface_get_height(buffer));
233 tbm_surface_destroy(buffer);
236 TEST_P(TDMHelper, HelperConvertBufferRotate0)
238 tbm_surface_h buffer, temp;
241 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
242 ASSERT_NE(buffer, NULL);
243 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
245 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
246 ASSERT_NE(temp, NULL);
248 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
249 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
251 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_NONE);
253 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
255 tbm_surface_destroy(buffer);
256 tbm_surface_destroy(temp);
259 TEST_P(TDMHelper, HelperConvertBufferRotate0Flip)
261 tbm_surface_h buffer, temp;
264 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
265 ASSERT_NE(buffer, NULL);
266 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
268 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
269 ASSERT_NE(temp, NULL);
271 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
272 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
274 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_FLIPPED, 0), TDM_ERROR_NONE);
276 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
278 tbm_surface_destroy(buffer);
279 tbm_surface_destroy(temp);
282 TEST_P(TDMHelper, HelperConvertBufferRotate90)
284 tbm_surface_h buffer, temp;
287 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
288 ASSERT_NE(buffer, NULL);
289 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
291 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
292 ASSERT_NE(temp, NULL);
294 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
295 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
297 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_90, 0), TDM_ERROR_NONE);
299 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
301 tbm_surface_destroy(buffer);
302 tbm_surface_destroy(temp);
305 TEST_P(TDMHelper, HelperConvertBufferRotate180)
307 tbm_surface_h buffer, temp;
310 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
311 ASSERT_NE(buffer, NULL);
312 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
314 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
315 ASSERT_NE(temp, NULL);
317 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
318 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
320 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_180, 0), TDM_ERROR_NONE);
322 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
324 tbm_surface_destroy(buffer);
325 tbm_surface_destroy(temp);
328 TEST_P(TDMHelper, HelperConvertBufferRotate270)
330 tbm_surface_h buffer, temp;
333 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
334 ASSERT_NE(buffer, NULL);
335 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
337 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
338 ASSERT_NE(temp, NULL);
340 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
341 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
343 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_270, 0), TDM_ERROR_NONE);
345 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
347 tbm_surface_destroy(buffer);
348 tbm_surface_destroy(temp);
351 TEST_P(TDMHelper, HelperConvertBufferYUV420)
353 tbm_surface_h buffer, temp;
356 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
357 ASSERT_NE(buffer, NULL);
358 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
360 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_YUV420);
361 ASSERT_NE(temp, NULL);
363 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
364 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
366 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_OPERATION_FAILED);
368 tbm_surface_destroy(buffer);
369 tbm_surface_destroy(temp);
372 TEST_P(TDMHelper, HelperGetFD)
374 int fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD");
377 fd = tdm_helper_get_fd("BLURBLUR");
381 TEST_P(TDMHelper, HelperSetFD)
383 tdm_helper_set_fd("TDM_DRM_MASTER_FD", -1);
384 tdm_helper_set_fd("BLURBLUR", -1);
387 TEST_P(TDMHelper, HelperDumpStart)
391 snprintf(path, sizeof path, "blurblur");
392 tdm_helper_dump_start(path, &count);
393 tdm_helper_dump_stop();
397 _ut_tdm_helper_capture_cb(tbm_surface_h buffer, void *user_data)
401 TEST_P(TDMHelper, HelperCaptureOutput)
406 for (int o = 0; o < output_count; o++) {
409 output = tdm_display_get_output(dpy, o, &ret);
410 ASSERT_EQ(ret, TDM_ERROR_NONE);
411 ASSERT_NE(output, NULL);
413 if (!ut_tdm_output_is_connected(output))
416 ASSERT_EQ(ut_tdm_output_prepare(dpy, output, true), true);
418 dump = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
419 ASSERT_NE(dump, NULL);
421 ASSERT_EQ(tdm_helper_capture_output(output, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
422 _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_NONE);
424 tdm_helper_dump_buffer_str(dump, NULL, (char*)typeid(*this).name());
426 tbm_surface_destroy(dump);
431 TEST_P(TDMHelper, HelperCaptureOutputNullObject)
433 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
435 ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
436 _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
439 TEST_P(TDMHelper, HelperCaptureOutputNullOther)
441 for (int o = 0; o < output_count; o++) {
443 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
444 ASSERT_EQ(ret, TDM_ERROR_NONE);
445 ASSERT_NE(output, NULL);
446 tdm_helper_output_commit_per_vblank_enabled(output);
449 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
451 ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
452 _ut_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
455 TEST_P(TDMHelper, HelperGetDisplayInformation)
458 int len = sizeof reply;
460 for (int o = 0; o < output_count; o++) {
462 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
463 ASSERT_EQ(ret, TDM_ERROR_NONE);
464 ASSERT_NE(output, NULL);
465 if (!ut_tdm_output_is_connected(output))
467 ASSERT_EQ(ut_tdm_output_prepare(dpy, output, true), true);
470 tdm_helper_get_display_information(dpy, reply, &len);
471 TDM_INFO("%s", reply);
474 TEST_P(TDMHelper, HelperGetDisplayInformationNullObject)
477 int len = sizeof reply;
479 tdm_helper_get_display_information(NULL, reply, &len);
482 TEST_P(TDMHelper, HelperGetDisplayInformationNullOther)
484 tdm_helper_get_display_information(dpy, NULL, NULL);
487 TEST_P(TDMHelper, HelperCommitPerVblankEnabled)
489 tdm_helper_commit_per_vblank_enabled(dpy);
492 TEST_P(TDMHelper, HelperCommitPerVblankEnabledNullOBject)
494 tdm_helper_commit_per_vblank_enabled(NULL);
497 TEST_P(TDMHelper, HelperOutputCommitPerVblankEnabled)
499 for (int o = 0; o < output_count; o++) {
501 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
502 ASSERT_EQ(ret, TDM_ERROR_NONE);
503 ASSERT_NE(output, NULL);
504 tdm_helper_output_commit_per_vblank_enabled(output);
508 TEST_P(TDMHelper, HelperOutputCommitPerVblankEnabledNullObject)
510 tdm_helper_output_commit_per_vblank_enabled(NULL);
513 #ifdef TDM_UT_TEST_WITH_PARAMS
514 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
516 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
518 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
520 Values(TDM_DEFAULT_MODULE));