utest: fix wrong tests for tdm_hwc_window.c
[platform/core/uifw/libtdm.git] / src / tdm_hwc_window.c
1 /**************************************************************************
2  *
3  * libtdm
4  *
5  * Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
6  *
7  * Contact: Eunchul Kim <chulspro.kim@samsung.com>,
8  *          JinYoung Jeon <jy0.jeon@samsung.com>,
9  *          Taeheon Kim <th908.kim@samsung.com>,
10  *          YoungJun Cho <yj44.cho@samsung.com>,
11  *          SooChan Lim <sc1.lim@samsung.com>,
12  *          Boram Park <sc1.lim@samsung.com>
13  *
14  * Permission is hereby granted, free of charge, to any person obtaining a
15  * copy of this software and associated documentation files (the
16  * "Software"), to deal in the Software without restriction, including
17  * without limitation the rights to use, copy, modify, merge, publish,
18  * distribute, sub license, and/or sell copies of the Software, and to
19  * permit persons to whom the Software is furnished to do so, subject to
20  * the following conditions:
21  *
22  * The above copyright notice and this permission notice (including the
23  * next paragraph) shall be included in all copies or substantial portions
24  * of the Software.
25  *
26  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
27  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
29  * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
30  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
31  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
32  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33  *
34 **************************************************************************/
35
36 #ifdef HAVE_CONFIG_H
37 #include "config.h"
38 #endif
39
40 #include "tdm.h"
41 #include "tdm_backend.h"
42 #include "tdm_private.h"
43 #include "tdm_helper.h"
44
45 #define COUNT_MAX   10
46
47 #define HWC_WINDOW_FUNC_ENTRY() \
48         tdm_private_display *private_display; \
49         tdm_private_output *private_output; \
50         tdm_private_hwc_window *private_hwc_window; \
51         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
52         TDM_RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER); \
53         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
54         private_output = private_hwc_window->private_output; \
55         private_display = private_output->private_display
56
57 #define HWC_WINDOW_FUNC_ENTRY_ERROR() \
58         tdm_private_display *private_display; \
59         tdm_private_output *private_output; \
60         tdm_private_hwc_window *private_hwc_window; \
61         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
62         TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
63         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
64         private_output = private_hwc_window->private_output; \
65         private_display = private_output->private_display
66
67 #define HWC_WINDOW_FUNC_ENTRY_VOID_RETURN() \
68         tdm_private_display *private_display; \
69         tdm_private_output *private_output; \
70         tdm_private_hwc_window *private_hwc_window; \
71         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
72         TDM_RETURN_IF_FAIL(hwc_window != NULL); \
73         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
74         private_output = private_hwc_window->private_output; \
75         private_display = private_output->private_display
76
77 tbm_surface_queue_h
78 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
79 {
80         tdm_func_hwc_window *func_hwc_window = NULL;
81         tbm_surface_queue_h queue = NULL;
82
83         HWC_WINDOW_FUNC_ENTRY_ERROR();
84
85         _pthread_mutex_lock(&private_display->lock);
86
87         func_hwc_window = &private_display->func_hwc_window;
88
89         if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
90                 /* LCOV_EXCL_START */
91                 _pthread_mutex_unlock(&private_display->lock);
92                 TDM_ERR("not implemented!!");
93                 if (error)
94                         *error = TDM_ERROR_NOT_IMPLEMENTED;
95                 return NULL;
96                 /* LCOV_EXCL_STOP */
97         }
98
99         queue = func_hwc_window->hwc_window_get_tbm_buffer_queue(private_hwc_window->hwc_window_backend, error);
100
101         _pthread_mutex_unlock(&private_display->lock);
102
103         return queue;
104 }
105
106 EXTERN tdm_error
107 tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos)
108 {
109         tdm_func_hwc_window *func_hwc_window = NULL;
110
111         HWC_WINDOW_FUNC_ENTRY();
112
113         _pthread_mutex_lock(&private_display->lock);
114
115         func_hwc_window = &private_display->func_hwc_window;
116
117         if (!func_hwc_window->hwc_window_set_zpos) {
118                 /* LCOV_EXCL_START */
119                 _pthread_mutex_unlock(&private_display->lock);
120                 TDM_ERR("not implemented!!");
121                 return TDM_ERROR_NOT_IMPLEMENTED;
122                 /* LCOV_EXCL_STOP */
123         }
124
125         ret = func_hwc_window->hwc_window_set_zpos(private_hwc_window->hwc_window_backend, zpos);
126         if (ret == TDM_ERROR_NONE)
127                 private_hwc_window->zpos = zpos;
128
129         _pthread_mutex_unlock(&private_display->lock);
130
131         return ret;
132 }
133
134 EXTERN tdm_error
135 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
136                                                                         tdm_hwc_window_composition composition_type)
137 {
138         tdm_func_hwc_window *func_hwc_window = NULL;
139
140         HWC_WINDOW_FUNC_ENTRY();
141         TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER);
142         TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_CURSOR, TDM_ERROR_INVALID_PARAMETER);
143         TDM_RETURN_VAL_IF_FAIL(composition_type != TDM_COMPOSITION_DEVICE_CANDIDATE, TDM_ERROR_INVALID_PARAMETER);
144
145         _pthread_mutex_lock(&private_display->lock);
146
147         func_hwc_window = &private_display->func_hwc_window;
148
149         if (!func_hwc_window->hwc_window_set_composition_type) {
150                 /* LCOV_EXCL_START */
151                 _pthread_mutex_unlock(&private_display->lock);
152                 TDM_ERR("not implemented!!");
153                 return TDM_ERROR_NOT_IMPLEMENTED;
154                 /* LCOV_EXCL_STOP */
155         }
156
157         ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
158
159         _pthread_mutex_unlock(&private_display->lock);
160
161         return ret;
162 }
163
164 EXTERN tdm_error
165 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
166 {
167         tdm_func_hwc_window *func_hwc_window = NULL;
168
169         HWC_WINDOW_FUNC_ENTRY();
170
171         _pthread_mutex_lock(&private_display->lock);
172
173         func_hwc_window = &private_display->func_hwc_window;
174
175         if (!func_hwc_window->hwc_window_set_buffer_damage) {
176                 /* LCOV_EXCL_START */
177                 _pthread_mutex_unlock(&private_display->lock);
178                 TDM_ERR("not implemented!!");
179                 return TDM_ERROR_NOT_IMPLEMENTED;
180                 /* LCOV_EXCL_STOP */
181         }
182
183         ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
184
185         _pthread_mutex_unlock(&private_display->lock);
186
187         return ret;
188 }
189
190
191 EXTERN tdm_error
192 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
193 {
194         tdm_func_hwc_window *func_hwc_window = NULL;
195         char fmtstr[128];
196
197         HWC_WINDOW_FUNC_ENTRY();
198
199         TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
200
201         _pthread_mutex_lock(&private_display->lock);
202
203         func_hwc_window = &private_display->func_hwc_window;
204
205         if (!func_hwc_window->hwc_window_set_info) {
206                 /* LCOV_EXCL_START */
207                 _pthread_mutex_unlock(&private_display->lock);
208                 TDM_ERR("not implemented!!");
209                 return TDM_ERROR_NOT_IMPLEMENTED;
210                 /* LCOV_EXCL_STOP */
211         }
212
213         if (info->src_config.format)
214                 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
215         else
216                 snprintf(fmtstr, 128, "NONE");
217
218         TDM_INFO("hwc_window(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)",
219                          private_hwc_window, info->src_config.size.h, info->src_config.size.v,
220                          info->src_config.pos.x, info->src_config.pos.y,
221                          info->src_config.pos.w, info->src_config.pos.h,
222                          fmtstr,
223                          info->dst_pos.x, info->dst_pos.y,
224                          info->dst_pos.w, info->dst_pos.h,
225                          info->transform);
226
227         ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
228
229         _pthread_mutex_unlock(&private_display->lock);
230
231         return ret;
232 }
233
234 /* LCOV_EXCL_START */
235 static void
236 _tdm_window_dump_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
237 {
238         tdm_private_hwc_window *private_window = (tdm_private_hwc_window *)hwc_window;
239         tdm_private_output *private_output = private_window->private_output;
240         unsigned int pipe;
241         uint32_t zpos;
242         char fname[PATH_MAX];
243
244         pipe = private_output->pipe;
245         zpos = private_window->zpos;
246
247         snprintf(fname, sizeof(fname), "tdm_%d_win_%d", pipe, zpos);
248
249         tbm_surface_internal_dump_buffer(buffer, fname);
250         TDM_DBG("%s dump excute", fname);
251
252         return;
253 }
254 /* LCOV_EXCL_STOP */
255
256 EXTERN tdm_error
257 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
258 {
259         tdm_func_hwc_window *func_hwc_window;
260
261         HWC_WINDOW_FUNC_ENTRY();
262
263         _pthread_mutex_lock(&private_display->lock);
264
265         if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
266                 /* LCOV_EXCL_START */
267                 char str[TDM_PATH_LEN];
268                 static int i;
269                 snprintf(str, TDM_PATH_LEN, "window_%d_%d_%03d",
270                                  private_output->index, private_hwc_window->zpos, i++);
271                 tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str);
272                 /* LCOV_EXCL_STOP */
273         }
274
275         func_hwc_window = &private_display->func_hwc_window;
276
277         if (!func_hwc_window->hwc_window_set_buffer) {
278                 /* LCOV_EXCL_START */
279                 _pthread_mutex_unlock(&private_display->lock);
280                 TDM_ERR("not implemented!!");
281                 return TDM_ERROR_NOT_IMPLEMENTED;
282                 /* LCOV_EXCL_STOP */
283         }
284
285         /* dump buffer */
286         /* LCOV_EXCL_START */
287         if (tdm_dump_enable && buffer)
288                 _tdm_window_dump_buffer(hwc_window, buffer);
289         /* LCOV_EXCL_STOP */
290
291         ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
292
293         _pthread_mutex_unlock(&private_display->lock);
294
295         return ret;
296 }
297
298 INTERN tdm_hwc_window *
299 tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
300                                                                    tdm_error *error)
301 {
302         tdm_private_display *private_display = private_output->private_display;
303         tdm_func_output *func_output = &private_display->func_output;
304         tdm_private_hwc_window *private_hwc_window = NULL;
305         tdm_hwc_window *hwc_window_backend = NULL;
306         tdm_error ret = TDM_ERROR_NONE;
307
308         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
309
310         if (!is_video) {
311                 if (!func_output->output_hwc_create_window) {
312                         /* LCOV_EXCL_START */
313                         if (error)
314                                 *error = TDM_ERROR_BAD_MODULE;
315                         return NULL;
316                         /* LCOV_EXCL_STOP */
317                 }
318
319                 hwc_window_backend = func_output->output_hwc_create_window(
320                                                  private_output->output_backend, &ret);
321                 if (ret != TDM_ERROR_NONE) {
322                         if (error)
323                                 *error = ret;
324                         return NULL;
325                 }
326         } else {
327                 if (!func_output->output_hwc_create_video_window) {
328                         /* LCOV_EXCL_START */
329                         if (error)
330                                 *error = TDM_ERROR_BAD_MODULE;
331                         return NULL;
332                         /* LCOV_EXCL_STOP */
333                 }
334
335                 hwc_window_backend = func_output->output_hwc_create_video_window(
336                                                  private_output->output_backend, &ret);
337                 if (ret != TDM_ERROR_NONE) {
338                         if (error)
339                                 *error = ret;
340                         return NULL;
341                 }
342         }
343
344         private_hwc_window = calloc(1, sizeof(tdm_private_capture));
345         if (!private_hwc_window) {
346                 /* LCOV_EXCL_START */
347                 TDM_ERR("failed: alloc memory");
348                 func_output->output_hwc_destroy_window(private_output->output_backend, hwc_window_backend);
349                 if (error)
350                         *error = TDM_ERROR_OUT_OF_MEMORY;
351                 return NULL;
352                 /* LCOV_EXCL_STOP */
353         }
354
355         LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
356
357         private_hwc_window->private_display = private_display;
358         private_hwc_window->private_output = private_output;
359         private_hwc_window->hwc_window_backend = hwc_window_backend;
360
361         TDM_DBG("hwc_window(%p) create", private_hwc_window);
362
363         if (error)
364                 *error = TDM_ERROR_NONE;
365
366         return private_hwc_window;
367 }
368
369 INTERN tdm_error
370 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
371 {
372         tdm_private_display *private_display;
373         tdm_private_output *private_output;
374         tdm_func_output *func_output;
375
376         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
377
378         if (!private_hwc_window)
379                 return TDM_ERROR_OPERATION_FAILED;
380
381         private_display = private_hwc_window->private_display;
382         private_output = private_hwc_window->private_output;
383
384         LIST_DEL(&private_hwc_window->link);
385
386         func_output = &private_display->func_output;
387         func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
388
389         free(private_hwc_window);
390         return TDM_ERROR_NONE;
391 }
392
393 EXTERN tdm_error
394 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
395 {
396         tdm_func_hwc_window *func_hwc_window = NULL;
397
398         HWC_WINDOW_FUNC_ENTRY();
399
400         _pthread_mutex_lock(&private_display->lock);
401
402         func_hwc_window = &private_display->func_hwc_window;
403
404         if (!func_hwc_window->hwc_window_set_flags) {
405                 /* LCOV_EXCL_START */
406                 _pthread_mutex_unlock(&private_display->lock);
407                 TDM_ERR("not implemented!!");
408                 return TDM_ERROR_NOT_IMPLEMENTED;
409                 /* LCOV_EXCL_STOP */
410         }
411
412         ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
413
414         _pthread_mutex_unlock(&private_display->lock);
415
416         return ret;
417 }
418
419 EXTERN tdm_error
420 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
421 {
422         tdm_func_hwc_window *func_hwc_window = NULL;
423
424         HWC_WINDOW_FUNC_ENTRY();
425
426         _pthread_mutex_lock(&private_display->lock);
427
428         func_hwc_window = &private_display->func_hwc_window;
429
430         if (!func_hwc_window->hwc_window_unset_flags) {
431                 /* LCOV_EXCL_START */
432                 _pthread_mutex_unlock(&private_display->lock);
433                 TDM_ERR("not implemented!!");
434                 return TDM_ERROR_NOT_IMPLEMENTED;
435                 /* LCOV_EXCL_STOP */
436         }
437
438         ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
439
440         _pthread_mutex_unlock(&private_display->lock);
441
442         return ret;
443 }
444
445 EXTERN tdm_error
446 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
447                                                                         tdm_hwc_window_video_capability *video_capability)
448 {
449         tdm_func_hwc_window *func_hwc_window = NULL;
450
451         HWC_WINDOW_FUNC_ENTRY();
452
453         TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
454
455         _pthread_mutex_lock(&private_display->lock);
456
457         func_hwc_window = &private_display->func_hwc_window;
458
459         if (!func_hwc_window->hwc_window_video_get_capability) {
460                 /* LCOV_EXCL_START */
461                 _pthread_mutex_unlock(&private_display->lock);
462                 TDM_ERR("not implemented!!");
463                 return TDM_ERROR_NOT_IMPLEMENTED;
464                 /* LCOV_EXCL_STOP */
465         }
466
467         ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
468                                                                                                                    video_capability);
469
470         _pthread_mutex_unlock(&private_display->lock);
471
472         return ret;
473 }
474
475 EXTERN tdm_error
476 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
477                                                                                           const tdm_prop **props, int *count)
478 {
479         tdm_func_hwc_window *func_hwc_window = NULL;
480
481         HWC_WINDOW_FUNC_ENTRY();
482
483         TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
484         TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
485
486         _pthread_mutex_lock(&private_display->lock);
487
488         func_hwc_window = &private_display->func_hwc_window;
489
490         if (!func_hwc_window->hwc_window_video_get_available_properties) {
491                 /* LCOV_EXCL_START */
492                 _pthread_mutex_unlock(&private_display->lock);
493                 TDM_ERR("not implemented!!");
494                 return TDM_ERROR_NOT_IMPLEMENTED;
495                 /* LCOV_EXCL_STOP */
496         }
497
498         ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
499                                                                                                                                          props, count);
500
501         _pthread_mutex_unlock(&private_display->lock);
502
503         return ret;
504 }
505
506 EXTERN tdm_error
507 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
508                                                                         unsigned int id, tdm_value *value)
509 {
510         tdm_func_hwc_window *func_hwc_window = NULL;
511
512         HWC_WINDOW_FUNC_ENTRY();
513
514         TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
515
516         _pthread_mutex_lock(&private_display->lock);
517
518         func_hwc_window = &private_display->func_hwc_window;
519
520         if (!func_hwc_window->hwc_window_video_get_property) {
521                 /* LCOV_EXCL_START */
522                 _pthread_mutex_unlock(&private_display->lock);
523                 TDM_ERR("not implemented!!");
524                 return TDM_ERROR_NOT_IMPLEMENTED;
525                 /* LCOV_EXCL_STOP */
526         }
527
528         ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
529                                                                                                                  id, value);
530
531         _pthread_mutex_unlock(&private_display->lock);
532
533         return ret;
534 }
535
536 EXTERN tdm_error
537 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
538                                                                         unsigned int id, tdm_value value)
539 {
540         tdm_func_hwc_window *func_hwc_window = NULL;
541
542         HWC_WINDOW_FUNC_ENTRY();
543
544         _pthread_mutex_lock(&private_display->lock);
545
546         func_hwc_window = &private_display->func_hwc_window;
547
548         if (!func_hwc_window->hwc_window_video_set_property) {
549                 /* LCOV_EXCL_START */
550                 _pthread_mutex_unlock(&private_display->lock);
551                 TDM_ERR("not implemented!!");
552                 return TDM_ERROR_NOT_IMPLEMENTED;
553                 /* LCOV_EXCL_STOP */
554         }
555
556         ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
557                                                                                                                  id, value);
558
559         _pthread_mutex_unlock(&private_display->lock);
560
561         return ret;
562 }