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 #define BORDER_SIZE 20
37 class TDMLayer : public TDMOutput
44 tbm_surface_h buffers[3];
45 tbm_surface_queue_h buffer_queue;
51 void DestroyBuffers(void);
58 layer_count = TDM_UT_INVALID_VALUE;
60 for (int b = 0; b < 3; b++)
66 void TDMLayer::SetUp(void)
72 for (int o = 0; o < output_count; o++) {
73 int old_layer_count = layer_count, count = TDM_UT_INVALID_VALUE;
76 if (tc_tdm_output_is_hwc_enable(outputs[o]))
79 EXPECT_EQ(tdm_output_get_layer_count(outputs[o], &count), TDM_ERROR_NONE);
83 layers = (tdm_layer**)realloc(layers, sizeof(tdm_layer*) * layer_count);
84 EXPECT_NE(layers, NULL);
86 for (int l = 0; l < count; l++) {
87 tdm_layer *layer = tdm_output_get_layer(outputs[o], l, &ret);
88 EXPECT_NE(layer, NULL);
89 EXPECT_EQ(ret, TDM_ERROR_NONE);
90 layers[old_layer_count + l] = layer;
98 void TDMLayer::TearDown(void)
100 for (int l = 0; l < layer_count; l++) {
101 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
108 TDMOutput::TearDown();
111 void TDMLayer::DestroyBuffers(void)
113 for (int b = 0; b < 3; b++) {
115 tbm_surface_destroy(buffers[b]);
121 tbm_surface_queue_destroy(buffer_queue);
127 tc_tdm_layer_is_cursor_layer(tdm_layer *layer)
129 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
130 if (tdm_layer_get_capabilities(layer, &capabilities) != TDM_ERROR_NONE)
132 return capabilities & TDM_LAYER_CAPABILITY_CURSOR;
136 tc_tdm_layer_is_primary_layer(tdm_layer *layer)
138 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
139 if (tdm_layer_get_capabilities(layer, &capabilities) != TDM_ERROR_NONE)
141 return capabilities & TDM_LAYER_CAPABILITY_PRIMARY;
145 tc_tdm_layer_is_video_layer(tdm_layer *layer)
147 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
148 if (tdm_layer_get_capabilities(layer, &capabilities) != TDM_ERROR_NONE)
150 return capabilities & TDM_LAYER_CAPABILITY_VIDEO;
154 tc_tdm_layer_support_scale(tdm_layer *layer)
156 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
157 if (tdm_layer_get_capabilities(layer, &capabilities) != TDM_ERROR_NONE)
159 return capabilities & TDM_LAYER_CAPABILITY_SCALE;
163 tc_tdm_layer_support_no_crop(tdm_layer *layer)
165 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
166 if (tdm_layer_get_capabilities(layer, &capabilities) != TDM_ERROR_NONE)
168 return capabilities & TDM_LAYER_CAPABILITY_NO_CROP;
172 tc_tdm_layer_get_output_pipe(tdm_layer *layer)
174 unsigned int pipe = (unsigned int)TDM_UT_INVALID_VALUE;
176 tdm_output *output = tdm_layer_get_output(layer, &ret);
177 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
178 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
180 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_pipe(output, &pipe) == TDM_ERROR_NONE);
181 TDM_UT_RETURN_FALSE_IF_FAIL(pipe != (unsigned int)TDM_UT_INVALID_VALUE);
187 tc_tdm_layer_find_best_format(tdm_layer *layer)
189 const tbm_format *formats = (const tbm_format *)TDM_UT_INVALID_VALUE;
190 int count = TDM_UT_INVALID_VALUE;
192 ret = tdm_layer_get_available_formats(layer, &formats, &count);
193 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
195 for (int f = 0; f < count; f++)
196 if (formats[f] == TBM_FORMAT_ARGB8888)
197 return TBM_FORMAT_ARGB8888;
198 for (int f = 0; f < count; f++)
199 if (formats[f] == TBM_FORMAT_XRGB8888)
200 return TBM_FORMAT_XRGB8888;
201 for (int f = 0; f < count; f++)
202 if (formats[f] == TBM_FORMAT_YUV420)
203 return TBM_FORMAT_YUV420;
204 for (int f = 0; f < count; f++)
205 if (formats[f] == TBM_FORMAT_NV12)
206 return TBM_FORMAT_NV12;
212 tc_tdm_layer_prepare_buffer(tdm_layer *layer, tbm_surface_h *buffers, int buffer_count, bool fill)
215 unsigned int flags = 0;
216 tbm_format format = (tbm_format)0;
219 const tdm_output_mode *mode = NULL;
222 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_buffer_flags(layer, &flags) == TDM_ERROR_NONE);
224 format = tc_tdm_layer_find_best_format(layer);
225 TDM_UT_RETURN_FALSE_IF_FAIL(format != 0);
227 output = tdm_layer_get_output(layer, &ret);
228 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
229 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
231 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE);
232 TDM_UT_RETURN_FALSE_IF_FAIL(mode != NULL);
234 if (tc_tdm_layer_is_primary_layer(layer)) {
238 w = mode->hdisplay / 2;
239 h = mode->vdisplay / 2;
242 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_buffer_create(w, h, format, flags | TBM_BO_SCANOUT, fill, buffer_count, buffers) == true);
244 TDM_INFO("preparing buffers done");
250 tc_tdm_layer_prepare_buffer_queue(tdm_layer *layer, tbm_surface_queue_h *buffer_queue)
253 unsigned int flags = 0;
254 tbm_format format = (tbm_format)0;
258 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_buffer_flags(layer, &flags) == TDM_ERROR_NONE);
260 format = tc_tdm_layer_find_best_format(layer);
261 TDM_UT_RETURN_FALSE_IF_FAIL(format != (tbm_format)0);
263 if (tc_tdm_layer_is_primary_layer(layer)) {
265 const tdm_output_mode *mode = NULL;
266 output = tdm_layer_get_output(layer, &ret);
267 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
268 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
270 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE);
271 TDM_UT_RETURN_FALSE_IF_FAIL(mode != NULL);
276 w = TDM_UT_BUFFER_SIZE;
277 h = TDM_UT_BUFFER_SIZE;
280 *buffer_queue = tbm_surface_queue_create(2, w, h, format, flags | TBM_BO_SCANOUT);
281 TDM_UT_RETURN_FALSE_IF_FAIL((*buffer_queue) != NULL);
283 TDM_INFO("preparing buffers done");
289 tc_tdm_layer_fill_info(tdm_layer *layer, tbm_surface_h buffer, tbm_surface_queue_h buffer_queue, tdm_info_layer *info)
293 const tdm_output_mode *mode = NULL;
300 output = tdm_layer_get_output(layer, &ret);
301 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
302 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
304 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_mode(output, &mode) == TDM_ERROR_NONE);
305 TDM_UT_RETURN_FALSE_IF_FAIL(mode != NULL);
307 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_layer_count(output, &count) == TDM_ERROR_NONE);
308 TDM_UT_RETURN_FALSE_IF_FAIL(count > 0);
310 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_zpos(layer, &zpos) == TDM_ERROR_NONE);
311 TDM_UT_RETURN_FALSE_IF_FAIL(zpos >= 0);
314 tdm_helper_get_buffer_full_size(buffer, &bw, &bh);
315 w = tbm_surface_get_width(buffer);
316 h = tbm_surface_get_height(buffer);
317 format = tbm_surface_get_format(buffer);
318 } else if (buffer_queue) {
319 bw = w = tbm_surface_queue_get_width(buffer_queue);
320 bh = h = tbm_surface_queue_get_height(buffer_queue);
321 format = tbm_surface_queue_get_format(buffer_queue);
327 format = tc_tdm_layer_find_best_format(layer);
330 /* TODO: check min,max,prefered size and avaiable formats */
331 memset(info, 0, sizeof *info);
332 info->src_config.size.h = bw;
333 info->src_config.size.v = bh;
334 info->src_config.pos.x = 0;
335 info->src_config.pos.y = 0;
336 info->src_config.pos.w = w;
337 info->src_config.pos.h = h;
338 info->src_config.format = format;
339 if (tc_tdm_layer_is_primary_layer(layer)) {
343 int x = (((int)mode->hdisplay - 2 * BORDER_SIZE - w) / count) * zpos + BORDER_SIZE;
344 int y = (((int)mode->vdisplay - 2 * BORDER_SIZE - h) / count) * zpos + BORDER_SIZE;
347 info->dst_pos.x = ((x + w) <= (int)mode->hdisplay) ? x : 0;
348 info->dst_pos.y = ((y + h) <= (int)mode->vdisplay) ? y : 0;
352 info->transform = TDM_TRANSFORM_NORMAL;
357 bool tc_tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
359 return tc_tdm_layer_set_buffer_with_pos(layer, buffer, NULL);
362 bool tc_tdm_layer_set_buffer_with_pos(tdm_layer *layer, tbm_surface_h buffer, tdm_pos *pos)
364 tdm_info_layer old_info, info;
366 TDM_UT_RETURN_FALSE_IF_FAIL(buffer != NULL);
368 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_info(layer, &old_info) == TDM_ERROR_NONE);
369 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_layer_fill_info(layer, buffer, NULL, &info) == true);
372 info.dst_pos.x = pos->x;
373 info.dst_pos.y = pos->y;
374 TDM_UT_RETURN_FALSE_IF_FAIL(info.dst_pos.w = pos->w);
375 TDM_UT_RETURN_FALSE_IF_FAIL(info.dst_pos.h = pos->h);
378 if (memcmp(&old_info, &info, sizeof info)) {
379 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_set_info(layer, &info) == TDM_ERROR_NONE);
384 unsigned int pipe = 0;
385 output = tdm_layer_get_output(layer, &ret);
386 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
387 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_index(layer, &index) == TDM_ERROR_NONE);
388 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_output_get_pipe(output, &pipe) == TDM_ERROR_NONE);
389 TDM_INFO("filling output(%d) layer(%d) info done: src_config(%dx%d: %d,%d %dx%d: %c%c%c%c) dst_pos(%d,%d %dx%d) transform(%s)",
391 info.src_config.size.h, info.src_config.size.v,
392 info.src_config.pos.x, info.src_config.pos.y, info.src_config.pos.w, info.src_config.pos.h,
393 FOURCC_STR(info.src_config.format),
394 info.dst_pos.x, info.dst_pos.y, info.dst_pos.w, info.dst_pos.h,
395 tdm_transform_str(info.transform));
398 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_set_buffer(layer, buffer) == TDM_ERROR_NONE);
403 bool tc_tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue)
405 tdm_info_layer old_info, info;
407 TDM_UT_RETURN_FALSE_IF_FAIL(buffer_queue != NULL);
409 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_get_info(layer, &old_info) == TDM_ERROR_NONE);
410 TDM_UT_RETURN_FALSE_IF_FAIL(tc_tdm_layer_fill_info(layer, NULL, buffer_queue, &info) == true);
412 if (memcmp(&old_info, &info, sizeof info))
413 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_set_info(layer, &info) == TDM_ERROR_NONE);
415 TDM_UT_RETURN_FALSE_IF_FAIL(tdm_layer_set_buffer_queue(layer, buffer_queue) == TDM_ERROR_NONE);
420 bool tc_tdm_layer_is_avaiable(tdm_layer *layer)
423 tdm_output *output = tdm_layer_get_output(layer, &ret);
424 TDM_UT_RETURN_FALSE_IF_FAIL(ret == TDM_ERROR_NONE);
425 TDM_UT_RETURN_FALSE_IF_FAIL(output != NULL);
427 /* only check if connected */
428 return tc_tdm_output_is_connected(output);
431 TEST_P(TDMLayer, LayerGetOutput)
433 TDM_UT_SKIP_FLAG(has_layers);
435 for (int l = 0; l < layer_count; l++) {
437 tdm_output *output = tdm_layer_get_output(layers[l], &ret);
438 EXPECT_EQ(ret, TDM_ERROR_NONE);
439 EXPECT_NE(output, NULL);
443 TEST_P(TDMLayer, LayerGetOutputNullObject)
445 TDM_UT_SKIP_FLAG(has_layers);
448 tdm_output *output = tdm_layer_get_output(NULL, &ret);
449 EXPECT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
450 EXPECT_EQ(output, NULL);
453 TEST_P(TDMLayer, LayerGetOutputNullParam)
455 TDM_UT_SKIP_FLAG(has_layers);
457 for (int l = 0; l < layer_count; l++) {
458 tdm_output *output = tdm_layer_get_output(layers[l], NULL);
459 EXPECT_NE(output, NULL);
463 TEST_P(TDMLayer, LayerGetCapabilities)
465 TDM_UT_SKIP_FLAG(has_layers);
467 for (int l = 0; l < layer_count; l++) {
468 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
469 EXPECT_EQ(tdm_layer_get_capabilities(layers[l], &capabilities), TDM_ERROR_NONE);
470 EXPECT_NE(capabilities, TDM_UT_INVALID_VALUE);
474 TEST_P(TDMLayer, LayerGetCapabilitiesNullObject)
476 TDM_UT_SKIP_FLAG(has_layers);
478 tdm_layer_capability capabilities = (tdm_layer_capability)TDM_UT_INVALID_VALUE;
479 EXPECT_EQ(tdm_layer_get_capabilities(NULL, &capabilities), TDM_ERROR_INVALID_PARAMETER);
480 EXPECT_EQ(capabilities, TDM_UT_INVALID_VALUE);
483 TEST_P(TDMLayer, LayerGetCapabilitiesNullOther)
485 TDM_UT_SKIP_FLAG(has_layers);
486 EXPECT_EQ(tdm_layer_get_capabilities(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
489 TEST_P(TDMLayer, LayerGetAvailableFormats)
491 TDM_UT_SKIP_FLAG(has_layers);
493 for (int l = 0; l < layer_count; l++) {
494 if (!tc_tdm_layer_is_avaiable(layers[l]))
496 const tbm_format *formats = (const tbm_format *)TDM_UT_INVALID_VALUE;
497 int count = TDM_UT_INVALID_VALUE;
498 EXPECT_EQ(tdm_layer_get_available_formats(layers[l], &formats, &count), TDM_ERROR_NONE);
499 EXPECT_NE(formats, NULL);
504 TEST_P(TDMLayer, LayerGetAvailableFormatsNullObject)
506 TDM_UT_SKIP_FLAG(has_layers);
508 const tbm_format *formats = (const tbm_format *)TDM_UT_INVALID_VALUE;
509 int count = TDM_UT_INVALID_VALUE;
510 EXPECT_EQ(tdm_layer_get_available_formats(NULL, &formats, &count), TDM_ERROR_INVALID_PARAMETER);
511 EXPECT_EQ(formats, (const tbm_format *)TDM_UT_INVALID_VALUE);
512 EXPECT_EQ(count, TDM_UT_INVALID_VALUE);
515 TEST_P(TDMLayer, LayerGetAvailableFormatsNullOther)
517 TDM_UT_SKIP_FLAG(has_layers);
518 if (!tc_tdm_layer_is_avaiable(layers[0]))
520 EXPECT_EQ(tdm_layer_get_available_formats(layers[0], NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
523 TEST_P(TDMLayer, LayerGetAvailableProperties)
525 TDM_UT_SKIP_FLAG(has_layers);
527 for (int l = 0; l < layer_count; l++) {
528 if (!tc_tdm_layer_is_avaiable(layers[l]))
530 const tdm_prop *props = (const tdm_prop *)TDM_UT_INVALID_VALUE;
531 int count = TDM_UT_INVALID_VALUE;
532 EXPECT_EQ(tdm_layer_get_available_properties(layers[l], &props, &count), TDM_ERROR_NONE);
535 EXPECT_TRUE(props != NULL && props != (const tdm_prop *)TDM_UT_INVALID_VALUE);
539 TEST_P(TDMLayer, LayerGetAvailablePropertiesNullObject)
541 TDM_UT_SKIP_FLAG(has_layers);
543 const tdm_prop *props = (const tdm_prop *)TDM_UT_INVALID_VALUE;
544 int count = TDM_UT_INVALID_VALUE;
545 EXPECT_EQ(tdm_layer_get_available_properties(NULL, &props, &count), TDM_ERROR_INVALID_PARAMETER);
546 EXPECT_EQ(props, (const tdm_prop *)TDM_UT_INVALID_VALUE);
547 EXPECT_EQ(count, TDM_UT_INVALID_VALUE);
550 TEST_P(TDMLayer, LayerGetAvailablePropertiesNullOther)
552 TDM_UT_SKIP_FLAG(has_layers);
554 EXPECT_EQ(tdm_layer_get_available_properties(layers[0], NULL, NULL), TDM_ERROR_INVALID_PARAMETER);
557 TEST_P(TDMLayer, LayerGetZpos)
559 TDM_UT_SKIP_FLAG(has_layers);
561 bool *check_table = (bool*)calloc(layer_count, output_count);
562 EXPECT_NE(check_table, NULL);
564 for (int l = 0; l < layer_count; l++) {
565 if (!tc_tdm_layer_is_avaiable(layers[l]))
567 unsigned int pipe = tc_tdm_layer_get_output_pipe(layers[l]);
568 int zpos = TDM_UT_INVALID_VALUE;
569 EXPECT_TRUE(tdm_layer_get_zpos(layers[l], &zpos) == TDM_ERROR_NONE);
570 EXPECT_TRUE(zpos != TDM_UT_INVALID_VALUE);
571 if (tc_tdm_layer_is_video_layer(layers[l]))
573 EXPECT_TRUE(zpos >= 0);
574 EXPECT_TRUE(pipe < (unsigned int)output_count);
575 EXPECT_TRUE(*(check_table + pipe * layer_count + zpos) == false);
576 *(check_table + pipe * layer_count + zpos) = true;
582 TEST_P(TDMLayer, LayerGetZposNullObject)
584 TDM_UT_SKIP_FLAG(has_layers);
586 int zpos = TDM_UT_INVALID_VALUE;
587 EXPECT_EQ(tdm_layer_get_zpos(NULL, &zpos), TDM_ERROR_INVALID_PARAMETER);
588 EXPECT_EQ(zpos, TDM_UT_INVALID_VALUE);
591 TEST_P(TDMLayer, LayerGetZposNullParam)
593 TDM_UT_SKIP_FLAG(has_layers);
595 EXPECT_EQ(tdm_layer_get_zpos(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
598 TEST_P(TDMLayer, DISABLED_LayerSetProperty)
602 TEST_P(TDMLayer, LayerSetPropertyNullObject)
604 tdm_value value = {.s32 = 0};
606 EXPECT_EQ(tdm_layer_set_property(NULL, 0, value), TDM_ERROR_INVALID_PARAMETER);
609 TEST_P(TDMLayer, LayerGetProperty)
611 TDM_UT_SKIP_FLAG(has_layers);
613 for (int l = 0; l < layer_count; l++) {
614 if (!tc_tdm_layer_is_avaiable(layers[l]))
617 const tdm_prop *props = (const tdm_prop *)TDM_UT_INVALID_VALUE;
618 int count = TDM_UT_INVALID_VALUE;
619 EXPECT_EQ(tdm_layer_get_available_properties(layers[l], &props, &count), TDM_ERROR_NONE);
622 EXPECT_TRUE(props != NULL && props != (const tdm_prop *)TDM_UT_INVALID_VALUE);
624 for (int i = 0; i < count; i++) {
625 tdm_value value = {.s32 = TDM_UT_INVALID_VALUE};
626 EXPECT_EQ(tdm_layer_get_property(layers[l], props[i].id, &value), TDM_ERROR_NONE);
627 EXPECT_NE(value.s32, TDM_UT_INVALID_VALUE);
633 TEST_P(TDMLayer, LayerGetPropertyNullObject)
635 TDM_UT_SKIP_FLAG(has_layers);
637 tdm_value value = {.s32 = TDM_UT_INVALID_VALUE};
638 EXPECT_EQ(tdm_layer_get_property(NULL, 0, &value), TDM_ERROR_INVALID_PARAMETER);
639 EXPECT_EQ(value.s32, TDM_UT_INVALID_VALUE);
642 TEST_P(TDMLayer, LayerGetPropertyNullOther)
644 TDM_UT_SKIP_FLAG(has_layers);
646 EXPECT_EQ(tdm_layer_get_property(layers[0], 0, NULL), TDM_ERROR_INVALID_PARAMETER);
649 TEST_P(TDMLayer, LayerSetInfo)
651 TDM_UT_SKIP_FLAG(has_layers);
653 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
655 for (int l = 0; l < layer_count; l++) {
656 if (!tc_tdm_layer_is_avaiable(layers[l]))
660 EXPECT_EQ(tc_tdm_layer_fill_info(layers[l], NULL, NULL, &info), true);
661 EXPECT_EQ(tdm_layer_set_info(layers[l], &info), TDM_ERROR_NONE);
665 TEST_P(TDMLayer, LayerSetInfoNullObject)
667 TDM_UT_SKIP_FLAG(has_layers);
670 memset(&info, 0, sizeof info);
671 EXPECT_EQ(tdm_layer_set_info(NULL, &info), TDM_ERROR_INVALID_PARAMETER);
674 TEST_P(TDMLayer, LayerSetInfoNullOther)
676 TDM_UT_SKIP_FLAG(has_layers);
678 EXPECT_EQ(tdm_layer_set_info(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
681 TEST_P(TDMLayer, DISABLED_LayerGetInfo)
685 TEST_P(TDMLayer, LayerGetInfoNullObject)
687 TDM_UT_SKIP_FLAG(has_layers);
691 EXPECT_EQ(tdm_layer_get_info(NULL, &temp), TDM_ERROR_INVALID_PARAMETER);
694 TEST_P(TDMLayer, LayerGetInfoNullParam)
696 TDM_UT_SKIP_FLAG(has_layers);
698 EXPECT_EQ(tdm_layer_get_info(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
701 TEST_P(TDMLayer, LayerGetBufferFlags)
703 TDM_UT_SKIP_FLAG(has_layers);
705 for (int l = 0; l < layer_count; l++) {
706 if (!tc_tdm_layer_is_avaiable(layers[l]))
709 unsigned int flags = (unsigned int)TDM_UT_INVALID_VALUE;
710 EXPECT_EQ(tdm_layer_get_buffer_flags(layers[l], &flags), TDM_ERROR_NONE);
711 EXPECT_NE(flags, (unsigned int)TDM_UT_INVALID_VALUE);
715 TEST_P(TDMLayer, LayerGetBufferFlagsNullObject)
717 TDM_UT_SKIP_FLAG(has_layers);
719 unsigned int flags = (unsigned int)TDM_UT_INVALID_VALUE;
720 EXPECT_EQ(tdm_layer_get_buffer_flags(NULL, &flags), TDM_ERROR_INVALID_PARAMETER);
721 EXPECT_EQ(flags, (unsigned int)TDM_UT_INVALID_VALUE);
724 TEST_P(TDMLayer, LayerGetBufferFlagsNullOther)
726 TDM_UT_SKIP_FLAG(has_layers);
728 EXPECT_EQ(tdm_layer_get_buffer_flags(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
732 _tc_tdm_layer_commit_cb(tdm_layer *layer, unsigned int sequence,
733 unsigned int tv_sec, unsigned int tv_usec,
736 bool *done = (bool*)user_data;
741 TEST_P(TDMLayer, LayerSetBuffer)
743 TDM_UT_SKIP_FLAG(has_layers);
747 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
749 for (int l = 0; l < layer_count; l++) {
750 if (!tc_tdm_layer_is_avaiable(layers[l]))
755 if (tc_tdm_layer_is_cursor_layer(layers[l]))
757 if (tc_tdm_layer_is_video_layer(layers[l]))
760 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
762 /* set buffer & commit for 100 times */
763 for (int t = 0; t < 10; t++) {
764 tbm_surface_h displaying_buffer = NULL;
765 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer]), true);
766 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
767 while (displaying_buffer != buffers[next_buffer]) {
768 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
769 displaying_buffer = tdm_layer_get_displaying_buffer(layers[l], &ret);
770 EXPECT_EQ(ret, TDM_ERROR_NONE);
773 if (next_buffer == 3)
781 TEST_P(TDMLayer, LayerSetBufferFewTimeInOneCommit)
783 TDM_UT_SKIP_FLAG(has_layers);
787 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
789 for (int l = 0; l < layer_count; l++) {
790 if (!tc_tdm_layer_is_avaiable(layers[l]))
795 if (tc_tdm_layer_is_cursor_layer(layers[l]))
797 if (tc_tdm_layer_is_video_layer(layers[l]))
800 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
802 /* set buffer & commit for 10 times */
803 for (int t = 0; t < 10; t++) {
804 tbm_surface_h displaying_buffer = NULL;
805 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
806 if (next_buffer == 3)
808 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer]), true);
809 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
810 while (displaying_buffer != buffers[next_buffer]) {
811 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
812 displaying_buffer = tdm_layer_get_displaying_buffer(layers[l], &ret);
813 EXPECT_EQ(ret, TDM_ERROR_NONE);
816 if (next_buffer == 3)
824 TEST_P(TDMLayer, LayerSetBufferNullObject)
826 TDM_UT_SKIP_FLAG(has_layers);
828 tbm_surface_h buffer = (tbm_surface_h)TDM_UT_INVALID_VALUE;
829 EXPECT_EQ(tdm_layer_set_buffer(NULL, buffer), TDM_ERROR_INVALID_PARAMETER);
832 TEST_P(TDMLayer, LayerSetBufferNullOther)
834 TDM_UT_SKIP_FLAG(has_layers);
836 EXPECT_EQ(tdm_layer_set_buffer(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
839 TEST_P(TDMLayer, LayerUnsetBuffer)
841 TDM_UT_SKIP_FLAG(has_layers);
843 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
845 for (int l = 0; l < layer_count; l++) {
846 if (!tc_tdm_layer_is_avaiable(layers[l]))
849 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
853 TEST_P(TDMLayer, LayerUnsetBufferNullObject)
855 TDM_UT_SKIP_FLAG(has_layers);
857 EXPECT_EQ(tdm_layer_unset_buffer(NULL), TDM_ERROR_INVALID_PARAMETER);
860 TEST_P(TDMLayer, LayerUnsetBufferBeforeCommit)
862 TDM_UT_SKIP_FLAG(has_layers);
864 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
866 for (int l = 0; l < layer_count; l++) {
867 if (!tc_tdm_layer_is_avaiable(layers[l]))
872 if (tc_tdm_layer_is_cursor_layer(layers[l]))
874 if (tc_tdm_layer_is_video_layer(layers[l]))
876 if (tc_tdm_layer_is_primary_layer(layers[l]))
879 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
881 /* set buffer & commit for 10 times */
882 for (int t = 0; t < 10; t++) {
883 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
884 if (next_buffer == 3)
886 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
887 if (next_buffer == 3)
891 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
897 TEST_P(TDMLayer, LayerUnsetBufferAfterOneCommit)
899 TDM_UT_SKIP_FLAG(has_layers);
901 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
903 for (int l = 0; l < layer_count; l++) {
904 if (!tc_tdm_layer_is_avaiable(layers[l]))
909 if (tc_tdm_layer_is_cursor_layer(layers[l]))
911 if (tc_tdm_layer_is_video_layer(layers[l]))
913 if (tc_tdm_layer_is_primary_layer(layers[l]))
916 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
918 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
919 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
920 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
922 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
928 /* drmModePageFlip can't be done twice in a vblank */
929 TEST_P(TDMLayer, DISABLED_LayerUnsetBufferAfterTwoCommit)
931 TDM_UT_SKIP_FLAG(has_layers);
933 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
935 for (int l = 0; l < layer_count; l++) {
936 if (!tc_tdm_layer_is_avaiable(layers[l]))
941 if (tc_tdm_layer_is_cursor_layer(layers[l]))
943 if (tc_tdm_layer_is_video_layer(layers[l]))
945 if (tc_tdm_layer_is_primary_layer(layers[l]))
948 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
950 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
951 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
953 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
954 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
956 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
962 /* drmModePageFlip can't be done twice in a vblank */
963 TEST_P(TDMLayer, DISABLED_LayerUnsetBufferAfterTwoCommitOneSetBuffer)
965 TDM_UT_SKIP_FLAG(has_layers);
967 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
969 for (int l = 0; l < layer_count; l++) {
970 if (!tc_tdm_layer_is_avaiable(layers[l]))
975 if (tc_tdm_layer_is_cursor_layer(layers[l]))
977 if (tc_tdm_layer_is_video_layer(layers[l]))
979 if (tc_tdm_layer_is_primary_layer(layers[l]))
982 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
984 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
985 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
987 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
988 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
990 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer]), true);
992 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
998 TEST_P(TDMLayer, LayerUnsetBufferAfterOneCommitOneDone)
1000 TDM_UT_SKIP_FLAG(has_layers);
1002 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1004 for (int l = 0; l < layer_count; l++) {
1005 if (!tc_tdm_layer_is_avaiable(layers[l]))
1008 int next_buffer = 0;
1011 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1013 if (tc_tdm_layer_is_video_layer(layers[l]))
1015 if (tc_tdm_layer_is_primary_layer(layers[l]))
1018 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
1020 /* set buffer & commit for 10 times */
1021 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
1022 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
1025 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done), TDM_ERROR_NONE);
1027 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1030 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
1036 TEST_P(TDMLayer, LayerUnsetBufferAfterOneCommitOneDoneOneCommit)
1038 TDM_UT_SKIP_FLAG(has_layers);
1040 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1042 for (int l = 0; l < layer_count; l++) {
1043 if (!tc_tdm_layer_is_avaiable(layers[l]))
1046 int next_buffer = 0;
1049 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1051 if (tc_tdm_layer_is_video_layer(layers[l]))
1053 if (tc_tdm_layer_is_primary_layer(layers[l]))
1056 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 3, true), true);
1058 /* set buffer & commit for 10 times */
1059 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
1060 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
1063 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done), TDM_ERROR_NONE);
1065 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1068 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[next_buffer++]), true);
1070 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done), TDM_ERROR_NONE);
1072 EXPECT_EQ(tdm_layer_unset_buffer(layers[l]), TDM_ERROR_NONE);
1078 TEST_P(TDMLayer, LayerCommitDPMSOff)
1080 TDM_UT_SKIP_FLAG(has_layers);
1083 tdm_output *output = tdm_layer_get_output(layers[0], &ret);
1084 EXPECT_EQ(ret, TDM_ERROR_NONE);
1085 EXPECT_NE(output, NULL);
1087 if (!tc_tdm_output_is_connected(output))
1090 EXPECT_TRUE(tc_tdm_output_prepare(dpy, output, true) == true);
1092 EXPECT_TRUE(tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_OFF) == TDM_ERROR_NONE);
1094 EXPECT_TRUE(tdm_layer_commit(layers[0], NULL, NULL) == TDM_ERROR_DPMS_OFF);
1096 EXPECT_TRUE(tc_tdm_output_unset(dpy, output) == true);
1099 TEST_P(TDMLayer, LayerCommitNullObject)
1101 TDM_UT_SKIP_FLAG(has_layers);
1103 EXPECT_EQ(tdm_layer_commit(NULL, _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
1106 TEST_P(TDMLayer, LayerCommitNullOther)
1108 TDM_UT_SKIP_FLAG(has_layers);
1110 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1112 EXPECT_EQ(tdm_layer_commit(layers[0], NULL, NULL), TDM_ERROR_NONE);
1115 TEST_P(TDMLayer, LayerIsCommittingNullObject)
1117 TDM_UT_SKIP_FLAG(has_layers);
1119 unsigned int committing = (unsigned int)TDM_UT_INVALID_VALUE;
1120 EXPECT_EQ(tdm_layer_is_committing(NULL, &committing), TDM_ERROR_INVALID_PARAMETER);
1121 EXPECT_EQ(committing, (unsigned int)TDM_UT_INVALID_VALUE);
1124 TEST_P(TDMLayer, LayerIsCommittingNullOther)
1126 TDM_UT_SKIP_FLAG(has_layers);
1128 EXPECT_EQ(tdm_layer_is_committing(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
1131 TEST_P(TDMLayer, LayerRemoveCommitHandler)
1133 TDM_UT_SKIP_FLAG(has_layers);
1135 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1137 for (int l = 0; l < layer_count; l++) {
1138 if (!tc_tdm_layer_is_avaiable(layers[l]))
1142 tdm_output *output = tdm_layer_get_output(layers[l], &ret);
1143 EXPECT_EQ(ret, TDM_ERROR_NONE);
1144 EXPECT_NE(output, NULL);
1146 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1148 if (tc_tdm_layer_is_video_layer(layers[l]))
1150 if (tc_tdm_layer_is_primary_layer(layers[l]))
1153 EXPECT_EQ(tc_tdm_layer_prepare_buffer(layers[l], buffers, 1, true), true);
1155 EXPECT_EQ(tc_tdm_layer_set_buffer(layers[l], buffers[0]), true);
1157 for (int t = 0; t < 10; t++) {
1158 bool done1 = false, done2 = false, done3 = false;
1159 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done1), TDM_ERROR_NONE);
1160 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done2), TDM_ERROR_NONE);
1161 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done3), TDM_ERROR_NONE);
1162 EXPECT_EQ(tdm_layer_remove_commit_handler(layers[l], _tc_tdm_layer_commit_cb, &done2), TDM_ERROR_NONE);
1163 while (!done1 || done2 || !done3) {
1164 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1172 TEST_P(TDMLayer, LayerRemoveCommitHandlerDifferentData)
1174 TDM_UT_SKIP_FLAG(has_layers);
1176 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1178 for (int l = 0; l < layer_count; l++) {
1179 if (!tc_tdm_layer_is_avaiable(layers[l]))
1183 tdm_output *output = tdm_layer_get_output(layers[l], &ret);
1184 EXPECT_EQ(ret, TDM_ERROR_NONE);
1185 EXPECT_NE(output, NULL);
1187 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1189 if (tc_tdm_layer_is_video_layer(layers[l]))
1191 if (tc_tdm_layer_is_primary_layer(layers[l]))
1194 for (int t = 0; t < 10; t++) {
1195 bool done1 = false, done2 = false, done3 = false;
1196 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done1), TDM_ERROR_NONE);
1197 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done2), TDM_ERROR_NONE);
1198 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb, &done3), TDM_ERROR_NONE);
1199 EXPECT_EQ(tdm_layer_remove_commit_handler(layers[l], _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_NONE);
1200 while (!done1 || !done2 || !done3) {
1201 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1207 _tc_tdm_layer_commit_cb2(tdm_layer *layer, unsigned int sequence,
1208 unsigned int tv_sec, unsigned int tv_usec,
1211 bool *done = (bool*)user_data;
1214 EXPECT_EQ(tdm_layer_remove_commit_handler(layer, _tc_tdm_layer_commit_cb2, user_data), TDM_ERROR_NONE);
1217 TEST_P(TDMLayer, LayerRemoveCommitHandlerInHandler)
1219 TDM_UT_SKIP_FLAG(has_layers);
1221 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1223 for (int l = 0; l < layer_count; l++) {
1224 if (!tc_tdm_layer_is_avaiable(layers[l]))
1228 tdm_output *output = tdm_layer_get_output(layers[l], &ret);
1229 EXPECT_EQ(ret, TDM_ERROR_NONE);
1230 EXPECT_NE(output, NULL);
1232 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1234 if (tc_tdm_layer_is_video_layer(layers[l]))
1236 if (tc_tdm_layer_is_primary_layer(layers[l]))
1239 for (int t = 0; t < 10; t++) {
1240 bool done1 = false, done2 = false, done3 = false;
1241 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb2, &done1), TDM_ERROR_NONE);
1242 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb2, &done2), TDM_ERROR_NONE);
1243 EXPECT_EQ(tdm_layer_commit(layers[l], _tc_tdm_layer_commit_cb2, &done3), TDM_ERROR_NONE);
1244 while (!done1 || !done2 || !done3) {
1245 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1251 TEST_P(TDMLayer, LayerRemoveCommitHandlerNullObject)
1253 TDM_UT_SKIP_FLAG(has_layers);
1255 EXPECT_EQ(tdm_layer_remove_commit_handler(NULL, _tc_tdm_layer_commit_cb, NULL), TDM_ERROR_INVALID_PARAMETER);
1258 TEST_P(TDMLayer, LayerRemoveCommitHandlerNullOther)
1260 TDM_UT_SKIP_FLAG(has_layers);
1262 EXPECT_EQ(tdm_layer_remove_commit_handler(layers[0], NULL, NULL), TDM_ERROR_NONE);
1265 TEST_P(TDMLayer, LayerGetDisplayingBufferNullObject)
1267 TDM_UT_SKIP_FLAG(has_layers);
1269 tbm_surface_h displaying_buffer;
1271 displaying_buffer = tdm_layer_get_displaying_buffer(NULL, &ret);
1272 EXPECT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1273 EXPECT_EQ(displaying_buffer, NULL);
1276 TEST_P(TDMLayer, LayerGetDisplayingBufferNullOther)
1278 TDM_UT_SKIP_FLAG(has_layers);
1280 tbm_surface_h displaying_buffer;
1281 displaying_buffer = tdm_layer_get_displaying_buffer(layers[0], NULL);
1282 EXPECT_EQ(displaying_buffer, NULL);
1285 TEST_P(TDMLayer, LayerIsUsableNullObject)
1287 TDM_UT_SKIP_FLAG(has_layers);
1289 unsigned int usable = (unsigned int)TDM_UT_INVALID_VALUE;
1290 EXPECT_EQ(tdm_layer_is_usable(NULL, &usable), TDM_ERROR_INVALID_PARAMETER);
1291 EXPECT_EQ(usable, (unsigned int)TDM_UT_INVALID_VALUE);
1294 TEST_P(TDMLayer, LayerSetBufferQueue)
1296 TDM_UT_SKIP_FLAG(has_layers);
1300 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1302 for (int l = 0; l < layer_count; l++) {
1303 if (!tc_tdm_layer_is_avaiable(layers[l]))
1306 tbm_surface_h buffer;
1307 tbm_surface_h displaying_buffer;
1309 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1311 if (tc_tdm_layer_is_video_layer(layers[l]))
1313 if (tc_tdm_layer_is_primary_layer(layers[l]))
1316 EXPECT_EQ(tc_tdm_layer_prepare_buffer_queue(layers[l], &buffer_queue), true);
1317 EXPECT_NE(buffer_queue, NULL);
1319 EXPECT_EQ(tc_tdm_layer_set_buffer_queue(layers[l], buffer_queue), true);
1321 EXPECT_EQ(tdm_layer_commit(layers[l], NULL, NULL), TDM_ERROR_NONE);
1323 for (int t = 0; t < 10; t++) {
1324 EXPECT_EQ(tbm_surface_queue_dequeue(buffer_queue, &buffer), TBM_SURFACE_QUEUE_ERROR_NONE);
1325 EXPECT_NE(buffer, NULL);
1326 tdm_test_buffer_fill(buffer, PATTERN_SMPTE);
1327 EXPECT_EQ(tbm_surface_queue_enqueue(buffer_queue, buffer), TBM_SURFACE_QUEUE_ERROR_NONE);
1329 displaying_buffer = NULL;
1330 while (displaying_buffer != buffer) {
1331 EXPECT_EQ(tc_tdm_display_handle_events(dpy), TDM_ERROR_NONE);
1332 displaying_buffer = tdm_layer_get_displaying_buffer(layers[l], &ret);
1333 EXPECT_EQ(ret, TDM_ERROR_NONE);
1337 EXPECT_EQ(tdm_layer_unset_buffer_queue(layers[l]), TDM_ERROR_NONE);
1343 TEST_P(TDMLayer, LayerSetBufferQueueTwice)
1345 TDM_UT_SKIP_FLAG(has_layers);
1347 tc_tdm_output_prepare_all_output(dpy, outputs, output_count, true);
1349 for (int l = 0; l < layer_count; l++) {
1350 tbm_surface_queue_h buffer_queue1 = NULL;
1351 tbm_surface_queue_h buffer_queue2 = NULL;
1353 if (!tc_tdm_layer_is_avaiable(layers[l]))
1355 if (tc_tdm_layer_is_cursor_layer(layers[l]))
1357 if (tc_tdm_layer_is_video_layer(layers[l]))
1360 EXPECT_TRUE(tc_tdm_layer_prepare_buffer_queue(layers[l], &buffer_queue1) == true);
1361 EXPECT_TRUE(buffer_queue1 != NULL);
1362 EXPECT_TRUE(tdm_layer_set_buffer_queue(layers[l], buffer_queue1) == TDM_ERROR_NONE);
1364 EXPECT_TRUE(tc_tdm_layer_prepare_buffer_queue(layers[l], &buffer_queue2) == true);
1365 EXPECT_TRUE(buffer_queue2 != NULL);
1366 EXPECT_TRUE(tdm_layer_set_buffer_queue(layers[l], buffer_queue2) == TDM_ERROR_NONE);
1369 tbm_surface_queue_destroy(buffer_queue1);
1371 tbm_surface_queue_destroy(buffer_queue2);
1375 TEST_P(TDMLayer, LayerSetBufferQueueNullObject)
1377 TDM_UT_SKIP_FLAG(has_layers);
1379 tbm_surface_queue_h buffer_queue = (tbm_surface_queue_h)TDM_UT_INVALID_VALUE;
1381 EXPECT_EQ(tdm_layer_set_buffer_queue(NULL, buffer_queue), TDM_ERROR_INVALID_PARAMETER);
1384 TEST_P(TDMLayer, LayerSetBufferQueueNullOther)
1386 TDM_UT_SKIP_FLAG(has_layers);
1388 EXPECT_EQ(tdm_layer_set_buffer_queue(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
1391 TEST_P(TDMLayer, LayerUnsetBufferQueueNullObject)
1393 TDM_UT_SKIP_FLAG(has_layers);
1395 EXPECT_EQ(tdm_layer_unset_buffer_queue(NULL), TDM_ERROR_INVALID_PARAMETER);
1398 TEST_P(TDMLayer, LayerIsUsableNullOther)
1400 TDM_UT_SKIP_FLAG(has_layers);
1402 EXPECT_EQ(tdm_layer_is_usable(layers[0], NULL), TDM_ERROR_INVALID_PARAMETER);
1405 TEST_P(TDMLayer, LayerSetVideoPos)
1407 TDM_UT_SKIP_FLAG(has_layers);
1409 for (int l = 0; l < layer_count; ++l) {
1410 if (!tc_tdm_layer_is_avaiable(layers[l]))
1413 if (!tc_tdm_layer_is_video_layer(layers[l]))
1415 EXPECT_EQ(tdm_layer_set_video_pos(layers[l], -1), TDM_ERROR_NONE);
1419 TEST_P(TDMLayer, LayerSetVideoPosNullObject)
1421 TDM_UT_SKIP_FLAG(has_layers);
1423 EXPECT_EQ(tdm_layer_set_video_pos(NULL, -1), TDM_ERROR_INVALID_PARAMETER);
1426 TEST_P(TDMLayer, LayerSetVideoPosNoVideoLayer)
1428 TDM_UT_SKIP_FLAG(has_layers);
1430 for (int l = 0; l < layer_count; ++l) {
1431 if (!tc_tdm_layer_is_avaiable(layers[l]))
1434 if (tc_tdm_layer_is_video_layer(layers[l]))
1437 EXPECT_EQ(tdm_layer_set_video_pos(layers[l], -1), TDM_ERROR_BAD_REQUEST);
1441 TEST_P(TDMLayer, LayerCreateCapture)
1443 TDM_UT_SKIP_FLAG(has_layers);
1445 for (int l = 0; l < layer_count; ++l) {
1447 tdm_capture *capture;
1449 if (!tc_tdm_layer_is_avaiable(layers[l]))
1452 capture = tdm_layer_create_capture(layers[l], &ret);
1453 if (ret == TDM_ERROR_NONE)
1454 EXPECT_NE(capture, NULL);
1458 TEST_P(TDMLayer, LayerCreateCaptureNullObject)
1460 TDM_UT_SKIP_FLAG(has_layers);
1463 tdm_capture *capture = tdm_layer_create_capture(NULL, &ret);
1464 EXPECT_EQ(ret, TDM_ERROR_INVALID_PARAMETER);
1465 EXPECT_EQ(capture, NULL);
1468 #ifdef TDM_UT_TEST_WITH_PARAMS
1469 INSTANTIATE_TEST_CASE_P(TDMLayerParams,
1471 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
1473 INSTANTIATE_TEST_CASE_P(TDMLayerParams,
1475 Values(TDM_DEFAULT_MODULE));