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