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 **************************************************************************/
40 #include "tdm_private.h"
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
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
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
75 tdm_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
77 tdm_func_hwc_window *func_hwc_window = NULL;
78 tbm_surface_queue_h queue = NULL;
80 HWC_WINDOW_FUNC_ENTRY_ERROR();
82 _pthread_mutex_lock(&private_display->lock);
84 func_hwc_window = &private_display->func_hwc_window;
86 if (!func_hwc_window->hwc_window_get_tbm_buffer_queue) {
88 _pthread_mutex_unlock(&private_display->lock);
89 TDM_ERR("not implemented!!");
91 *error = TDM_ERROR_NOT_IMPLEMENTED;
96 queue = func_hwc_window->hwc_window_get_tbm_buffer_queue(private_hwc_window->hwc_window_backend, error);
98 _pthread_mutex_unlock(&private_display->lock);
104 tdm_hwc_window_set_zpos(tdm_hwc_window *hwc_window, int32_t zpos)
106 tdm_func_hwc_window *func_hwc_window = NULL;
108 HWC_WINDOW_FUNC_ENTRY();
110 _pthread_mutex_lock(&private_display->lock);
112 func_hwc_window = &private_display->func_hwc_window;
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;
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;
126 _pthread_mutex_unlock(&private_display->lock);
132 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
133 tdm_hwc_window_composition composition_type)
135 tdm_func_hwc_window *func_hwc_window = NULL;
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);
141 _pthread_mutex_lock(&private_display->lock);
143 func_hwc_window = &private_display->func_hwc_window;
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;
153 ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
155 _pthread_mutex_unlock(&private_display->lock);
161 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
163 tdm_func_hwc_window *func_hwc_window = NULL;
165 HWC_WINDOW_FUNC_ENTRY();
166 if (damage.num_rects > 0)
167 TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, TDM_ERROR_INVALID_PARAMETER);
169 _pthread_mutex_lock(&private_display->lock);
171 func_hwc_window = &private_display->func_hwc_window;
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;
181 ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
183 _pthread_mutex_unlock(&private_display->lock);
190 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
192 tdm_func_hwc_window *func_hwc_window = NULL;
195 HWC_WINDOW_FUNC_ENTRY();
197 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
199 _pthread_mutex_lock(&private_display->lock);
201 func_hwc_window = &private_display->func_hwc_window;
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;
211 if (info->src_config.format)
212 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
214 snprintf(fmtstr, 128, "NONE");
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,
221 info->dst_pos.x, info->dst_pos.y,
222 info->dst_pos.w, info->dst_pos.h,
225 ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
227 _pthread_mutex_unlock(&private_display->lock);
232 /* LCOV_EXCL_START */
234 _tdm_window_dump_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
236 tdm_private_hwc_window *private_window = (tdm_private_hwc_window *)hwc_window;
237 tdm_private_output *private_output = private_window->private_output;
240 char fname[TDM_PATH_LEN];
242 pipe = private_output->pipe;
243 zpos = private_window->zpos;
245 snprintf(fname, sizeof(fname), "tdm_%d_win_%d", pipe, zpos);
247 tbm_surface_internal_dump_buffer(buffer, fname);
248 TDM_DBG("%s dump excute", fname);
255 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
257 tdm_func_hwc_window *func_hwc_window;
259 HWC_WINDOW_FUNC_ENTRY();
261 _pthread_mutex_lock(&private_display->lock);
263 if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
264 /* LCOV_EXCL_START */
265 char str[TDM_PATH_LEN];
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);
273 func_hwc_window = &private_display->func_hwc_window;
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;
284 /* LCOV_EXCL_START */
285 if (tdm_dump_enable && buffer)
286 _tdm_window_dump_buffer(hwc_window, buffer);
289 ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
291 _pthread_mutex_unlock(&private_display->lock);
296 INTERN tdm_hwc_window *
297 tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
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;
306 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
309 if (!func_output->output_hwc_create_window) {
310 /* LCOV_EXCL_START */
312 *error = TDM_ERROR_BAD_MODULE;
317 hwc_window_backend = func_output->output_hwc_create_window(
318 private_output->output_backend, &ret);
319 if (ret != TDM_ERROR_NONE) {
325 if (!func_output->output_hwc_create_video_window) {
326 /* LCOV_EXCL_START */
328 *error = TDM_ERROR_NOT_IMPLEMENTED;
333 hwc_window_backend = func_output->output_hwc_create_video_window(
334 private_output->output_backend, &ret);
335 if (ret != TDM_ERROR_NONE) {
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);
348 *error = TDM_ERROR_OUT_OF_MEMORY;
353 LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
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;
359 TDM_DBG("hwc_window(%p) create", private_hwc_window);
362 *error = TDM_ERROR_NONE;
364 return private_hwc_window;
368 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
370 tdm_private_display *private_display;
371 tdm_private_output *private_output;
372 tdm_func_output *func_output;
374 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
376 if (!private_hwc_window)
377 return TDM_ERROR_OPERATION_FAILED;
379 private_display = private_hwc_window->private_display;
380 private_output = private_hwc_window->private_output;
382 LIST_DEL(&private_hwc_window->link);
384 func_output = &private_display->func_output;
385 func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
387 free(private_hwc_window);
388 return TDM_ERROR_NONE;
392 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
394 tdm_func_hwc_window *func_hwc_window = NULL;
396 HWC_WINDOW_FUNC_ENTRY();
398 _pthread_mutex_lock(&private_display->lock);
400 func_hwc_window = &private_display->func_hwc_window;
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;
410 ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
412 _pthread_mutex_unlock(&private_display->lock);
418 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
420 tdm_func_hwc_window *func_hwc_window = NULL;
422 HWC_WINDOW_FUNC_ENTRY();
424 _pthread_mutex_lock(&private_display->lock);
426 func_hwc_window = &private_display->func_hwc_window;
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;
436 ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
438 _pthread_mutex_unlock(&private_display->lock);
444 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
445 tdm_hwc_window_video_capability *video_capability)
447 tdm_func_hwc_window *func_hwc_window = NULL;
449 HWC_WINDOW_FUNC_ENTRY();
451 TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
453 _pthread_mutex_lock(&private_display->lock);
455 func_hwc_window = &private_display->func_hwc_window;
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;
465 ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
468 _pthread_mutex_unlock(&private_display->lock);
474 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
475 const tdm_prop **props, int *count)
477 tdm_func_hwc_window *func_hwc_window = NULL;
479 HWC_WINDOW_FUNC_ENTRY();
481 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
482 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
484 _pthread_mutex_lock(&private_display->lock);
486 func_hwc_window = &private_display->func_hwc_window;
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;
496 ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
499 _pthread_mutex_unlock(&private_display->lock);
505 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
506 unsigned int id, tdm_value *value)
508 tdm_func_hwc_window *func_hwc_window = NULL;
510 HWC_WINDOW_FUNC_ENTRY();
512 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
514 _pthread_mutex_lock(&private_display->lock);
516 func_hwc_window = &private_display->func_hwc_window;
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;
526 ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
529 _pthread_mutex_unlock(&private_display->lock);
535 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
536 unsigned int id, tdm_value value)
538 tdm_func_hwc_window *func_hwc_window = NULL;
540 HWC_WINDOW_FUNC_ENTRY();
542 _pthread_mutex_lock(&private_display->lock);
544 func_hwc_window = &private_display->func_hwc_window;
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;
554 ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
557 _pthread_mutex_unlock(&private_display->lock);