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_composition_type(tdm_hwc_window *hwc_window,
105 tdm_hwc_window_composition composition_type)
107 tdm_func_hwc_window *func_hwc_window = NULL;
109 HWC_WINDOW_FUNC_ENTRY();
110 TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER);
111 TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
113 _pthread_mutex_lock(&private_display->lock);
115 func_hwc_window = &private_display->func_hwc_window;
117 if (!func_hwc_window->hwc_window_set_composition_type) {
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_composition_type(private_hwc_window->hwc_window_backend, composition_type);
127 _pthread_mutex_unlock(&private_display->lock);
133 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_hwc_region damage)
135 tdm_func_hwc_window *func_hwc_window = NULL;
137 HWC_WINDOW_FUNC_ENTRY();
138 if (damage.num_rects > 0)
139 TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, 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_buffer_damage) {
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_buffer_damage(private_hwc_window->hwc_window_backend, damage);
155 _pthread_mutex_unlock(&private_display->lock);
162 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
164 tdm_func_hwc_window *func_hwc_window = NULL;
167 HWC_WINDOW_FUNC_ENTRY();
169 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
171 _pthread_mutex_lock(&private_display->lock);
173 func_hwc_window = &private_display->func_hwc_window;
175 if (!func_hwc_window->hwc_window_set_info) {
176 /* LCOV_EXCL_START */
177 _pthread_mutex_unlock(&private_display->lock);
178 TDM_ERR("not implemented!!");
179 return TDM_ERROR_NOT_IMPLEMENTED;
183 if (info->src_config.format)
184 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
186 snprintf(fmtstr, 128, "NONE");
188 TDM_INFO("hwc_window(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)",
189 private_hwc_window, info->src_config.size.h, info->src_config.size.v,
190 info->src_config.pos.x, info->src_config.pos.y,
191 info->src_config.pos.w, info->src_config.pos.h,
193 info->dst_pos.x, info->dst_pos.y,
194 info->dst_pos.w, info->dst_pos.h,
197 ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
199 _pthread_mutex_unlock(&private_display->lock);
205 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
207 tdm_func_hwc_window *func_hwc_window;
209 HWC_WINDOW_FUNC_ENTRY();
211 _pthread_mutex_lock(&private_display->lock);
213 if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
214 /* LCOV_EXCL_START */
215 char str[TDM_PATH_LEN];
217 snprintf(str, TDM_PATH_LEN, "window_%d_%03d", private_output->index, i++);
218 tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str);
222 func_hwc_window = &private_display->func_hwc_window;
224 if (!func_hwc_window->hwc_window_set_buffer) {
225 /* LCOV_EXCL_START */
226 _pthread_mutex_unlock(&private_display->lock);
227 TDM_ERR("not implemented!!");
228 return TDM_ERROR_NOT_IMPLEMENTED;
232 ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
234 _pthread_mutex_unlock(&private_display->lock);
239 INTERN tdm_hwc_window *
240 tdm_hwc_window_create_internal(tdm_private_output *private_output, int is_video,
243 tdm_private_display *private_display = private_output->private_display;
244 tdm_func_output *func_output = &private_display->func_output;
245 tdm_private_hwc_window *private_hwc_window = NULL;
246 tdm_hwc_window *hwc_window_backend = NULL;
247 tdm_error ret = TDM_ERROR_NONE;
249 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
252 if (!func_output->output_hwc_create_window) {
253 /* LCOV_EXCL_START */
255 *error = TDM_ERROR_BAD_MODULE;
260 hwc_window_backend = func_output->output_hwc_create_window(
261 private_output->output_backend, &ret);
262 if (ret != TDM_ERROR_NONE) {
268 if (!func_output->output_hwc_create_video_window) {
269 /* LCOV_EXCL_START */
271 *error = TDM_ERROR_NOT_IMPLEMENTED;
276 hwc_window_backend = func_output->output_hwc_create_video_window(
277 private_output->output_backend, &ret);
278 if (ret != TDM_ERROR_NONE) {
285 private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window));
286 if (!private_hwc_window) {
287 /* LCOV_EXCL_START */
288 TDM_ERR("failed: alloc memory");
289 func_output->output_hwc_destroy_window(private_output->output_backend, hwc_window_backend);
291 *error = TDM_ERROR_OUT_OF_MEMORY;
296 LIST_ADD(&private_hwc_window->link, &private_output->hwc_window_list);
298 private_hwc_window->private_display = private_display;
299 private_hwc_window->private_output = private_output;
300 private_hwc_window->hwc_window_backend = hwc_window_backend;
302 TDM_DBG("hwc_window(%p) create", private_hwc_window);
305 *error = TDM_ERROR_NONE;
307 return private_hwc_window;
311 tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window)
313 tdm_private_display *private_display;
314 tdm_private_output *private_output;
315 tdm_func_output *func_output;
317 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
319 if (!private_hwc_window)
320 return TDM_ERROR_OPERATION_FAILED;
322 private_display = private_hwc_window->private_display;
323 private_output = private_hwc_window->private_output;
325 LIST_DEL(&private_hwc_window->link);
327 func_output = &private_display->func_output;
328 func_output->output_hwc_destroy_window(private_output->output_backend, private_hwc_window->hwc_window_backend);
330 free(private_hwc_window);
331 return TDM_ERROR_NONE;
335 tdm_hwc_window_set_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
337 tdm_func_hwc_window *func_hwc_window = NULL;
339 HWC_WINDOW_FUNC_ENTRY();
341 _pthread_mutex_lock(&private_display->lock);
343 func_hwc_window = &private_display->func_hwc_window;
345 if (!func_hwc_window->hwc_window_set_flags) {
346 /* LCOV_EXCL_START */
347 _pthread_mutex_unlock(&private_display->lock);
348 TDM_ERR("not implemented!!");
349 return TDM_ERROR_NOT_IMPLEMENTED;
353 ret = func_hwc_window->hwc_window_set_flags(private_hwc_window->hwc_window_backend, flags);
355 _pthread_mutex_unlock(&private_display->lock);
361 tdm_hwc_window_unset_flags(tdm_hwc_window *hwc_window, tdm_hwc_window_flag flags)
363 tdm_func_hwc_window *func_hwc_window = NULL;
365 HWC_WINDOW_FUNC_ENTRY();
367 _pthread_mutex_lock(&private_display->lock);
369 func_hwc_window = &private_display->func_hwc_window;
371 if (!func_hwc_window->hwc_window_unset_flags) {
372 /* LCOV_EXCL_START */
373 _pthread_mutex_unlock(&private_display->lock);
374 TDM_ERR("not implemented!!");
375 return TDM_ERROR_NOT_IMPLEMENTED;
379 ret = func_hwc_window->hwc_window_unset_flags(private_hwc_window->hwc_window_backend, flags);
381 _pthread_mutex_unlock(&private_display->lock);
387 tdm_hwc_window_video_get_capability(tdm_hwc_window *hwc_window,
388 tdm_hwc_window_video_capability *video_capability)
390 tdm_func_hwc_window *func_hwc_window = NULL;
392 HWC_WINDOW_FUNC_ENTRY();
394 TDM_RETURN_VAL_IF_FAIL(video_capability != NULL, TDM_ERROR_INVALID_PARAMETER);
396 _pthread_mutex_lock(&private_display->lock);
398 func_hwc_window = &private_display->func_hwc_window;
400 if (!func_hwc_window->hwc_window_video_get_capability) {
401 /* LCOV_EXCL_START */
402 _pthread_mutex_unlock(&private_display->lock);
403 TDM_ERR("not implemented!!");
404 return TDM_ERROR_NOT_IMPLEMENTED;
408 ret = func_hwc_window->hwc_window_video_get_capability(private_hwc_window->hwc_window_backend,
411 _pthread_mutex_unlock(&private_display->lock);
417 tdm_hwc_window_video_get_available_properties(tdm_hwc_window *hwc_window,
418 const tdm_prop **props, int *count)
420 tdm_func_hwc_window *func_hwc_window = NULL;
422 HWC_WINDOW_FUNC_ENTRY();
424 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
425 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
427 _pthread_mutex_lock(&private_display->lock);
429 func_hwc_window = &private_display->func_hwc_window;
431 if (!func_hwc_window->hwc_window_video_get_available_properties) {
432 /* LCOV_EXCL_START */
433 _pthread_mutex_unlock(&private_display->lock);
434 TDM_ERR("not implemented!!");
435 return TDM_ERROR_NOT_IMPLEMENTED;
439 ret = func_hwc_window->hwc_window_video_get_available_properties(private_hwc_window->hwc_window_backend,
442 _pthread_mutex_unlock(&private_display->lock);
448 tdm_hwc_window_video_get_property(tdm_hwc_window *hwc_window,
449 unsigned int id, tdm_value *value)
451 tdm_func_hwc_window *func_hwc_window = NULL;
453 HWC_WINDOW_FUNC_ENTRY();
455 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
457 _pthread_mutex_lock(&private_display->lock);
459 func_hwc_window = &private_display->func_hwc_window;
461 if (!func_hwc_window->hwc_window_video_get_property) {
462 /* LCOV_EXCL_START */
463 _pthread_mutex_unlock(&private_display->lock);
464 TDM_ERR("not implemented!!");
465 return TDM_ERROR_NOT_IMPLEMENTED;
469 ret = func_hwc_window->hwc_window_video_get_property(private_hwc_window->hwc_window_backend,
472 _pthread_mutex_unlock(&private_display->lock);
478 tdm_hwc_window_video_set_property(tdm_hwc_window *hwc_window,
479 unsigned int id, tdm_value value)
481 tdm_func_hwc_window *func_hwc_window = NULL;
483 HWC_WINDOW_FUNC_ENTRY();
485 _pthread_mutex_lock(&private_display->lock);
487 func_hwc_window = &private_display->func_hwc_window;
489 if (!func_hwc_window->hwc_window_video_set_property) {
490 /* LCOV_EXCL_START */
491 _pthread_mutex_unlock(&private_display->lock);
492 TDM_ERR("not implemented!!");
493 return TDM_ERROR_NOT_IMPLEMENTED;
497 ret = func_hwc_window->hwc_window_video_set_property(private_hwc_window->hwc_window_backend,
500 _pthread_mutex_unlock(&private_display->lock);