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 ASSERT_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 ASSERT_NE(buffer, NULL);
69 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
72 snprintf(filename, sizeof filename, "%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 ASSERT_NE(buffer, NULL);
85 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
88 snprintf(filename, sizeof filename, "%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 tdm_helper_dump_buffer(NULL, (const char*)filename);
100 TEST_P(TDMHelper, HelperDumpBufferNullOther)
102 tbm_surface_h buffer = (tbm_surface_h)TDM_UT_INVALID_VALUE;
103 tdm_helper_dump_buffer(buffer, NULL);
106 TEST_P(TDMHelper, HelperClearBufferPos)
108 tbm_surface_h buffer;
109 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
111 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
112 ASSERT_NE(buffer, NULL);
114 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
116 tdm_helper_clear_buffer_pos(buffer, &pos);
118 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
120 tbm_surface_destroy(buffer);
123 TEST_P(TDMHelper, HelperClearBufferColor)
125 tbm_surface_h buffer;
126 tdm_pos pos = {.x = 40, .y = 40, .w = TDM_UT_BUFFER_SIZE - 80, .h = TDM_UT_BUFFER_SIZE - 80};
127 unsigned int color = 0xffffff00;
129 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
130 ASSERT_NE(buffer, NULL);
132 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
134 tdm_helper_clear_buffer_color(buffer, &pos, color);
136 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
138 tbm_surface_destroy(buffer);
141 TEST_P(TDMHelper, HelperClearBufferARGB)
143 tbm_surface_h buffer;
145 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
146 ASSERT_NE(buffer, NULL);
148 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
150 tdm_helper_clear_buffer(buffer);
152 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
154 tbm_surface_destroy(buffer);
157 TEST_P(TDMHelper, HelperClearBufferXRGB)
159 tbm_surface_h buffer;
161 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_XRGB8888);
162 ASSERT_NE(buffer, NULL);
164 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
166 tdm_helper_clear_buffer(buffer);
168 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
170 tbm_surface_destroy(buffer);
173 TEST_P(TDMHelper, HelperClearBufferYUV420)
175 tbm_surface_h buffer;
177 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
178 ASSERT_NE(buffer, NULL);
180 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
182 tdm_helper_clear_buffer(buffer);
184 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
186 tbm_surface_destroy(buffer);
189 TEST_P(TDMHelper, HelperClearBufferNV12)
191 tbm_surface_h buffer;
193 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV12);
194 ASSERT_NE(buffer, NULL);
196 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
198 tdm_helper_clear_buffer(buffer);
200 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
202 tbm_surface_destroy(buffer);
205 TEST_P(TDMHelper, HelperClearBufferNV21)
207 tbm_surface_h buffer;
209 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_NV21);
210 ASSERT_NE(buffer, NULL);
212 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
214 tdm_helper_clear_buffer(buffer);
216 tdm_helper_dump_buffer_str(buffer, NULL, (char*)typeid(*this).name());
218 tbm_surface_destroy(buffer);
221 TEST_P(TDMHelper, HelperGetBufferFullSize)
223 tbm_surface_h buffer;
224 int w = TDM_UT_INVALID_VALUE, h = TDM_UT_INVALID_VALUE;
226 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
227 ASSERT_NE(buffer, NULL);
229 tdm_helper_get_buffer_full_size(buffer, &w, &h);
230 ASSERT_NE(w, TDM_UT_INVALID_VALUE);
231 ASSERT_GE(w, tbm_surface_get_width(buffer));
232 ASSERT_NE(h, TDM_UT_INVALID_VALUE);
233 ASSERT_GE(h, tbm_surface_get_height(buffer));
235 tbm_surface_destroy(buffer);
238 TEST_P(TDMHelper, HelperConvertBufferRotate0)
240 tbm_surface_h buffer, temp;
243 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
244 ASSERT_NE(buffer, NULL);
245 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
247 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
248 ASSERT_NE(temp, NULL);
250 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
251 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
253 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_NONE);
255 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
257 tbm_surface_destroy(buffer);
258 tbm_surface_destroy(temp);
261 TEST_P(TDMHelper, HelperConvertBufferRotate0Flip)
263 tbm_surface_h buffer, temp;
266 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
267 ASSERT_NE(buffer, NULL);
268 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
270 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
271 ASSERT_NE(temp, NULL);
273 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
274 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
276 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_FLIPPED, 0), TDM_ERROR_NONE);
278 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
280 tbm_surface_destroy(buffer);
281 tbm_surface_destroy(temp);
284 TEST_P(TDMHelper, HelperConvertBufferRotate90)
286 tbm_surface_h buffer, temp;
289 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
290 ASSERT_NE(buffer, NULL);
291 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
293 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
294 ASSERT_NE(temp, NULL);
296 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
297 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
299 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_90, 0), TDM_ERROR_NONE);
301 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
303 tbm_surface_destroy(buffer);
304 tbm_surface_destroy(temp);
307 TEST_P(TDMHelper, HelperConvertBufferRotate180)
309 tbm_surface_h buffer, temp;
312 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
313 ASSERT_NE(buffer, NULL);
314 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
316 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
317 ASSERT_NE(temp, NULL);
319 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
320 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
322 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_180, 0), TDM_ERROR_NONE);
324 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
326 tbm_surface_destroy(buffer);
327 tbm_surface_destroy(temp);
330 TEST_P(TDMHelper, HelperConvertBufferRotate270)
332 tbm_surface_h buffer, temp;
335 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
336 ASSERT_NE(buffer, NULL);
337 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
339 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_ARGB8888);
340 ASSERT_NE(temp, NULL);
342 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
343 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
345 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_270, 0), TDM_ERROR_NONE);
347 tdm_helper_dump_buffer_str(temp, NULL, (char*)typeid(*this).name());
349 tbm_surface_destroy(buffer);
350 tbm_surface_destroy(temp);
353 TEST_P(TDMHelper, HelperConvertBufferYUV420)
355 tbm_surface_h buffer, temp;
358 buffer = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_YUV420);
359 ASSERT_NE(buffer, NULL);
360 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
362 temp = tbm_surface_create(TDM_UT_BUFFER_SIZE * 2, TDM_UT_BUFFER_SIZE * 2, TBM_FORMAT_YUV420);
363 ASSERT_NE(temp, NULL);
365 sp.x = sp.y = 0, sp.w = sp.h = TDM_UT_BUFFER_SIZE;
366 dp.x = dp.y = 0, dp.w = dp.h = TDM_UT_BUFFER_SIZE * 2;
368 ASSERT_EQ(tdm_helper_convert_buffer(buffer, temp, &sp, &dp, TDM_TRANSFORM_NORMAL, 0), TDM_ERROR_OPERATION_FAILED);
370 tbm_surface_destroy(buffer);
371 tbm_surface_destroy(temp);
374 TEST_P(TDMHelper, HelperGetFD)
376 int fd = tdm_helper_get_fd("TDM_DRM_MASTER_FD");
379 fd = tdm_helper_get_fd("BLURBLUR");
383 TEST_P(TDMHelper, HelperSetFD)
385 tdm_helper_set_fd("TDM_DRM_MASTER_FD", -1);
386 tdm_helper_set_fd("BLURBLUR", -1);
389 TEST_P(TDMHelper, HelperDumpStart)
393 snprintf(path, sizeof path, "blurblur");
394 tdm_helper_dump_start(path, &count);
395 tdm_helper_dump_stop();
399 _tc_tdm_helper_capture_cb(tbm_surface_h buffer, void *user_data)
403 TEST_P(TDMHelper, HelperCaptureOutput)
408 for (int o = 0; o < output_count; o++) {
411 output = tdm_display_get_output(dpy, o, &ret);
412 ASSERT_EQ(ret, TDM_ERROR_NONE);
413 ASSERT_NE(output, NULL);
415 if (!tc_tdm_output_is_connected(output))
418 ASSERT_EQ(tc_tdm_output_prepare(dpy, output, true), true);
420 dump = tbm_surface_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, TBM_FORMAT_ARGB8888);
421 ASSERT_NE(dump, NULL);
423 ASSERT_EQ(tdm_helper_capture_output(output, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
424 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_NONE);
426 tdm_helper_dump_buffer_str(dump, NULL, (char*)typeid(*this).name());
428 tbm_surface_destroy(dump);
433 TEST_P(TDMHelper, HelperCaptureOutputNullObject)
435 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
437 ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
438 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
441 TEST_P(TDMHelper, HelperCaptureOutputNullOther)
443 for (int o = 0; o < output_count; o++) {
445 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
446 ASSERT_EQ(ret, TDM_ERROR_NONE);
447 ASSERT_NE(output, NULL);
448 tdm_helper_output_commit_per_vblank_enabled(output);
451 tbm_surface_h dump = (tbm_surface_h)TDM_UT_INVALID_VALUE;
453 ASSERT_EQ(tdm_helper_capture_output(NULL, dump, 0, 0, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE,
454 _tc_tdm_helper_capture_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
457 TEST_P(TDMHelper, HelperGetDisplayInformation)
460 int len = sizeof reply;
462 for (int o = 0; o < output_count; o++) {
464 tdm_output *output = tdm_display_get_output(dpy, o, &ret);
465 ASSERT_EQ(ret, TDM_ERROR_NONE);
466 ASSERT_NE(output, NULL);
467 if (!tc_tdm_output_is_connected(output))
469 ASSERT_EQ(tc_tdm_output_prepare(dpy, output, true), true);
472 tdm_helper_get_display_information(dpy, reply, &len);
473 TDM_INFO("%s", reply);
476 TEST_P(TDMHelper, HelperGetDisplayInformationNullObject)
479 int len = sizeof reply;
481 tdm_helper_get_display_information(NULL, reply, &len);
484 TEST_P(TDMHelper, HelperGetDisplayInformationNullOther)
486 tdm_helper_get_display_information(dpy, NULL, NULL);
489 TEST_P(TDMHelper, HelperCommitPerVblankEnabled)
491 ASSERT_EQ(tdm_helper_commit_per_vblank_enabled(dpy), 0);
494 TEST_P(TDMHelper, HelperCommitPerVblankEnabledNullOBject)
496 ASSERT_EQ(tdm_helper_commit_per_vblank_enabled(NULL), 0);
499 TEST_P(TDMHelper, HelperOutputCommitPerVblankEnabledNullObject)
501 ASSERT_EQ(tdm_helper_output_commit_per_vblank_enabled(NULL), -1);
504 #ifdef TDM_UT_TEST_WITH_PARAMS
505 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
507 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
509 INSTANTIATE_TEST_CASE_P(TDMHelperParams,
511 Values(TDM_DEFAULT_MODULE));