1 /**************************************************************************
5 * Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
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>
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:
22 * The above copyright notice and this permission notice (including the
23 * next paragraph) shall be included in all copies or substantial portions
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.
34 **************************************************************************/
41 #include "tdm_backend.h"
42 #include "tdm_private.h"
43 #include "tdm_helper.h"
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
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
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
78 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
80 tdm_func_hwc_window *func_hwc_window = NULL;
81 tbm_surface_queue_h queue = NULL;
83 HWC_WINDOW_FUNC_ENTRY_ERROR();
85 _pthread_mutex_lock(&private_display->lock);
87 func_hwc_window = &private_display->func_hwc_window;
89 if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
91 _pthread_mutex_unlock(&private_display->lock);
92 TDM_ERR("not implemented!!");
94 *error = TDM_ERROR_NOT_IMPLEMENTED;
99 queue = func_hwc_window->hwc_window_get_tbm_buffer_queue(private_hwc_window->hwc_window_backend, error);
101 _pthread_mutex_unlock(&private_display->lock);
107 tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, uint32_t zpos)
109 tdm_func_hwc_window *func_hwc_window = NULL;
111 HWC_WINDOW_FUNC_ENTRY();
113 _pthread_mutex_lock(&private_display->lock);
115 func_hwc_window = &private_display->func_hwc_window;
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;
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;
129 _pthread_mutex_unlock(&private_display->lock);
135 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
136 tdm_hwc_window_composition composition_type)
138 tdm_func_hwc_window *func_hwc_window = NULL;
140 HWC_WINDOW_FUNC_ENTRY();
142 _pthread_mutex_lock(&private_display->lock);
144 func_hwc_window = &private_display->func_hwc_window;
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;
154 ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
156 _pthread_mutex_unlock(&private_display->lock);
162 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
164 tdm_func_hwc_window *func_hwc_window = NULL;
166 HWC_WINDOW_FUNC_ENTRY();
168 _pthread_mutex_lock(&private_display->lock);
170 func_hwc_window = &private_display->func_hwc_window;
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;
180 ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
182 _pthread_mutex_unlock(&private_display->lock);
189 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
191 tdm_func_hwc_window *func_hwc_window = NULL;
194 HWC_WINDOW_FUNC_ENTRY();
196 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
198 _pthread_mutex_lock(&private_display->lock);
200 func_hwc_window = &private_display->func_hwc_window;
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;
210 if (info->src_config.format)
211 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
213 snprintf(fmtstr, 128, "NONE");
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,
220 info->dst_pos.x, info->dst_pos.y,
221 info->dst_pos.w, info->dst_pos.h,
224 ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
226 _pthread_mutex_unlock(&private_display->lock);
231 /* LCOV_EXCL_START */
233 _tdm_window_dump_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
235 tdm_private_hwc_window *private_window = (tdm_private_hwc_window *)hwc_window;
236 tdm_private_output *private_output = private_window->private_output;
239 char fname[PATH_MAX];
241 pipe = private_output->pipe;
242 zpos = private_window->zpos;
244 snprintf(fname, sizeof(fname), "tdm_%d_win_%d", pipe, zpos);
246 tbm_surface_internal_dump_buffer(buffer, fname);
247 TDM_DBG("%s dump excute", fname);
254 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
256 tdm_func_hwc_window *func_hwc_window;
258 HWC_WINDOW_FUNC_ENTRY();
260 _pthread_mutex_lock(&private_display->lock);
262 if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
263 /* LCOV_EXCL_START */
264 char str[TDM_PATH_LEN];
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);
272 func_hwc_window = &private_display->func_hwc_window;
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;
283 /* LCOV_EXCL_START */
284 if (tdm_dump_enable && buffer)
285 _tdm_window_dump_buffer(hwc_window, buffer);
288 ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
290 _pthread_mutex_unlock(&private_display->lock);
295 INTERN tdm_hwc_window *
296 tdm_hwc_window_create_internal(tdm_private_output *private_output,
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;
305 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
307 if (!func_output->output_hwc_create_window) {
308 /* LCOV_EXCL_START */
310 *error = TDM_ERROR_BAD_MODULE;
315 hwc_window_backend = func_output->output_hwc_create_window(
316 private_output->output_backend, &ret);
317 if (ret != TDM_ERROR_NONE) {
323 private_hwc_window = calloc(1, sizeof(tdm_private_capture));
324 if (!private_hwc_window) {
325 /* LCOV_EXCL_START */
326 TDM_ERR("failed: alloc memory");
327 func_output->output_hwc_destroy_window(private_output->output_backend, hwc_window_backend);
329 *error = TDM_ERROR_OUT_OF_MEMORY;
334 LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
336 private_hwc_window->private_display = private_display;
337 private_hwc_window->private_output = private_output;
338 private_hwc_window->hwc_window_backend = hwc_window_backend;
340 TDM_DBG("hwc_window(%p) create", private_hwc_window);
343 *error = TDM_ERROR_NONE;
345 return private_hwc_window;
349 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
351 tdm_private_display *private_display;
352 tdm_private_output *private_output;
353 tdm_func_output *func_output;
355 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
357 if (!private_hwc_window)
358 return TDM_ERROR_OPERATION_FAILED;
360 private_display = private_hwc_window->private_display;
361 private_output = private_hwc_window->private_output;
363 LIST_DEL(&private_hwc_window->link);
365 func_output = &private_display->func_output;
366 func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
368 free(private_hwc_window);
369 return TDM_ERROR_NONE;
373 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
375 tdm_func_hwc_window *func_hwc_window = NULL;
377 HWC_WINDOW_FUNC_ENTRY();
379 _pthread_mutex_lock(&private_display->lock);
381 func_hwc_window = &private_display->func_hwc_window;
383 if (!func_hwc_window->hwc_window_set_flags) {
384 /* LCOV_EXCL_START */
385 _pthread_mutex_unlock(&private_display->lock);
386 TDM_ERR("not implemented!!");
387 return TDM_ERROR_NOT_IMPLEMENTED;
391 ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
393 _pthread_mutex_unlock(&private_display->lock);
399 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
401 tdm_func_hwc_window *func_hwc_window = NULL;
403 HWC_WINDOW_FUNC_ENTRY();
405 _pthread_mutex_lock(&private_display->lock);
407 func_hwc_window = &private_display->func_hwc_window;
409 if (!func_hwc_window->hwc_window_unset_flags) {
410 /* LCOV_EXCL_START */
411 _pthread_mutex_unlock(&private_display->lock);
412 TDM_ERR("not implemented!!");
413 return TDM_ERROR_NOT_IMPLEMENTED;
417 ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
419 _pthread_mutex_unlock(&private_display->lock);
425 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
426 tdm_hwc_window_video_capability *video_capability)
428 tdm_func_hwc_window *func_hwc_window = NULL;
430 HWC_WINDOW_FUNC_ENTRY();
432 TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
434 _pthread_mutex_lock(&private_display->lock);
436 func_hwc_window = &private_display->func_hwc_window;
438 if (!func_hwc_window->hwc_window_video_get_capability) {
439 /* LCOV_EXCL_START */
440 _pthread_mutex_unlock(&private_display->lock);
441 TDM_ERR("not implemented!!");
442 return TDM_ERROR_NOT_IMPLEMENTED;
446 ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
449 _pthread_mutex_unlock(&private_display->lock);
455 tdm_hwc_window_video_get_supported_format(tdm_hwc_window *hwc_window,
456 const tbm_format **formats,
459 tdm_func_hwc_window *func_hwc_window = NULL;
461 HWC_WINDOW_FUNC_ENTRY();
463 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
464 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
466 _pthread_mutex_lock(&private_display->lock);
468 func_hwc_window = &private_display->func_hwc_window;
470 if (!func_hwc_window->hwc_window_video_get_supported_format) {
471 /* LCOV_EXCL_START */
472 _pthread_mutex_unlock(&private_display->lock);
473 TDM_ERR("not implemented!!");
474 return TDM_ERROR_NOT_IMPLEMENTED;
478 ret = func_hwc_window->hwc_window_video_get_supported_format(private_hwc_window->hwc_window_backend,
481 _pthread_mutex_unlock(&private_display->lock);
487 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
488 const tdm_prop **props, int *count)
490 tdm_func_hwc_window *func_hwc_window = NULL;
492 HWC_WINDOW_FUNC_ENTRY();
494 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
495 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
497 _pthread_mutex_lock(&private_display->lock);
499 func_hwc_window = &private_display->func_hwc_window;
501 if (!func_hwc_window->hwc_window_video_get_available_properties) {
502 /* LCOV_EXCL_START */
503 _pthread_mutex_unlock(&private_display->lock);
504 TDM_ERR("not implemented!!");
505 return TDM_ERROR_NOT_IMPLEMENTED;
509 ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
512 _pthread_mutex_unlock(&private_display->lock);
518 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
519 unsigned int id, tdm_value *value)
521 tdm_func_hwc_window *func_hwc_window = NULL;
523 HWC_WINDOW_FUNC_ENTRY();
525 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
527 _pthread_mutex_lock(&private_display->lock);
529 func_hwc_window = &private_display->func_hwc_window;
531 if (!func_hwc_window->hwc_window_video_get_property) {
532 /* LCOV_EXCL_START */
533 _pthread_mutex_unlock(&private_display->lock);
534 TDM_ERR("not implemented!!");
535 return TDM_ERROR_NOT_IMPLEMENTED;
539 ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
542 _pthread_mutex_unlock(&private_display->lock);
548 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
549 unsigned int id, tdm_value value)
551 tdm_func_hwc_window *func_hwc_window = NULL;
553 HWC_WINDOW_FUNC_ENTRY();
555 _pthread_mutex_lock(&private_display->lock);
557 func_hwc_window = &private_display->func_hwc_window;
559 if (!func_hwc_window->hwc_window_video_set_property) {
560 /* LCOV_EXCL_START */
561 _pthread_mutex_unlock(&private_display->lock);
562 TDM_ERR("not implemented!!");
563 return TDM_ERROR_NOT_IMPLEMENTED;
567 ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
570 _pthread_mutex_unlock(&private_display->lock);