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 **************************************************************************/
34 class TDMBackendCapture : public TDMBackendDisplay
40 tdm_capture_capability capabilities;
41 const tbm_format *formats;
49 tbm_surface_h buffers[3];
51 tdm_info_capture info;
55 const tdm_output_mode *mode;
69 bool FindLayer(int output_idx, tbm_format fmt, tdm_pos *punch);
70 bool TestPrepareDefault(void);
71 bool TestPrepare(int output_idx, int w, int h, tbm_format fmt, tdm_transform t, tdm_capture_type c, int frequency, bool stretch);
73 void ShowBuffer(int b, tdm_pos *pos);
75 void DumpBuffer(int b, char *test);
76 void DestroyBuffers(void);
79 TDMBackendCapture::TDMBackendCapture()
81 has_capture_cap = false;
83 capabilities = (tdm_capture_capability)0;
86 min_w = min_h = max_w = max_h = preferred_align = -1;
88 for (int b = 0; b < 3; b++)
90 memset(&info, 0, sizeof info);
99 memset(&dst_pos, 0, sizeof dst_pos);
105 void TDMBackendCapture::SetUp(void)
107 tdm_display_capability dpy_capabilities;
109 TDMBackendDisplay::SetUp();
111 EXPECT_EQ(tdm_display_get_capabilities(dpy, &dpy_capabilities), TDM_ERROR_NONE);
112 has_capture_cap = dpy_capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE;
114 if (!has_capture_cap)
117 EXPECT_EQ(tdm_display_get_capture_capabilities(dpy, &capabilities), TDM_ERROR_NONE);
118 EXPECT_GT(capabilities, 0);
119 EXPECT_EQ(tdm_display_get_capture_available_formats(dpy, &formats, &format_count), TDM_ERROR_NONE);
120 EXPECT_NE(formats, NULL);
121 EXPECT_GT(format_count, 0);
122 EXPECT_EQ(tdm_display_get_capture_available_size(dpy, &min_w, &min_h, &max_w, &max_h, &preferred_align), TDM_ERROR_NONE);
123 EXPECT_TRUE(min_w == -1 || min_w > 0);
124 EXPECT_TRUE(min_h == -1 || min_h > 0);
125 EXPECT_TRUE(max_w == -1 || max_w > 0);
126 EXPECT_TRUE(max_h == -1 || max_h > 0);
127 EXPECT_TRUE(preferred_align == -1 || preferred_align > 0);
129 for (int o = 0; o < output_count; o++) {
130 if (!tc_tdm_output_is_connected(outputs[o]))
133 EXPECT_EQ(tc_tdm_output_prepare(dpy, outputs[o], true), true);
137 void TDMBackendCapture::TearDown(void)
140 tdm_capture_destroy(capture);
142 for (int o = 0; o < output_count; o++) {
143 if (!tc_tdm_output_is_connected(outputs[o]))
146 EXPECT_EQ(tc_tdm_output_unset(dpy, outputs[o]), true);
151 TDMBackendDisplay::TearDown();
154 bool TDMBackendCapture::FindLayer(int output_idx, tbm_format fmt, tdm_pos *punch)
158 int primary_zpos, zpos;
159 tdm_layer *primary = tc_tdm_output_get_primary_layer(outputs[output_idx]);
160 TDM_UT_RETURN_FALSE_IF_FAIL(primary != NULL);
161 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(outputs[output_idx], &count) == TDM_ERROR_NONE);
162 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_zpos(primary, &primary_zpos) == TDM_ERROR_NONE);
166 for (int l = 0; l < count; l++) {
168 const tbm_format *dst_formats;
169 int dst_format_count;
171 tdm_layer *temp = tdm_output_get_layer(outputs[output_idx], l, &ret);
172 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
173 TDM_UT_RETURN_FALSE_IF_FAIL(temp != NULL);
174 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_is_usable(temp, &usable) == TDM_ERROR_NONE);
175 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_zpos(temp, &zpos) == TDM_ERROR_NONE);
176 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_available_formats(temp, &dst_formats, &dst_format_count) == TDM_ERROR_NONE);
177 TDM_UT_RETURN_FALSE_IF_FAIL(dst_formats != NULL);
178 TDM_UT_RETURN_FALSE_IF_FAIL(dst_format_count > 0);
182 for (int f = 0; f < dst_format_count; f++) {
183 if (dst_formats[f] == fmt) {
192 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_index(dst_layer, &dst_layer_index) == TDM_ERROR_NONE);
197 if (dst_layer && (dst_zpos < primary_zpos)) {
198 tbm_surface_h displaying_buffer = tdm_layer_get_displaying_buffer(primary, &ret);
199 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
200 TDM_UT_RETURN_FALSE_IF_FAIL(displaying_buffer != NULL);
201 tdm_helper_clear_buffer_pos(displaying_buffer, punch);
207 bool TDMBackendCapture::TestPrepareDefault(void)
211 for (int o = 0; o < output_count; o++) {
212 if (!tc_tdm_output_is_connected(outputs[o]))
215 capture = tdm_output_create_capture(outputs[o], &ret);
216 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
217 TDM_UT_RETURN_FALSE_IF_FAIL(capture != NULL);
219 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[0], 0, false, 3, buffers) == true);
220 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_capture_fill_info(outputs[o], buffers[0], TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false, &info) == true);
221 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_capture_set_info(capture, &info) == TDM_ERROR_NONE);
229 return (capture) ? true : false;
232 bool TDMBackendCapture::TestPrepare(int output_idx, int w, int h, tbm_format fmt, tdm_transform t, tdm_capture_type c, int frequency, bool stretch)
237 TDM_UT_RETURN_FALSE_IF_FAIL(outputs != NULL);
238 TDM_UT_RETURN_FALSE_IF_FAIL(output_count > 0);
239 TDM_UT_RETURN_FALSE_IF_FAIL(output_count >= output_idx);
241 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_display_get_capture_capabilities(dpy, &capabilities) == TDM_ERROR_NONE);
242 TDM_UT_RETURN_FALSE_IF_FAIL(capabilities > 0);
244 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_display_get_capture_available_size(dpy, &min_w, &min_h, &max_w, &max_h, &preferred_align) == TDM_ERROR_NONE);
245 TDM_UT_RETURN_FALSE_IF_FAIL(min_w == -1 || min_w > 0);
246 TDM_UT_RETURN_FALSE_IF_FAIL(min_h == -1 || min_h > 0);
247 TDM_UT_RETURN_FALSE_IF_FAIL(max_w == -1 || max_w > 0);
248 TDM_UT_RETURN_FALSE_IF_FAIL(max_h == -1 || max_h > 0);
249 TDM_UT_RETURN_FALSE_IF_FAIL(preferred_align == -1 || preferred_align > 0);
251 capture = tdm_output_create_capture(outputs[output_idx], &ret);
252 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
253 TDM_UT_RETURN_FALSE_IF_FAIL(capture != NULL);
256 tdm_layer_capability capabilities;
257 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_capabilities(dst_layer, &capabilities) == TDM_ERROR_NONE);
258 if (capabilities & TDM_LAYER_CAPABILITY_SCANOUT)
259 flags |= TBM_BO_SCANOUT;
262 if (tc_tdm_output_is_hwc_enable(outputs[output_idx]))
263 flags |= TBM_BO_SCANOUT;
265 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(w, h, fmt, flags, false, 3, buffers) == true);
266 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_capture_fill_info(outputs[output_idx], buffers[0], t, c, frequency, stretch, &info) == true);
267 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_capture_set_info(capture, &info) == TDM_ERROR_NONE);
269 output = outputs[output_idx];
274 void TDMBackendCapture::TestDone(void)
277 tdm_capture_destroy(capture);
284 void TDMBackendCapture::DumpBuffer(int b, char *test)
288 snprintf(filename, sizeof filename, "%s_%s_%d", typeid(*this).name(), test, b);
290 snprintf(filename, sizeof filename, "%s_%d", typeid(*this).name(), b);
291 tdm_helper_dump_buffer_str(buffers[b], NULL, filename);
294 void TDMBackendCapture::ShowBuffer(int b, tdm_pos *pos)
296 EXPECT_NE(output, NULL);
297 EXPECT_NE(dst_layer, NULL);
299 EXPECT_EQ(tc_tdm_layer_set_buffer_with_pos(dst_layer, buffers[b], pos), true);
300 EXPECT_EQ(tdm_output_commit(output, 0, NULL, NULL), TDM_ERROR_NONE);
303 void TDMBackendCapture::HideLayer(void)
305 EXPECT_NE(output, NULL);
306 EXPECT_NE(dst_layer, NULL);
308 tdm_layer_unset_buffer(dst_layer);
309 tdm_output_commit(output, 0, NULL, NULL);
314 void TDMBackendCapture::DestroyBuffers(void)
316 for (int b = 0; b < 3; b++) {
317 tbm_surface_destroy(buffers[b]);
323 _tc_tdm_capture_fit_rect(int src_w, int src_h, int dst_w, int dst_h, tdm_pos *fit)
327 if (src_w <= 0 || src_h <= 0 || dst_w <= 0 || dst_h <= 0 || !fit)
330 rw = (float)src_w / dst_w;
331 rh = (float)src_h / dst_h;
337 fit->y = (dst_h - fit->h) / 2;
338 } else if (rw < rh) {
341 fit->x = (dst_w - fit->w) / 2;
355 tc_tdm_capture_fill_info(tdm_output *output, tbm_surface_h buffer, tdm_transform transform,
356 tdm_capture_type type, int frequency, bool stretch, tdm_info_capture *info)
359 const tdm_output_mode *mode = NULL;
361 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE);
362 TDM_UT_RETURN_FALSE_IF_FAIL(mode != NULL);
364 memset(info, 0, sizeof *info);
366 bw = bh = TDM_UT_INVALID_VALUE;
367 tdm_helper_get_buffer_full_size(buffer, &bw, &bh);
369 TDM_UT_RETURN_FALSE_IF_FAIL(bw != TDM_UT_INVALID_VALUE);
370 TDM_UT_RETURN_FALSE_IF_FAIL(bw >= tbm_surface_get_width(buffer));
371 TDM_UT_RETURN_FALSE_IF_FAIL(bh != TDM_UT_INVALID_VALUE);
372 TDM_UT_RETURN_FALSE_IF_FAIL(bh >= tbm_surface_get_height(buffer));
373 info->dst_config.size.h = bw;
374 info->dst_config.size.v = bh;
377 info->dst_config.pos.x = 0;
378 info->dst_config.pos.y = 0;
379 info->dst_config.pos.w = tbm_surface_get_width(buffer);
380 info->dst_config.pos.h = tbm_surface_get_height(buffer);
382 _tc_tdm_capture_fit_rect(mode->hdisplay, mode->vdisplay,
383 tbm_surface_get_width(buffer), tbm_surface_get_height(buffer),
384 &info->dst_config.pos);
387 info->dst_config.format = tbm_surface_get_format(buffer);
389 info->transform = transform;
394 frequency = mode->vrefresh;
396 info->frequency = frequency;
398 TDM_UT_INFO("filling capture info done: dst_config(%dx%d: %d,%d %dx%d: %c%c%c%c) transform(%s) type(%s) freq(%d)",
399 info->dst_config.size.h, info->dst_config.size.v,
400 info->dst_config.pos.x, info->dst_config.pos.y, info->dst_config.pos.w, info->dst_config.pos.h,
401 FOURCC_STR(info->dst_config.format),
402 tdm_transform_str(info->transform), tdm_capture_type_str(info->type), info->frequency);
407 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableFormats)
409 const tbm_format *formats = (const tbm_format *)TDM_UT_INVALID_VALUE;
410 int count = TDM_UT_INVALID_VALUE;
411 if (has_capture_cap) {
412 EXPECT_EQ(tdm_display_get_capture_available_formats(dpy, &formats, &count), TDM_ERROR_NONE);
413 EXPECT_TRUE(formats != NULL && formats != (const tbm_format *)TDM_UT_INVALID_VALUE);
414 EXPECT_TRUE(count > 0 && count != TDM_UT_INVALID_VALUE);
416 EXPECT_EQ(tdm_display_get_capture_available_formats(dpy, &formats, &count), TDM_ERROR_NO_CAPABILITY);
417 EXPECT_EQ(formats, (const tbm_format *)TDM_UT_INVALID_VALUE);
418 EXPECT_EQ(count, TDM_UT_INVALID_VALUE);
422 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableFormatsNullObject)
424 const tbm_format *formats = (const tbm_format *)TDM_UT_INVALID_VALUE;
425 int count = TDM_UT_INVALID_VALUE;
426 EXPECT_EQ(tdm_display_get_capture_available_formats(NULL, &formats, &count), TDM_ERROR_INVALID_PARAMETER);
427 EXPECT_EQ(formats, (const tbm_format *)TDM_UT_INVALID_VALUE);
428 EXPECT_EQ(count, TDM_UT_INVALID_VALUE);
431 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableFormatsNullOther)
433 EXPECT_EQ(tdm_display_get_capture_available_formats(dpy, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
436 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableSize)
438 int min_w = TDM_UT_INVALID_VALUE;
439 int min_h = TDM_UT_INVALID_VALUE;
440 int max_w = TDM_UT_INVALID_VALUE;
441 int max_h = TDM_UT_INVALID_VALUE;
442 int preferred_align = TDM_UT_INVALID_VALUE;
443 if (has_capture_cap) {
444 EXPECT_EQ(tdm_display_get_capture_available_size(dpy, &min_w, &min_h, &max_w, &max_h, &preferred_align), TDM_ERROR_NONE);
445 EXPECT_NE(min_w, TDM_UT_INVALID_VALUE);
446 EXPECT_NE(min_h, TDM_UT_INVALID_VALUE);
447 EXPECT_NE(max_w, TDM_UT_INVALID_VALUE);
448 EXPECT_NE(max_h, TDM_UT_INVALID_VALUE);
449 EXPECT_NE(preferred_align, TDM_UT_INVALID_VALUE);
451 EXPECT_EQ(tdm_display_get_capture_available_size(dpy, &min_w, &min_h, &max_w, &max_h, &preferred_align), TDM_ERROR_NO_CAPABILITY);
452 EXPECT_EQ(min_w, TDM_UT_INVALID_VALUE);
453 EXPECT_EQ(min_h, TDM_UT_INVALID_VALUE);
454 EXPECT_EQ(max_w, TDM_UT_INVALID_VALUE);
455 EXPECT_EQ(max_h, TDM_UT_INVALID_VALUE);
456 EXPECT_EQ(preferred_align, TDM_UT_INVALID_VALUE);
460 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableSizeNullObject)
462 int min_w = TDM_UT_INVALID_VALUE;
463 int min_h = TDM_UT_INVALID_VALUE;
464 int max_w = TDM_UT_INVALID_VALUE;
465 int max_h = TDM_UT_INVALID_VALUE;
466 int preferred_align = TDM_UT_INVALID_VALUE;
467 EXPECT_EQ(tdm_display_get_capture_available_size(NULL, &min_w, &min_h, &max_w, &max_h, &preferred_align), TDM_ERROR_INVALID_PARAMETER);
468 EXPECT_EQ(min_w, TDM_UT_INVALID_VALUE);
469 EXPECT_EQ(min_h, TDM_UT_INVALID_VALUE);
470 EXPECT_EQ(max_w, TDM_UT_INVALID_VALUE);
471 EXPECT_EQ(max_h, TDM_UT_INVALID_VALUE);
472 EXPECT_EQ(preferred_align, TDM_UT_INVALID_VALUE);
475 TEST_P(TDMBackendCapture, CaptureDispalyGetAvaiableSizeNullOther)
478 EXPECT_EQ(tdm_display_get_capture_available_size(dpy, NULL, NULL, NULL, NULL, NULL), TDM_ERROR_NONE);
480 EXPECT_EQ(tdm_display_get_capture_available_size(dpy, NULL, NULL, NULL, NULL, NULL), TDM_ERROR_NO_CAPABILITY);
483 TEST_P(TDMBackendCapture, CaptureDestroy)
485 TDM_UT_SKIP_FLAG(has_capture_cap);
486 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
488 EXPECT_EQ(TestPrepareDefault(), true);
493 TEST_P(TDMBackendCapture, CaptureDestroyNullObject)
495 TDM_UT_SKIP_FLAG(has_capture_cap);
496 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
498 tdm_capture_destroy(NULL);
501 TEST_P(TDMBackendCapture, CaptureSetInfo)
503 /* tested in CaptureNoScaleNoTransformNoCSC */
506 TEST_P(TDMBackendCapture, CaptureSetInfoNullObject)
508 TDM_UT_SKIP_FLAG(has_capture_cap);
509 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
511 tdm_info_capture info;
512 memset(&info, 0, sizeof info);
513 EXPECT_EQ(tdm_capture_set_info(NULL, &info), TDM_ERROR_INVALID_PARAMETER);
516 TEST_P(TDMBackendCapture, CaptureSetInfoNullOther)
518 TDM_UT_SKIP_FLAG(has_capture_cap);
519 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
521 EXPECT_EQ(TestPrepareDefault(), true);
523 EXPECT_EQ(tdm_capture_set_info(capture, NULL), TDM_ERROR_INVALID_PARAMETER);
529 _tc_tdm_capture_done_cb(tdm_capture *capture, tbm_surface_h buffer, void *user_data)
531 bool *done = (bool*)user_data;
536 TEST_P(TDMBackendCapture, CaptureSetDoneHandler)
538 TDM_UT_SKIP_FLAG(has_capture_cap);
539 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
541 EXPECT_EQ(TestPrepareDefault(), true);
543 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb, NULL), TDM_ERROR_NONE);
548 TEST_P(TDMBackendCapture, CaptureSetDoneHandlerNullObject)
550 TDM_UT_SKIP_FLAG(has_capture_cap);
551 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
553 EXPECT_EQ(tdm_capture_set_done_handler(NULL, _tc_tdm_capture_done_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
556 TEST_P(TDMBackendCapture, CaptureSetDoneHandlerNullOther)
558 TDM_UT_SKIP_FLAG(has_capture_cap);
559 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
561 EXPECT_EQ(TestPrepareDefault(), true);
563 EXPECT_EQ(tdm_capture_set_done_handler(capture, NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
568 TEST_P(TDMBackendCapture, CaptureAttach)
570 TDM_UT_SKIP_FLAG(has_capture_cap);
571 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
573 for (int o = 0; o < output_count; o++) {
575 if (!tc_tdm_output_is_connected(outputs[o]))
578 for (int f = 0; f < format_count; f++) {
579 if (tc_tdm_output_is_hwc_enable(outputs[o]))
582 FindLayer(o, formats[f], &dst_pos);
584 EXPECT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f],
585 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true);
587 for (int b = 0; b < 3; b++)
588 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
595 TEST_P(TDMBackendCapture, CaptureAttachNullObject)
597 TDM_UT_SKIP_FLAG(has_capture_cap);
598 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
600 tbm_surface_h buffer = (tbm_surface_h)TDM_UT_BUFFER_SIZE;
602 EXPECT_EQ(tdm_capture_attach(NULL, buffer), TDM_ERROR_INVALID_PARAMETER);
605 TEST_P(TDMBackendCapture, CaptureAttachNullOther)
607 TDM_UT_SKIP_FLAG(has_capture_cap);
608 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
610 EXPECT_EQ(TestPrepareDefault(), true);
612 EXPECT_EQ(tdm_capture_attach(capture, NULL), TDM_ERROR_INVALID_PARAMETER);
617 TEST_P(TDMBackendCapture, CaptureCommit)
619 TDM_UT_SKIP_FLAG(has_capture_cap);
620 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
622 EXPECT_EQ(TestPrepareDefault(), true);
624 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
629 TEST_P(TDMBackendCapture, CaptureCommitNullOBject)
631 TDM_UT_SKIP_FLAG(has_capture_cap);
632 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
634 EXPECT_EQ(tdm_capture_commit(NULL), TDM_ERROR_INVALID_PARAMETER);
637 TEST_P(TDMBackendCapture, CaptureCommitDpmsOff)
639 TDM_UT_SKIP_FLAG(has_capture_cap);
640 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
642 EXPECT_EQ(TestPrepareDefault(), true);
644 EXPECT_EQ(tc_tdm_output_unset(dpy, output), true);
646 EXPECT_EQ(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF), TDM_ERROR_NONE);
648 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_BAD_REQUEST);
654 _tc_tdm_capture_done_cb2(tdm_capture *capture, tbm_surface_h buffer, void *user_data)
656 int *done = (int*)user_data;
661 TEST_P(TDMBackendCapture, CaptureDestroyWithoutCommit)
663 TDM_UT_SKIP_FLAG(has_capture_cap);
664 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
666 for (int o = 0; o < output_count; o++) {
667 const tdm_output_mode *mode = NULL;
670 if (!tc_tdm_output_is_connected(outputs[o]))
673 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
675 if (tc_tdm_output_is_hwc_enable(outputs[o]))
678 FindLayer(o, formats[f], &dst_pos);
680 EXPECT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f],
681 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true);
683 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb2, NULL), TDM_ERROR_NONE);
685 for (int b = 0; b < 3; b++)
686 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
688 tdm_capture_destroy(capture);
695 TEST_P(TDMBackendCapture, CaptureDestroyBeforeDone)
697 TDM_UT_SKIP_FLAG(has_capture_cap);
698 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
700 for (int o = 0; o < output_count; o++) {
701 const tdm_output_mode *mode = NULL;
704 if (!tc_tdm_output_is_connected(outputs[o]))
707 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
709 if (tc_tdm_output_is_hwc_enable(outputs[o]))
712 FindLayer(o, formats[f], &dst_pos);
714 EXPECT_EQ(TestPrepare(o, TDM_UT_BUFFER_SIZE, TDM_UT_BUFFER_SIZE, formats[f],
715 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true);
717 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb2, NULL), TDM_ERROR_NONE);
719 for (int b = 0; b < 3; b++)
720 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
722 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
724 tdm_capture_destroy(capture);
731 TEST_P(TDMBackendCapture, CaptureOneshotLetterboxSize)
733 TDM_UT_SKIP_FLAG(has_capture_cap);
734 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
735 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_ONESHOT);
739 for (int o = 0; o < output_count; o++) {
740 const tdm_output_mode *mode = NULL;
742 if (!tc_tdm_output_is_connected(outputs[o]))
745 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
747 for (int f = 0; f < format_count; f++) {
748 int half_size = ((mode->hdisplay <= mode->vdisplay) ? mode->hdisplay : mode->vdisplay) / 2;
750 dst_pos.x = (mode->hdisplay - half_size) / 2;
751 dst_pos.y = (mode->vdisplay - half_size) / 2;
752 dst_pos.w = half_size;
753 dst_pos.h = half_size;
755 TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f]));
757 if (tc_tdm_output_is_hwc_enable(outputs[o]))
760 FindLayer(o, formats[f], &dst_pos);
763 TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f]));
768 EXPECT_EQ(TestPrepare(o, half_size, half_size, formats[f],
769 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true);
771 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb, &done), TDM_ERROR_NONE);
774 for (int b = 0; b < 3; b++) {
776 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
777 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
780 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
784 snprintf(temp, sizeof temp, "f%d_b%d", f, b);
787 if (tc_tdm_output_is_hwc_enable(outputs[o]))
788 TDM_UT_WRN("hwc_enable, not support showing buffer");
790 ShowBuffer(b, &dst_pos);
793 TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)",
794 FOURCC_STR(formats[f]), pipe, dst_layer_index);
796 if (!tc_tdm_output_is_hwc_enable(outputs[o]))
804 TEST_P(TDMBackendCapture, CaptureOneshotFullSize)
806 TDM_UT_SKIP_FLAG(has_capture_cap);
807 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
808 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_ONESHOT);
812 for (int o = 0; o < output_count; o++) {
813 const tdm_output_mode *mode = NULL;
815 if (!tc_tdm_output_is_connected(outputs[o]))
818 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
820 for (int f = 0; f < format_count; f++) {
821 int half_size = ((mode->hdisplay <= mode->vdisplay) ? mode->hdisplay : mode->vdisplay) / 2;
823 dst_pos.x = (mode->hdisplay - half_size) / 2;
824 dst_pos.y = (mode->vdisplay - half_size) / 2;
825 dst_pos.w = half_size;
826 dst_pos.h = half_size;
828 TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f]));
830 if (tc_tdm_output_is_hwc_enable(outputs[o]))
833 FindLayer(o, formats[f], &dst_pos);
836 TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f]));
841 EXPECT_EQ(TestPrepare(o, half_size, half_size, formats[f],
842 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, true), true);
844 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb, &done), TDM_ERROR_NONE);
847 for (int b = 0; b < 3; b++) {
849 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
850 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
853 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
857 snprintf(temp, sizeof temp, "f%d_b%d", f, b);
860 if (tc_tdm_output_is_hwc_enable(outputs[o]))
861 TDM_UT_WRN("hwc_enable, not support showing buffer");
863 ShowBuffer(b, &dst_pos);
866 TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as full size and show? (output: %d, layer: %d)",
867 FOURCC_STR(formats[f]), pipe, dst_layer_index);
869 if (!tc_tdm_output_is_hwc_enable(outputs[o]))
877 TEST_P(TDMBackendCapture, CaptureOneshotAttachFewTimesInOneCommit)
879 TDM_UT_SKIP_FLAG(has_capture_cap);
880 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
881 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_ONESHOT);
885 for (int o = 0; o < output_count; o++) {
886 const tdm_output_mode *mode = NULL;
888 if (!tc_tdm_output_is_connected(outputs[o]))
891 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
893 for (int f = 0; f < format_count; f++) {
894 int half_size = ((mode->hdisplay <= mode->vdisplay) ? mode->hdisplay : mode->vdisplay) / 2;
896 dst_pos.x = (mode->hdisplay - half_size) / 2;
897 dst_pos.y = (mode->vdisplay - half_size) / 2;
898 dst_pos.w = half_size;
899 dst_pos.h = half_size;
901 TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f]));
903 if (tc_tdm_output_is_hwc_enable(outputs[o]))
906 FindLayer(o, formats[f], &dst_pos);
909 TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f]));
914 EXPECT_EQ(TestPrepare(o, half_size, half_size, formats[f],
915 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_ONESHOT, -1, false), true);
918 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_done_cb2, &done), TDM_ERROR_NONE);
921 for (int b = 0; b < 3; b++)
922 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
924 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
927 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
929 for (int b = 0; b < 3; b++) {
932 snprintf(temp, sizeof temp, "f%d_b%d", f, b);
935 if (tc_tdm_output_is_hwc_enable(outputs[o]))
936 TDM_UT_WRN("hwc_enable, not support showing buffer");
938 ShowBuffer(b, &dst_pos);
941 TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)",
942 FOURCC_STR(formats[f]), pipe, dst_layer_index);
944 if (!tc_tdm_output_is_hwc_enable(outputs[o]))
953 _tc_tdm_backend_capture_buffer_release_cb(tbm_surface_h buffer, void *user_data)
955 TDMBackendCapture *backend_capture = (TDMBackendCapture*)user_data;
957 tdm_buffer_remove_release_handler(buffer, _tc_tdm_backend_capture_buffer_release_cb, backend_capture);
959 EXPECT_EQ(tdm_capture_attach(backend_capture->capture, buffer), TDM_ERROR_NONE);
960 EXPECT_EQ(tdm_capture_commit(backend_capture->capture), TDM_ERROR_NONE);
964 _tc_tdm_capture_stream_done_cb(tdm_capture *capture, tbm_surface_h buffer, void *user_data)
966 TDMBackendCapture *backend_capture = (TDMBackendCapture*)user_data;
968 for (int b = 0; b < 3; b++) {
969 if (backend_capture->buffers[b] == buffer) {
972 snprintf(temp, sizeof temp, "f%d_b%d", f, b);
975 tdm_buffer_add_release_handler(buffer, _tc_tdm_backend_capture_buffer_release_cb, (void*)backend_capture);
976 if (tc_tdm_output_is_hwc_enable(backend_capture->output)) {
977 TDM_UT_WRN("hwc_enable, not support showing buffer");
978 _tc_tdm_backend_capture_buffer_release_cb(buffer, user_data);
981 backend_capture->ShowBuffer(b, &backend_capture->dst_pos);
986 if (--backend_capture->stream_count == 0) {
987 backend_capture->stream_exit = 1;
991 TEST_P(TDMBackendCapture, CaptureStreamLetterboxSize)
993 TDM_UT_SKIP_FLAG(has_capture_cap);
994 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
995 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_STREAM);
997 for (int o = 0; o < output_count; o++) {
998 const tdm_output_mode *mode = NULL;
1000 if (!tc_tdm_output_is_connected(outputs[o]))
1003 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
1005 for (int f = 0; f < format_count; f++) {
1006 int half_size = ((mode->hdisplay <= mode->vdisplay) ? mode->hdisplay : mode->vdisplay) / 2;
1008 dst_pos.x = (mode->hdisplay - half_size) / 2;
1009 dst_pos.y = (mode->vdisplay - half_size) / 2;
1010 dst_pos.w = half_size;
1011 dst_pos.h = half_size;
1013 TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f]));
1015 if (tc_tdm_output_is_hwc_enable(outputs[o]))
1018 FindLayer(o, formats[f], &dst_pos);
1021 TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f]));
1026 EXPECT_EQ(TestPrepare(o, half_size, half_size, formats[f],
1027 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_STREAM, -1, false), true);
1029 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_stream_done_cb, (void*)this), TDM_ERROR_NONE);
1031 for (int b = 0; b < 3; b++)
1032 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
1036 stream_exit = false;
1039 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
1041 while (!stream_exit)
1042 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1044 TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as letterbox size and show? (output: %d, layer: %d)",
1045 FOURCC_STR(formats[f]), pipe, dst_layer_index);
1047 if (!tc_tdm_output_is_hwc_enable(outputs[o]))
1055 TEST_P(TDMBackendCapture, CaptureStreamFullSize)
1057 TDM_UT_SKIP_FLAG(has_capture_cap);
1058 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_OUTPUT);
1059 TDM_UT_SKIP_FLAG(capabilities & TDM_CAPTURE_CAPABILITY_STREAM);
1061 for (int o = 0; o < output_count; o++) {
1062 const tdm_output_mode *mode = NULL;
1064 if (!tc_tdm_output_is_connected(outputs[o]))
1067 EXPECT_EQ(tdm_output_get_mode(outputs[o], &mode), TDM_ERROR_NONE);
1069 for (int f = 0; f < format_count; f++) {
1070 int half_size = ((mode->hdisplay <= mode->vdisplay) ? mode->hdisplay : mode->vdisplay) / 2;
1072 dst_pos.x = (mode->hdisplay - half_size) / 2;
1073 dst_pos.y = (mode->vdisplay - half_size) / 2;
1074 dst_pos.w = half_size;
1075 dst_pos.h = half_size;
1077 TDM_UT_INFO("* testing for %c%c%c%c", FOURCC_STR(formats[f]));
1079 if (tc_tdm_output_is_hwc_enable(outputs[o]))
1082 FindLayer(o, formats[f], &dst_pos);
1085 TDM_UT_INFO("no proper layer for %c%c%c%c", FOURCC_STR(formats[f]));
1090 EXPECT_EQ(TestPrepare(o, half_size, half_size, formats[f],
1091 TDM_TRANSFORM_NORMAL, TDM_CAPTURE_TYPE_STREAM, -1, true), true);
1093 EXPECT_EQ(tdm_capture_set_done_handler(capture, _tc_tdm_capture_stream_done_cb, (void*)this), TDM_ERROR_NONE);
1095 for (int b = 0; b < 3; b++)
1096 EXPECT_EQ(tdm_capture_attach(capture, buffers[b]), TDM_ERROR_NONE);
1100 stream_exit = false;
1103 EXPECT_EQ(tdm_capture_commit(capture), TDM_ERROR_NONE);
1105 while (!stream_exit)
1106 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1108 TDM_UT_ASK_YNR("* Successed to capture a output to a '%c%c%c%c' buffer as full size and show? (output: %d, layer: %d)",
1109 FOURCC_STR(formats[f]), pipe, dst_layer_index);
1111 if (!tc_tdm_output_is_hwc_enable(outputs[o]))
1119 #ifdef TDM_UT_TEST_WITH_PARAMS
1120 INSTANTIATE_TEST_CASE_P(TDMBackendCaptureParams,
1122 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
1124 INSTANTIATE_TEST_CASE_P(TDMBackendCaptureParams,
1126 Values(TDM_DEFAULT_MODULE));