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 TDMOutputHwc : public TDMOutput
45 TDMOutputHwc::TDMOutputHwc()
47 error = TDM_ERROR_NONE;
50 void TDMOutputHwc::SetUp(void)
55 void TDMOutputHwc::TearDown(void)
57 TDMOutput::TearDown();
60 /* tdm_hwc_window * tdm_output_hwc_create_window(tdm_output *output, tdm_error *error); */
61 TEST_P(TDMOutputHwc, CreateWindowFailNull)
63 TDM_UT_SKIP_FLAG(has_outputs);
65 ASSERT_EQ(NULL, tdm_output_hwc_create_window(NULL, &error));
66 ASSERT_NE(TDM_ERROR_NONE, error);
69 TEST_P(TDMOutputHwc, CreateWindowSuccessful)
71 TDM_UT_SKIP_FLAG(has_outputs);
73 tdm_hwc_window * hw = NULL;
75 for (int o = 0; o < output_count; o++) {
76 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
77 hw = tdm_output_hwc_create_window(outputs[o], &error);
78 ASSERT_EQ(TDM_ERROR_NONE, error);
79 error = tdm_output_hwc_destroy_window(outputs[o], hw);
80 ASSERT_EQ(TDM_ERROR_NONE, error);
82 ASSERT_EQ(NULL, tdm_output_hwc_create_window(outputs[o], &error));
83 ASSERT_NE(TDM_ERROR_NONE, error);
88 /* tdm_error tdm_output_hwc_set_client_target_buffer(tdm_output *output,
89 tbm_surface_h target_buffer, tdm_hwc_region damage,
90 tdm_hwc_window *composited_wnds, uint32_t num_wnds); */
91 /* TDOO: need to be fixed
92 TEST_P(TDMOutputHwc, SetClientTargetBufferFailNullOutput)
94 TDM_UT_SKIP_FLAG(has_outputs);
97 tbm_surface_h target_buff = CreateBufferForOutput(0);
98 error = tdm_output_hwc_set_client_target_buffer(NULL, target_buff, reg, NULL, 0 );
99 tbm_surface_internal_destroy(target_buff);
100 ASSERT_NE(TDM_ERROR_NONE, error);
103 TEST_P(TDMOutputHwc, SetClientTargetBufferFailNoHwc)
105 tdm_hwc_region damage = {.num_rects = 0, .rects = NULL};
107 for (int o = 0; o < output_count; o++) {
108 tbm_surface_h target_buff = CreateBufferForOutput(i);
109 ASSERT_NE(NULL, target_buff);
110 error = tdm_output_hwc_set_client_target_buffer(outputs[o], target_buff, damage, NULL, 0);
111 tbm_surface_internal_destroy(target_buff);
112 ASSERT_NE(TDM_ERROR_NONE, error);
116 TEST_P(TDMOutputHwc, SetClientTargetBufferSuccessfulSetBuff)
118 TDM_UT_SKIP_FLAG(has_outputs);
120 tdm_hwc_region damage = {.num_rects = 0, .rects = NULL};
122 for (int o = 0; o < output_count; o++) {
123 tbm_surface_h target_buff = CreateBufferForOutput(i);
124 ASSERT_NE(NULL, target_buff);
125 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
126 error = tdm_output_hwc_set_client_target_buffer(outputs[o], target_buff, damage,
128 tbm_surface_internal_destroy(target_buff);
129 ASSERT_EQ(TDM_ERROR_NONE, error);
131 error = tdm_output_hwc_set_client_target_buffer(outputs[o], target_buff, damage,
133 tbm_surface_internal_destroy(target_buff);
134 ASSERT_NE(TDM_ERROR_NONE, error);
139 TEST_P(TDMOutputHwc, SetClientTargetBufferSuccessfulResetBuff)
141 TDM_UT_SKIP_FLAG(has_outputs);
143 tdm_hwc_region damage = {.num_rects = 0, .rects = NULL};
145 for (int o = 0; o < output_count; o++) {
146 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
147 error = tdm_output_hwc_set_client_target_buffer(outputs[o], NULL, damage,
149 ASSERT_EQ(TDM_ERROR_NONE, error);
151 error = tdm_output_hwc_set_client_target_buffer(outputs[o], NULL, damage,
153 ASSERT_NE(TDM_ERROR_NONE, error);
159 /* tbm_surface_queue_h tdm_output_hwc_get_target_buffer_queue(tdm_output *output, tdm_error *error); */
160 TEST_P(TDMOutputHwc, GetTargetBufferQueueFailNullObject)
162 TDM_UT_SKIP_FLAG(has_outputs);
164 tbm_surface_queue_h queue = NULL;
166 queue = tdm_output_hwc_get_target_buffer_queue(NULL, &error);
167 ASSERT_NE(TDM_ERROR_NONE, error);
168 ASSERT_EQ(NULL, queue);
170 queue = tdm_output_hwc_get_target_buffer_queue(NULL, NULL);
171 ASSERT_EQ(NULL, queue);
174 TEST_P(TDMOutputHwc, GetTargetBufferQueueFainNoHwc)
176 TDM_UT_SKIP_FLAG(has_outputs);
178 tbm_surface_queue_h queue = NULL;
180 for (int o = 0; o < output_count; o++) {
181 queue = tdm_output_hwc_get_target_buffer_queue(outputs[o], &error);
182 ASSERT_NE(TDM_ERROR_NONE, error);
183 ASSERT_EQ(NULL, queue);
187 TEST_P(TDMOutputHwc, GetTargetBufferQueueSuccessful)
189 TDM_UT_SKIP_FLAG(has_outputs);
191 tbm_surface_queue_h queue = NULL;
193 for (int o = 0; o < output_count; o++) {
194 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
195 queue = tdm_output_hwc_get_target_buffer_queue(outputs[o], &error);
196 tbm_surface_queue_destroy(queue);
197 ASSERT_EQ(TDM_ERROR_NONE, error);
198 ASSERT_NE(NULL, queue);
200 queue = tdm_output_hwc_get_target_buffer_queue(outputs[o], NULL);
201 tbm_surface_queue_destroy(queue);
202 ASSERT_EQ(TDM_ERROR_NONE, error);
203 ASSERT_NE(NULL, queue);
205 queue = tdm_output_hwc_get_target_buffer_queue(outputs[o], &error);
206 ASSERT_NE(TDM_ERROR_NONE, error);
207 ASSERT_EQ(NULL, queue);
209 queue = tdm_output_hwc_get_target_buffer_queue(outputs[o], NULL);
210 ASSERT_NE(TDM_ERROR_NONE, error);
211 ASSERT_EQ(NULL, queue);
216 /* tdm_error tdm_output_hwc_validate(tdm_output *output, tdm_hwc_window **composited_wnds, uint32_t num_wnds,
217 uint32_t *num_types); */
218 /* TODO: fix the validate test later.
219 TEST_P(TDMOutputHwc, ValidateFailNull)
221 TDM_UT_SKIP_FLAG(has_outputs);
224 error = tdm_output_hwc_validate(NULL, NULL, 0, &num_types);
225 ASSERT_NE(TDM_ERROR_NONE, error);
228 error = tdm_output_hwc_validate(outputs[0], NULL, 0, NULL);
229 ASSERT_NE(TDM_ERROR_NONE, error);
233 TEST_P(TDMOutputHwc, ValidateFailNoHwc)
235 TDM_UT_SKIP_FLAG(has_outputs);
239 for (int o = 0; o < output_count; o++) {
240 error = tdm_output_hwc_validate(outputs[o], &num_types);
241 ASSERT_NE(TDM_ERROR_NONE, error);
245 TEST_P(TDMOutputHwc, ValidateSuccessful)
247 TDM_UT_SKIP_FLAG(has_outputs);
250 for (int o = 0; o < output_count; o++) {
251 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
252 error = tdm_output_hwc_validate(outputs[o], &num_types);
253 ASSERT_EQ(TDM_ERROR_NONE, error);
255 error = tdm_output_hwc_validate(outputs[o], &num_types);
256 ASSERT_NE(TDM_ERROR_NONE, error);
262 /* tdm_error tdm_output_hwc_get_changed_composition_types(tdm_output *output,
263 uint32_t *num_elements, tdm_hwc_window **hwc_window,
264 tdm_hwc_window_composition *composition_types); */
266 TEST_P(TDMOutputHwc, GetChangedCompositionTypesFailNull)
268 TDM_UT_SKIP_FLAG(has_outputs);
270 uint32_t num_elements;
272 error = tdm_output_hwc_get_changed_composition_types(NULL, &num_elements, NULL, NULL);
273 ASSERT_NE(TDM_ERROR_NONE, error);
276 error = tdm_output_hwc_get_changed_composition_types(outputs[0], NULL, NULL, NULL);
277 ASSERT_NE(TDM_ERROR_NONE, error);
281 TEST_P(TDMOutputHwc, GetChangedCompositionTypesFailNoHwc)
283 TDM_UT_SKIP_FLAG(has_outputs);
285 uint32_t get_num = 10;
287 for (int o = 0; o < output_count; o++) {
288 error = tdm_output_hwc_get_changed_composition_types(outputs[o], &get_num, NULL, NULL);
289 ASSERT_NE(TDM_ERROR_NONE, error);
293 /* TODO: fix the validate test later.
294 TEST_P(TDMHwcWindow, GetChangedCompositionTypesSuccessful)
296 TDM_UT_SKIP_FLAG(has_outputs);
298 uint32_t validate_num;
299 uint32_t get_num = 0;
301 tdm_hwc_window_composition *composition_types;
302 tdm_hwc_window **hwc_wnds;
304 for (int i = 0; i < hwc_count; i++) {
305 error = tdm_hwc_window_set_composition_type(hwc_wins[o], TDM_COMPOSITION_DEVICE);
306 ASSERT_EQ(TDM_ERROR_NONE, error);
310 for (int i = 0; i < output_count; i++) {
311 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
312 error = tdm_output_hwc_validate(outputs[o], &validate_num);
313 ASSERT_EQ(TDM_ERROR_NONE, error);
315 error = tdm_output_hwc_get_changed_composition_types(outputs[o], &get_num, NULL, NULL);
316 ASSERT_EQ(TDM_ERROR_NONE, error);
318 ASSERT_EQ(get_num, validate_num);
319 hwc_wnds = (tdm_hwc_window **)calloc(get_num, sizeof(tdm_hwc_window *));
320 composition_types = (tdm_hwc_window_composition *)calloc(get_num, sizeof(tdm_hwc_window_composition));
322 error = tdm_output_hwc_get_changed_composition_types(outputs[o], &get_num, hwc_wnds, composition_types);
325 free(composition_types);
327 ASSERT_EQ(TDM_ERROR_NONE, error);
329 error = tdm_output_hwc_get_changed_composition_types(outputs[o], &get_num, NULL, NULL);
330 ASSERT_NE(TDM_ERROR_NONE, error);
336 /* tdm_error tdm_output_hwc_accept_changes(tdm_output *output); */
338 TEST_P(TDMOutputHwc, AcceptChangesFailNull)
340 TDM_UT_SKIP_FLAG(has_outputs);
342 error = tdm_output_hwc_accept_changes(NULL);
343 ASSERT_NE(TDM_ERROR_NONE, error);
346 TEST_P(TDMOutputHwc, AcceptChangesFailNoHwc)
348 for (int o = 0; o < output_count; o++) {
349 error = tdm_output_hwc_accept_changes(outputs[o]);
350 ASSERT_NE(TDM_ERROR_NONE, error);
354 /* TODO: fix the validate test later.
355 TEST_P(TDMHwcWindow, AcceptChangesSuccessful)
357 TDM_UT_SKIP_FLAG(has_outputs);
359 uint32_t validate_num;
361 for (int i = 0; i < hwc_count; i++) {
362 error = tdm_hwc_window_set_composition_type(hwc_wins[o], TDM_COMPOSITION_DEVICE);
363 ASSERT_EQ(TDM_ERROR_NONE, error);
366 for (int i = 0; i < output_count; i++) {
367 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
368 error = tdm_output_hwc_validate(outputs[o], &validate_num);
369 ASSERT_EQ(TDM_ERROR_NONE, error);
371 if (validate_num > 0) {
372 error = tdm_output_hwc_accept_changes(outputs[o]);
373 ASSERT_EQ(TDM_ERROR_NONE, error);
380 /* tdm_hwc_window * tdm_output_hwc_create_video_window(tdm_output *output, tdm_error *error); */
381 TEST_P(TDMOutputHwc, CreateVideoWindowFailNull)
383 TDM_UT_SKIP_FLAG(has_outputs);
385 ASSERT_EQ(NULL, tdm_output_hwc_create_video_window(NULL, &error));
386 ASSERT_NE(TDM_ERROR_NONE, error);
389 TEST_P(TDMOutputHwc, CreateVideoWindowSuccessful)
391 TDM_UT_SKIP_FLAG(has_outputs);
393 tdm_hwc_window *hw = NULL;
395 for (int o = 0; o < output_count; o++) {
396 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
397 hw = tdm_output_hwc_create_video_window(outputs[o], &error);
398 if (error != TDM_ERROR_NOT_IMPLEMENTED) {
399 ASSERT_EQ(TDM_ERROR_NONE, error);
401 error = tdm_output_hwc_destroy_window(outputs[o], hw);
402 ASSERT_EQ(TDM_ERROR_NONE, error);
405 ASSERT_EQ(NULL, tdm_output_hwc_create_video_window(outputs[o], &error));
406 ASSERT_NE(TDM_ERROR_NONE, error);
411 /* tdm_output_hwc_get_video_supported_formats() */
412 TEST_P(TDMOutputHwc, GetVideoSupportedFormatsFailNull)
414 TDM_UT_SKIP_FLAG(has_outputs);
418 error = tdm_output_hwc_get_video_supported_formats(NULL, NULL, NULL);
419 ASSERT_NE(TDM_ERROR_NONE, error);
422 TEST_P(TDMOutputHwc, GetVideoSupportedFormatsSuccessful)
424 TDM_UT_SKIP_FLAG(has_outputs);
427 const tbm_format *formats;
430 for (int o = 0; o < output_count; o++) {
431 if (ut_tdm_output_is_hwc_enable(outputs[o])) {
432 error = tdm_output_hwc_get_video_supported_formats(outputs[o], &formats, &count);
433 if (error != TDM_ERROR_NOT_IMPLEMENTED) {
434 ASSERT_EQ(TDM_ERROR_NONE, error);
436 ASSERT_NE(NULL, formats);
439 error = tdm_output_hwc_get_video_supported_formats(outputs[o], &formats, &count);
440 ASSERT_NE(TDM_ERROR_NONE, error);
445 #ifdef TDM_UT_TEST_WITH_PARAMS
446 INSTANTIATE_TEST_CASE_P(TDMOutputHwcParams,
448 Combine(Bool(), Bool(), Values(TDM_DEFAULT_MODULE)));
450 INSTANTIATE_TEST_CASE_P(TDMOutputHwcParams,
452 Values(TDM_DEFAULT_MODULE));