1 /**************************************************************************
5 * Copyright 2018 Samsung Electronics co., Ltd. All Rights Reserved.
7 * Contact: SooChan Lim <sc1.lim@samsung.com>,
8 * Boram Park <boram1288.park@samsung.com>,
9 * Changyeon Lee <cyeon.lee@samsung.com>,
10 * Sangjin Lee <lsj119@samsung.com>
12 * Permission is hereby granted, free of charge, to any person obtaining a
13 * copy of this software and associated documentation files (the
14 * "Software"), to deal in the Software without restriction, including
15 * without limitation the rights to use, copy, modify, merge, publish,
16 * distribute, sub license, and/or sell copies of the Software, and to
17 * permit persons to whom the Software is furnished to do so, subject to
18 * the following conditions:
20 * The above copyright notice and this permission notice (including the
21 * next paragraph) shall be included in all copies or substantial portions
24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
25 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
27 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
28 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
29 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
30 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
32 **************************************************************************/
38 #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 *private_hwc; \
48 tdm_private_hwc_window *private_hwc_window; \
49 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
50 TDM_RETURN_VAL_IF_FAIL(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER); \
51 private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
52 private_hwc = private_hwc_window->private_hwc; \
53 TDM_RETURN_VAL_IF_FAIL(private_hwc != NULL, TDM_ERROR_INVALID_PARAMETER); \
54 private_output = private_hwc->private_output; \
55 TDM_RETURN_VAL_IF_FAIL(private_output != NULL, TDM_ERROR_INVALID_PARAMETER); \
56 private_display = private_output->private_display
58 #define HWC_WINDOW_FUNC_ENTRY_ERROR() \
59 tdm_private_display *private_display; \
60 tdm_private_output *private_output; \
61 tdm_private_hwc *private_hwc; \
62 tdm_private_hwc_window *private_hwc_window; \
63 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
64 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(hwc_window != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
65 private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
66 private_hwc = private_hwc_window->private_hwc; \
67 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_hwc != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
68 private_output = private_hwc->private_output; \
69 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(private_output != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
70 private_display = private_output->private_display
72 #define HWC_WINDOW_FUNC_ENTRY_VOID_RETURN() \
73 tdm_private_display *private_display; \
74 tdm_private_output *private_output; \
75 tdm_private_hwc *private_hwc; \
76 tdm_private_hwc_window *private_hwc_window; \
77 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
78 TDM_RETURN_IF_FAIL(hwc_window != NULL); \
79 private_hwc_window = (tdm_private_hwc_window*)hwc_window; \
80 private_hwc = private_hwc_window->private_hwc; \
81 TDM_RETURN_IF_FAIL(private_hwc != NULL); \
82 private_output = private_hwc->private_output; \
83 TDM_RETURN_IF_FAIL(private_output != NULL); \
84 private_display = private_output->private_display
87 INTERN tdm_hwc_window *
88 tdm_hwc_window_create_internal(tdm_private_hwc *private_hwc, tdm_error *error)
90 tdm_private_output *private_output = private_hwc->private_output;
91 tdm_private_module *private_module = private_output->private_module;
92 tdm_func_hwc *func_hwc = &private_module->func_hwc;
93 tdm_private_hwc_window *private_hwc_window = NULL;
94 tdm_hwc_window *hwc_window_backend = NULL;
95 tdm_error ret = TDM_ERROR_NONE;
97 TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), NULL);
99 if (!func_hwc->hwc_create_window) {
100 /* LCOV_EXCL_START */
102 *error = TDM_ERROR_BAD_MODULE;
107 private_hwc_window = calloc(1, sizeof(tdm_private_hwc_window));
108 if (!private_hwc_window) {
109 /* LCOV_EXCL_START */
110 TDM_ERR("failed: alloc memory");
112 *error = TDM_ERROR_OUT_OF_MEMORY;
117 hwc_window_backend = func_hwc->hwc_create_window(private_hwc->hwc_backend, &ret);
118 if (ret != TDM_ERROR_NONE) {
119 free(private_hwc_window);
125 LIST_ADD(&private_hwc_window->link, &private_hwc->hwc_window_list);
127 private_hwc_window->private_hwc = private_hwc;
128 private_hwc_window->hwc_window_backend = hwc_window_backend;
130 TDM_DBG("hwc_window(%p) create", private_hwc_window);
133 *error = TDM_ERROR_NONE;
135 return private_hwc_window;
139 tdm_hwc_window_destroy_internal(tdm_private_hwc_window *private_hwc_window)
141 tdm_private_output *private_output;
142 tdm_private_module *private_module;
143 tdm_private_hwc *private_hwc;
144 tdm_func_hwc_window *func_hwc_window;
146 TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
148 if (!private_hwc_window)
151 private_hwc = private_hwc_window->private_hwc;
152 private_output = private_hwc->private_output;
153 private_module = private_output->private_module;
154 func_hwc_window = &private_module->func_hwc_window;
156 LIST_DEL(&private_hwc_window->link);
158 func_hwc_window = &private_module->func_hwc_window;
159 func_hwc_window->hwc_window_destroy(private_hwc_window->hwc_window_backend);
161 free(private_hwc_window);
165 tdm_hwc_window_destroy(tdm_hwc_window *hwc_window)
167 tdm_private_display *private_display;
168 tdm_private_output *private_output;
169 tdm_private_hwc *private_hwc;
170 tdm_private_hwc_window *private_hwc_window;
175 private_hwc_window = (tdm_private_hwc_window *)hwc_window;
176 private_hwc = private_hwc_window->private_hwc;
177 private_output = private_hwc->private_output;
178 private_display = private_output->private_display;
180 _pthread_mutex_lock(&private_display->lock);
182 tdm_hwc_window_destroy_internal(hwc_window);
184 _pthread_mutex_unlock(&private_display->lock);
187 EXTERN tbm_surface_queue_h
188 tdm_hwc_window_acquire_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
190 tdm_private_module *private_module;
191 tdm_func_hwc_window *func_hwc_window = NULL;
192 tbm_surface_queue_h queue = NULL;
194 HWC_WINDOW_FUNC_ENTRY_ERROR();
196 _pthread_mutex_lock(&private_display->lock);
198 private_module = private_output->private_module;
199 func_hwc_window = &private_module->func_hwc_window;
201 if (!func_hwc_window->hwc_window_acquire_buffer_queue) {
202 /* LCOV_EXCL_START */
203 _pthread_mutex_unlock(&private_display->lock);
204 TDM_WRN("not implemented!!");
206 *error = TDM_ERROR_NOT_IMPLEMENTED;
210 queue = func_hwc_window->hwc_window_acquire_buffer_queue(private_hwc_window->hwc_window_backend, error);
212 _pthread_mutex_unlock(&private_display->lock);
218 tdm_hwc_window_release_buffer_queue(tdm_hwc_window *hwc_window, tbm_surface_queue_h queue)
220 tdm_private_module *private_module;
221 tdm_func_hwc_window *func_hwc_window = NULL;
222 tdm_private_display *private_display;
223 tdm_private_output *private_output;
224 tdm_private_hwc *private_hwc;
225 tdm_private_hwc_window *private_hwc_window;
230 private_hwc_window = (tdm_private_hwc_window *)hwc_window;
231 private_hwc = private_hwc_window->private_hwc;
232 private_output = private_hwc->private_output;
233 private_display = private_output->private_display;
235 TDM_RETURN_IF_FAIL(queue != NULL);
237 _pthread_mutex_lock(&private_display->lock);
239 private_module = private_output->private_module;
240 func_hwc_window = &private_module->func_hwc_window;
242 if (!func_hwc_window->hwc_window_release_buffer_queue) {
243 _pthread_mutex_unlock(&private_display->lock);
244 TDM_WRN("not implemented!!");
248 func_hwc_window->hwc_window_release_buffer_queue(private_hwc_window->hwc_window_backend, queue);
250 _pthread_mutex_unlock(&private_display->lock);
256 tdm_hwc_window_set_composition_type(tdm_hwc_window *hwc_window,
257 tdm_hwc_window_composition composition_type)
259 tdm_private_module *private_module;
260 tdm_func_hwc_window *func_hwc_window = NULL;
262 HWC_WINDOW_FUNC_ENTRY();
263 TDM_RETURN_VAL_IF_FAIL(composition_type >= TDM_HWC_WIN_COMPOSITION_NONE, TDM_ERROR_INVALID_PARAMETER);
264 TDM_RETURN_VAL_IF_FAIL(composition_type <= TDM_HWC_WIN_COMPOSITION_VIDEO, TDM_ERROR_INVALID_PARAMETER);
266 _pthread_mutex_lock(&private_display->lock);
268 private_module = private_output->private_module;
269 func_hwc_window = &private_module->func_hwc_window;
271 if (!func_hwc_window->hwc_window_set_composition_type) {
272 _pthread_mutex_unlock(&private_display->lock);
273 TDM_WRN("not implemented!!");
274 return TDM_ERROR_NOT_IMPLEMENTED;
277 ret = func_hwc_window->hwc_window_set_composition_type(private_hwc_window->hwc_window_backend, composition_type);
279 _pthread_mutex_unlock(&private_display->lock);
285 tdm_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_region damage)
287 tdm_private_module *private_module;
288 tdm_func_hwc_window *func_hwc_window = NULL;
290 HWC_WINDOW_FUNC_ENTRY();
291 if (damage.num_rects > 0)
292 TDM_RETURN_VAL_IF_FAIL(damage.rects != NULL, TDM_ERROR_INVALID_PARAMETER);
294 _pthread_mutex_lock(&private_display->lock);
296 private_module = private_output->private_module;
297 func_hwc_window = &private_module->func_hwc_window;
299 if (!func_hwc_window->hwc_window_set_buffer_damage) {
300 _pthread_mutex_unlock(&private_display->lock);
301 TDM_WRN("not implemented!!");
302 return TDM_ERROR_NOT_IMPLEMENTED;
305 ret = func_hwc_window->hwc_window_set_buffer_damage(private_hwc_window->hwc_window_backend, damage);
307 _pthread_mutex_unlock(&private_display->lock);
314 tdm_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info)
316 tdm_private_module *private_module;
317 tdm_func_hwc_window *func_hwc_window = NULL;
320 HWC_WINDOW_FUNC_ENTRY();
322 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
324 _pthread_mutex_lock(&private_display->lock);
326 private_module = private_output->private_module;
327 func_hwc_window = &private_module->func_hwc_window;
329 if (!func_hwc_window->hwc_window_set_info) {
330 _pthread_mutex_unlock(&private_display->lock);
331 TDM_WRN("not implemented!!");
332 return TDM_ERROR_NOT_IMPLEMENTED;
335 if (info->src_config.format)
336 snprintf(fmtstr, 128, "%c%c%c%c", FOURCC_STR(info->src_config.format));
338 snprintf(fmtstr, 128, "NONE");
340 TDM_INFO("hwc_window(%p) info: src(%dx%d %d,%d %dx%d %s) dst(%d,%d %dx%d) trans(%d)",
341 private_hwc_window, info->src_config.size.h, info->src_config.size.v,
342 info->src_config.pos.x, info->src_config.pos.y,
343 info->src_config.pos.w, info->src_config.pos.h,
345 info->dst_pos.x, info->dst_pos.y,
346 info->dst_pos.w, info->dst_pos.h,
349 ret = func_hwc_window->hwc_window_set_info(private_hwc_window->hwc_window_backend, info);
351 _pthread_mutex_unlock(&private_display->lock);
357 tdm_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h buffer)
359 tdm_private_module *private_module;
360 tdm_func_hwc_window *func_hwc_window;
362 HWC_WINDOW_FUNC_ENTRY();
364 _pthread_mutex_lock(&private_display->lock);
366 if ((tdm_debug_dump & TDM_DUMP_FLAG_WINDOW) && buffer) {
367 char str[TDM_PATH_LEN];
369 snprintf(str, TDM_PATH_LEN, "window_%d_%03d", private_output->index, i++);
370 tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str);
373 private_module = private_output->private_module;
374 func_hwc_window = &private_module->func_hwc_window;
376 if (!func_hwc_window->hwc_window_set_buffer) {
377 _pthread_mutex_unlock(&private_display->lock);
378 TDM_WRN("not implemented!!");
379 return TDM_ERROR_NOT_IMPLEMENTED;
382 ret = func_hwc_window->hwc_window_set_buffer(private_hwc_window->hwc_window_backend, buffer);
384 _pthread_mutex_unlock(&private_display->lock);
390 tdm_hwc_window_set_acquire_fence(tdm_hwc_window *hwc_window, int acquire_fence)
392 tdm_private_module *private_module;
393 tdm_func_hwc_window *func_hwc_window;
395 HWC_WINDOW_FUNC_ENTRY();
397 _pthread_mutex_lock(&private_display->lock);
399 private_module = private_output->private_module;
400 func_hwc_window = &private_module->func_hwc_window;
402 if (!func_hwc_window->hwc_window_set_acquire_fence) {
403 _pthread_mutex_unlock(&private_display->lock);
404 TDM_WRN("not implemented!!");
405 return TDM_ERROR_NOT_IMPLEMENTED;
408 ret = func_hwc_window->hwc_window_set_acquire_fence(private_hwc_window->hwc_window_backend, acquire_fence);
410 _pthread_mutex_unlock(&private_display->lock);
416 tdm_hwc_window_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value)
418 tdm_private_module *private_module;
419 tdm_func_hwc_window *func_hwc_window = NULL;
421 HWC_WINDOW_FUNC_ENTRY();
423 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
425 _pthread_mutex_lock(&private_display->lock);
427 private_module = private_output->private_module;
428 func_hwc_window = &private_module->func_hwc_window;
430 if (!func_hwc_window->hwc_window_get_property) {
431 /* LCOV_EXCL_START */
432 _pthread_mutex_unlock(&private_display->lock);
433 TDM_WRN("not implemented!!");
434 return TDM_ERROR_NOT_IMPLEMENTED;
437 ret = func_hwc_window->hwc_window_get_property(private_hwc_window->hwc_window_backend, id, value);
439 _pthread_mutex_unlock(&private_display->lock);
445 tdm_hwc_window_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value)
447 tdm_private_module *private_module;
448 tdm_func_hwc_window *func_hwc_window = NULL;
450 HWC_WINDOW_FUNC_ENTRY();
452 _pthread_mutex_lock(&private_display->lock);
454 private_module = private_output->private_module;
455 func_hwc_window = &private_module->func_hwc_window;
457 if (!func_hwc_window->hwc_window_set_property) {
458 /* LCOV_EXCL_START */
459 _pthread_mutex_unlock(&private_display->lock);
460 TDM_WRN("not implemented!!");
461 return TDM_ERROR_NOT_IMPLEMENTED;
464 ret = func_hwc_window->hwc_window_set_property(private_hwc_window->hwc_window_backend, id, value);
466 _pthread_mutex_unlock(&private_display->lock);
472 tdm_hwc_window_get_constraints(tdm_hwc_window *hwc_window, int *constraints)
474 tdm_private_module *private_module;
475 tdm_func_hwc_window *func_hwc_window = NULL;
477 HWC_WINDOW_FUNC_ENTRY();
479 _pthread_mutex_lock(&private_display->lock);
481 private_module = private_output->private_module;
482 func_hwc_window = &private_module->func_hwc_window;
484 if (!func_hwc_window->hwc_window_get_constraints) {
485 _pthread_mutex_unlock(&private_display->lock);
486 TDM_WRN("not implemented!!");
487 return TDM_ERROR_NOT_IMPLEMENTED;
490 ret = func_hwc_window->hwc_window_get_constraints(private_hwc_window->hwc_window_backend, constraints);
492 _pthread_mutex_unlock(&private_display->lock);
498 tdm_hwc_window_set_name(tdm_hwc_window *hwc_window, const char *name)
500 tdm_private_module *private_module;
501 tdm_func_hwc_window *func_hwc_window = NULL;
503 HWC_WINDOW_FUNC_ENTRY();
505 _pthread_mutex_lock(&private_display->lock);
507 private_module = private_output->private_module;
508 func_hwc_window = &private_module->func_hwc_window;
510 if (!func_hwc_window->hwc_window_set_name) {
511 _pthread_mutex_unlock(&private_display->lock);
512 TDM_WRN("not implemented!!");
513 return TDM_ERROR_NOT_IMPLEMENTED;
516 ret = func_hwc_window->hwc_window_set_name(private_hwc_window->hwc_window_backend, name);
518 _pthread_mutex_unlock(&private_display->lock);
524 tdm_hwc_window_set_cursor_image(tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr)
526 tdm_private_module *private_module;
527 tdm_func_hwc_window *func_hwc_window = NULL;
529 HWC_WINDOW_FUNC_ENTRY();
531 _pthread_mutex_lock(&private_display->lock);
533 private_module = private_output->private_module;
534 func_hwc_window = &private_module->func_hwc_window;
536 if (!func_hwc_window->hwc_window_set_cursor_image) {
537 _pthread_mutex_unlock(&private_display->lock);
538 TDM_WRN("not implemented!!");
539 return TDM_ERROR_NOT_IMPLEMENTED;
542 ret = func_hwc_window->hwc_window_set_cursor_image(private_hwc_window->hwc_window_backend, width, height, stride, ptr);
544 _pthread_mutex_unlock(&private_display->lock);