correct the header file dependency
[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_private.h"
41
42 #define COUNT_MAX   10
43
44 #define HWC_WINDOW_FUNC_ENTRY() \
45         tdm_private_display *private_display; \
46         tdm_private_output *private_output; \
47         tdm_private_hwc_window *private_hwc_window; \
48         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
49         TDM_RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER); \
50         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
51         private_output = private_hwc_window->private_output; \
52         private_display = private_output->private_display
53
54 #define HWC_WINDOW_FUNC_ENTRY_ERROR() \
55         tdm_private_display *private_display; \
56         tdm_private_output *private_output; \
57         tdm_private_hwc_window *private_hwc_window; \
58         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
59         TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
60         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
61         private_output = private_hwc_window->private_output; \
62         private_display = private_output->private_display
63
64 #define HWC_WINDOW_FUNC_ENTRY_VOID_RETURN() \
65         tdm_private_display *private_display; \
66         tdm_private_output *private_output; \
67         tdm_private_hwc_window *private_hwc_window; \
68         tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
69         TDM_RETURN_IF_FAIL(hwc_window != NULL); \
70         private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
71         private_output = private_hwc_window->private_output; \
72         private_display = private_output->private_display
73
74 tbm_surface_queue_h
75 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
76 {
77         tdm_func_hwc_window *func_hwc_window = NULL;
78         tbm_surface_queue_h queue = NULL;
79
80         HWC_WINDOW_FUNC_ENTRY_ERROR();
81
82         _pthread_mutex_lock(&private_display->lock);
83
84         func_hwc_window = &private_display->func_hwc_window;
85
86         if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
87                 /* LCOV_EXCL_START */
88                 _pthread_mutex_unlock(&private_display->lock);
89                 TDM_ERR("not implemented!!");
90                 if (error)
91                         *error = TDM_ERROR_NOT_IMPLEMENTED;
92                 return NULL;
93                 /* LCOV_EXCL_STOP */
94         }
95
96         queue = func_hwc_window->hwc_window_get_tbm_buffer_queue(private_hwc_window->hwc_window_backend, error);
97
98         _pthread_mutex_unlock(&private_display->lock);
99
100         return queue;
101 }
102
103 EXTERN tdm_error
104 tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, int32_t zpos)
105 {
106         tdm_func_hwc_window *func_hwc_window = NULL;
107
108         HWC_WINDOW_FUNC_ENTRY();
109
110         _pthread_mutex_lock(&private_display->lock);
111
112         func_hwc_window = &private_display->func_hwc_window;
113
114         if (!func_hwc_window->hwc_window_set_zpos) {
115                 /* LCOV_EXCL_START */
116                 _pthread_mutex_unlock(&private_display->lock);
117                 TDM_ERR("not implemented!!");
118                 return TDM_ERROR_NOT_IMPLEMENTED;
119                 /* LCOV_EXCL_STOP */
120         }
121
122         ret = func_hwc_window->hwc_window_set_zpos(private_hwc_window->hwc_window_backend, zpos);
123         if (ret == TDM_ERROR_NONE)
124                 private_hwc_window->zpos = zpos;
125
126         _pthread_mutex_unlock(&private_display->lock);
127
128         return ret;
129 }
130
131 EXTERN tdm_error
132 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
133                                                                         tdm_hwc_window_composition composition_type)
134 {
135         tdm_func_hwc_window *func_hwc_window = NULL;
136
137         HWC_WINDOW_FUNC_ENTRY();
138         TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER);
139         TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
140
141         _pthread_mutex_lock(&private_display->lock);
142
143         func_hwc_window = &private_display->func_hwc_window;
144
145         if (!func_hwc_window->hwc_window_set_composition_type) {
146                 /* LCOV_EXCL_START */
147                 _pthread_mutex_unlock(&private_display->lock);
148                 TDM_ERR("not implemented!!");
149                 return TDM_ERROR_NOT_IMPLEMENTED;
150                 /* LCOV_EXCL_STOP */
151         }
152
153         ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
154
155         _pthread_mutex_unlock(&private_display->lock);
156
157         return ret;
158 }
159
160 EXTERN tdm_error
161 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
162 {
163         tdm_func_hwc_window *func_hwc_window = NULL;
164
165         HWC_WINDOW_FUNC_ENTRY();
166         if (damage.num_rects > 0)
167                 TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, TDM_ERROR_INVALID_PARAMETER);
168
169         _pthread_mutex_lock(&private_display->lock);
170
171         func_hwc_window = &private_display->func_hwc_window;
172
173         if (!func_hwc_window->hwc_window_set_buffer_damage) {
174                 /* LCOV_EXCL_START */
175                 _pthread_mutex_unlock(&private_display->lock);
176                 TDM_ERR("not implemented!!");
177                 return TDM_ERROR_NOT_IMPLEMENTED;
178                 /* LCOV_EXCL_STOP */
179         }
180
181         ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
182
183         _pthread_mutex_unlock(&private_display->lock);
184
185         return ret;
186 }
187
188
189 EXTERN tdm_error
190 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
191 {
192         tdm_func_hwc_window *func_hwc_window = NULL;
193         char fmtstr[128];
194
195         HWC_WINDOW_FUNC_ENTRY();
196
197         TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
198
199         _pthread_mutex_lock(&private_display->lock);
200
201         func_hwc_window = &private_display->func_hwc_window;
202
203         if (!func_hwc_window->hwc_window_set_info) {
204                 /* LCOV_EXCL_START */
205                 _pthread_mutex_unlock(&private_display->lock);
206                 TDM_ERR("not implemented!!");
207                 return TDM_ERROR_NOT_IMPLEMENTED;
208                 /* LCOV_EXCL_STOP */
209         }
210
211         if (info->src_config.format)
212                 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
213         else
214                 snprintf(fmtstr, 128, "NONE");
215
216         TDM_INFO("hwc_window(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)",
217                          private_hwc_window, info->src_config.size.h, info->src_config.size.v,
218                          info->src_config.pos.x, info->src_config.pos.y,
219                          info->src_config.pos.w, info->src_config.pos.h,
220                          fmtstr,
221                          info->dst_pos.x, info->dst_pos.y,
222                          info->dst_pos.w, info->dst_pos.h,
223                          info->transform);
224
225         ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
226
227         _pthread_mutex_unlock(&private_display->lock);
228
229         return ret;
230 }
231
232 /* LCOV_EXCL_START */
233 static void
234 _tdm_window_dump_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
235 {
236         tdm_private_hwc_window *private_window = (tdm_private_hwc_window *)hwc_window;
237         tdm_private_output *private_output = private_window->private_output;
238         unsigned int pipe;
239         uint32_t zpos;
240         char fname[TDM_PATH_LEN];
241
242         pipe = private_output->pipe;
243         zpos = private_window->zpos;
244
245         snprintf(fname, sizeof(fname), "tdm_%d_win_%d", pipe, zpos);
246
247         tbm_surface_internal_dump_buffer(buffer, fname);
248         TDM_DBG("%s dump excute", fname);
249
250         return;
251 }
252 /* LCOV_EXCL_STOP */
253
254 EXTERN tdm_error
255 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
256 {
257         tdm_func_hwc_window *func_hwc_window;
258
259         HWC_WINDOW_FUNC_ENTRY();
260
261         _pthread_mutex_lock(&private_display->lock);
262
263         if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
264                 /* LCOV_EXCL_START */
265                 char str[TDM_PATH_LEN];
266                 static int i;
267                 snprintf(str, TDM_PATH_LEN, "window_%d_%d_%03d",
268                                  private_output->index, private_hwc_window->zpos, i++);
269                 tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str);
270                 /* LCOV_EXCL_STOP */
271         }
272
273         func_hwc_window = &private_display->func_hwc_window;
274
275         if (!func_hwc_window->hwc_window_set_buffer) {
276                 /* LCOV_EXCL_START */
277                 _pthread_mutex_unlock(&private_display->lock);
278                 TDM_ERR("not implemented!!");
279                 return TDM_ERROR_NOT_IMPLEMENTED;
280                 /* LCOV_EXCL_STOP */
281         }
282
283         /* dump buffer */
284         /* LCOV_EXCL_START */
285         if (tdm_dump_enable && buffer)
286                 _tdm_window_dump_buffer(hwc_window, buffer);
287         /* LCOV_EXCL_STOP */
288
289         ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
290
291         _pthread_mutex_unlock(&private_display->lock);
292
293         return ret;
294 }
295
296 INTERN tdm_hwc_window *
297 tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
298                                                                    tdm_error *error)
299 {
300         tdm_private_display *private_display = private_output->private_display;
301         tdm_func_output *func_output = &private_display->func_output;
302         tdm_private_hwc_window *private_hwc_window = NULL;
303         tdm_hwc_window *hwc_window_backend = NULL;
304         tdm_error ret = TDM_ERROR_NONE;
305
306         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
307
308         if (!is_video) {
309                 if (!func_output->output_hwc_create_window) {
310                         /* LCOV_EXCL_START */
311                         if (error)
312                                 *error = TDM_ERROR_BAD_MODULE;
313                         return NULL;
314                         /* LCOV_EXCL_STOP */
315                 }
316
317                 hwc_window_backend = func_output->output_hwc_create_window(
318                                                  private_output->output_backend, &ret);
319                 if (ret != TDM_ERROR_NONE) {
320                         if (error)
321                                 *error = ret;
322                         return NULL;
323                 }
324         } else {
325                 if (!func_output->output_hwc_create_video_window) {
326                         /* LCOV_EXCL_START */
327                         if (error)
328                                 *error = TDM_ERROR_NOT_IMPLEMENTED;
329                         return NULL;
330                         /* LCOV_EXCL_STOP */
331                 }
332
333                 hwc_window_backend = func_output->output_hwc_create_video_window(
334                                                  private_output->output_backend, &ret);
335                 if (ret != TDM_ERROR_NONE) {
336                         if (error)
337                                 *error = ret;
338                         return NULL;
339                 }
340         }
341
342         private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window));
343         if (!private_hwc_window) {
344                 /* LCOV_EXCL_START */
345                 TDM_ERR("failed: alloc memory");
346                 func_output->output_hwc_destroy_window(private_output->output_backend, hwc_window_backend);
347                 if (error)
348                         *error = TDM_ERROR_OUT_OF_MEMORY;
349                 return NULL;
350                 /* LCOV_EXCL_STOP */
351         }
352
353         LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
354
355         private_hwc_window->private_display = private_display;
356         private_hwc_window->private_output = private_output;
357         private_hwc_window->hwc_window_backend = hwc_window_backend;
358
359         TDM_DBG("hwc_window(%p) create", private_hwc_window);
360
361         if (error)
362                 *error = TDM_ERROR_NONE;
363
364         return private_hwc_window;
365 }
366
367 INTERN tdm_error
368 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
369 {
370         tdm_private_display *private_display;
371         tdm_private_output *private_output;
372         tdm_func_output *func_output;
373
374         TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
375
376         if (!private_hwc_window)
377                 return TDM_ERROR_OPERATION_FAILED;
378
379         private_display = private_hwc_window->private_display;
380         private_output = private_hwc_window->private_output;
381
382         LIST_DEL(&private_hwc_window->link);
383
384         func_output = &private_display->func_output;
385         func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
386
387         free(private_hwc_window);
388         return TDM_ERROR_NONE;
389 }
390
391 EXTERN tdm_error
392 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
393 {
394         tdm_func_hwc_window *func_hwc_window = NULL;
395
396         HWC_WINDOW_FUNC_ENTRY();
397
398         _pthread_mutex_lock(&private_display->lock);
399
400         func_hwc_window = &private_display->func_hwc_window;
401
402         if (!func_hwc_window->hwc_window_set_flags) {
403                 /* LCOV_EXCL_START */
404                 _pthread_mutex_unlock(&private_display->lock);
405                 TDM_ERR("not implemented!!");
406                 return TDM_ERROR_NOT_IMPLEMENTED;
407                 /* LCOV_EXCL_STOP */
408         }
409
410         ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
411
412         _pthread_mutex_unlock(&private_display->lock);
413
414         return ret;
415 }
416
417 EXTERN tdm_error
418 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
419 {
420         tdm_func_hwc_window *func_hwc_window = NULL;
421
422         HWC_WINDOW_FUNC_ENTRY();
423
424         _pthread_mutex_lock(&private_display->lock);
425
426         func_hwc_window = &private_display->func_hwc_window;
427
428         if (!func_hwc_window->hwc_window_unset_flags) {
429                 /* LCOV_EXCL_START */
430                 _pthread_mutex_unlock(&private_display->lock);
431                 TDM_ERR("not implemented!!");
432                 return TDM_ERROR_NOT_IMPLEMENTED;
433                 /* LCOV_EXCL_STOP */
434         }
435
436         ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
437
438         _pthread_mutex_unlock(&private_display->lock);
439
440         return ret;
441 }
442
443 EXTERN tdm_error
444 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
445                                                                         tdm_hwc_window_video_capability *video_capability)
446 {
447         tdm_func_hwc_window *func_hwc_window = NULL;
448
449         HWC_WINDOW_FUNC_ENTRY();
450
451         TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
452
453         _pthread_mutex_lock(&private_display->lock);
454
455         func_hwc_window = &private_display->func_hwc_window;
456
457         if (!func_hwc_window->hwc_window_video_get_capability) {
458                 /* LCOV_EXCL_START */
459                 _pthread_mutex_unlock(&private_display->lock);
460                 TDM_ERR("not implemented!!");
461                 return TDM_ERROR_NOT_IMPLEMENTED;
462                 /* LCOV_EXCL_STOP */
463         }
464
465         ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
466                                                                                                                    video_capability);
467
468         _pthread_mutex_unlock(&private_display->lock);
469
470         return ret;
471 }
472
473 EXTERN tdm_error
474 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
475                                                                                           const tdm_prop **props, int *count)
476 {
477         tdm_func_hwc_window *func_hwc_window = NULL;
478
479         HWC_WINDOW_FUNC_ENTRY();
480
481         TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
482         TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
483
484         _pthread_mutex_lock(&private_display->lock);
485
486         func_hwc_window = &private_display->func_hwc_window;
487
488         if (!func_hwc_window->hwc_window_video_get_available_properties) {
489                 /* LCOV_EXCL_START */
490                 _pthread_mutex_unlock(&private_display->lock);
491                 TDM_ERR("not implemented!!");
492                 return TDM_ERROR_NOT_IMPLEMENTED;
493                 /* LCOV_EXCL_STOP */
494         }
495
496         ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
497                                                                                                                                          props, count);
498
499         _pthread_mutex_unlock(&private_display->lock);
500
501         return ret;
502 }
503
504 EXTERN tdm_error
505 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
506                                                                         unsigned int id, tdm_value *value)
507 {
508         tdm_func_hwc_window *func_hwc_window = NULL;
509
510         HWC_WINDOW_FUNC_ENTRY();
511
512         TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
513
514         _pthread_mutex_lock(&private_display->lock);
515
516         func_hwc_window = &private_display->func_hwc_window;
517
518         if (!func_hwc_window->hwc_window_video_get_property) {
519                 /* LCOV_EXCL_START */
520                 _pthread_mutex_unlock(&private_display->lock);
521                 TDM_ERR("not implemented!!");
522                 return TDM_ERROR_NOT_IMPLEMENTED;
523                 /* LCOV_EXCL_STOP */
524         }
525
526         ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
527                                                                                                                  id, value);
528
529         _pthread_mutex_unlock(&private_display->lock);
530
531         return ret;
532 }
533
534 EXTERN tdm_error
535 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
536                                                                         unsigned int id, tdm_value value)
537 {
538         tdm_func_hwc_window *func_hwc_window = NULL;
539
540         HWC_WINDOW_FUNC_ENTRY();
541
542         _pthread_mutex_lock(&private_display->lock);
543
544         func_hwc_window = &private_display->func_hwc_window;
545
546         if (!func_hwc_window->hwc_window_video_set_property) {
547                 /* LCOV_EXCL_START */
548                 _pthread_mutex_unlock(&private_display->lock);
549                 TDM_ERR("not implemented!!");
550                 return TDM_ERROR_NOT_IMPLEMENTED;
551                 /* LCOV_EXCL_STOP */
552         }
553
554         ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
555                                                                                                                  id, value);
556
557         _pthread_mutex_unlock(&private_display->lock);
558
559         return ret;
560 }