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"
46 #define DISPLAY_FUNC_ENTRY() \
47 tdm_private_display *private_display; \
48 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
49 TDM_RETURN_VAL_IF_FAIL(dpy != NULL, TDM_ERROR_INVALID_PARAMETER); \
50 private_display = (tdm_private_display*)dpy;
52 #define DISPLAY_FUNC_ENTRY_ERROR() \
53 tdm_private_display *private_display; \
54 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
55 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(dpy != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
56 private_display = (tdm_private_display*)dpy;
58 #define OUTPUT_FUNC_ENTRY() \
59 tdm_private_display *private_display; \
60 tdm_private_output *private_output; \
61 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
62 TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER); \
63 private_output = (tdm_private_output*)output; \
64 private_display = private_output->private_display
66 #define OUTPUT_FUNC_ENTRY_ERROR() \
67 tdm_private_display *private_display; \
68 tdm_private_output *private_output; \
69 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
70 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(output != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
71 private_output = (tdm_private_output*)output; \
72 private_display = private_output->private_display
74 #define LAYER_FUNC_ENTRY() \
75 tdm_private_display *private_display; \
76 tdm_private_output *private_output; \
77 tdm_private_layer *private_layer; \
78 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
79 TDM_RETURN_VAL_IF_FAIL(layer != NULL, TDM_ERROR_INVALID_PARAMETER); \
80 private_layer = (tdm_private_layer*)layer; \
81 private_output = private_layer->private_output; \
82 private_display = private_output->private_display
84 #define LAYER_FUNC_ENTRY_ERROR() \
85 tdm_private_display *private_display; \
86 tdm_private_output *private_output; \
87 tdm_private_layer *private_layer; \
88 tdm_error ret = TDM_ERROR_NONE; /* default TDM_ERROR_NONE */\
89 TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(layer != NULL, TDM_ERROR_INVALID_PARAMETER, NULL); \
90 private_layer = (tdm_private_layer*)layer; \
91 private_output = private_layer->private_output; \
92 private_display = private_output->private_display
95 tdm_display_get_capabilities(tdm_display *dpy, tdm_display_capability *capabilities)
99 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
101 pthread_mutex_lock(&private_display->lock);
103 *capabilities = private_display->capabilities;
105 pthread_mutex_unlock(&private_display->lock);
111 tdm_display_get_pp_capabilities(tdm_display *dpy, tdm_pp_capability *capabilities)
113 DISPLAY_FUNC_ENTRY();
115 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
117 pthread_mutex_lock(&private_display->lock);
119 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_PP))
121 TDM_ERR("no pp capability");
122 pthread_mutex_unlock(&private_display->lock);
123 return TDM_ERROR_NO_CAPABILITY;
126 *capabilities = private_display->caps_pp.capabilities;
128 pthread_mutex_unlock(&private_display->lock);
134 tdm_display_get_pp_available_formats(tdm_display *dpy, const tbm_format **formats, int *count)
136 DISPLAY_FUNC_ENTRY();
138 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
139 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
141 pthread_mutex_lock(&private_display->lock);
143 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_PP))
145 TDM_ERR("no pp capability");
146 pthread_mutex_unlock(&private_display->lock);
147 return TDM_ERROR_NO_CAPABILITY;
150 *formats = (const tbm_format*)private_display->caps_pp.formats;
151 *count = private_display->caps_pp.format_count;
153 pthread_mutex_unlock(&private_display->lock);
159 tdm_display_get_pp_available_size(tdm_display *dpy, int *min_w, int *min_h,
160 int *max_w, int *max_h, int *preferred_align)
162 DISPLAY_FUNC_ENTRY();
164 pthread_mutex_lock(&private_display->lock);
166 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_PP))
168 TDM_ERR("no pp capability");
169 pthread_mutex_unlock(&private_display->lock);
170 return TDM_ERROR_NO_CAPABILITY;
174 *min_w = private_display->caps_pp.min_w;
176 *min_h = private_display->caps_pp.min_h;
178 *max_w = private_display->caps_pp.max_w;
180 *max_h = private_display->caps_pp.max_h;
182 *preferred_align = private_display->caps_pp.preferred_align;
184 pthread_mutex_unlock(&private_display->lock);
190 tdm_display_get_capture_capabilities(tdm_display *dpy, tdm_capture_capability *capabilities)
192 DISPLAY_FUNC_ENTRY();
194 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
196 pthread_mutex_lock(&private_display->lock);
198 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE))
200 TDM_ERR("no capture capability");
201 pthread_mutex_unlock(&private_display->lock);
202 return TDM_ERROR_NO_CAPABILITY;
205 *capabilities = private_display->caps_capture.capabilities;
207 pthread_mutex_unlock(&private_display->lock);
213 tdm_display_get_catpure_available_formats(tdm_display *dpy, const tbm_format **formats, int *count)
215 DISPLAY_FUNC_ENTRY();
217 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
218 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
220 pthread_mutex_lock(&private_display->lock);
222 if (!(private_display->capabilities & TDM_DISPLAY_CAPABILITY_CAPTURE))
224 TDM_ERR("no capture capability");
225 pthread_mutex_unlock(&private_display->lock);
226 return TDM_ERROR_NO_CAPABILITY;
229 *formats = (const tbm_format*)private_display->caps_capture.formats;
230 *count = private_display->caps_capture.format_count;
232 pthread_mutex_unlock(&private_display->lock);
238 tdm_display_get_output_count(tdm_display *dpy, int *count)
240 tdm_private_output *private_output = NULL;
242 DISPLAY_FUNC_ENTRY();
244 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
246 pthread_mutex_lock(&private_display->lock);
249 LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link)
254 pthread_mutex_unlock(&private_display->lock);
255 return TDM_ERROR_NONE;
258 pthread_mutex_unlock(&private_display->lock);
265 tdm_display_get_output(tdm_display *dpy, int index, tdm_error *error)
267 tdm_private_output *private_output = NULL;
270 DISPLAY_FUNC_ENTRY_ERROR();
272 pthread_mutex_lock(&private_display->lock);
275 *error = TDM_ERROR_NONE;
278 LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link)
282 pthread_mutex_unlock(&private_display->lock);
283 return private_output;
288 pthread_mutex_unlock(&private_display->lock);
294 tdm_display_get_fd(tdm_display *dpy, int *fd)
296 tdm_func_display *func_display;
297 DISPLAY_FUNC_ENTRY();
299 TDM_RETURN_VAL_IF_FAIL(fd != NULL, TDM_ERROR_INVALID_PARAMETER);
301 pthread_mutex_lock(&private_display->lock);
303 func_display = &private_display->func_display;
305 if (!func_display->display_get_fd)
307 pthread_mutex_unlock(&private_display->lock);
308 return TDM_ERROR_NONE;
311 ret = func_display->display_get_fd(private_display->bdata, fd);
313 pthread_mutex_unlock(&private_display->lock);
319 tdm_display_handle_events(tdm_display *dpy)
321 tdm_func_display *func_display;
322 DISPLAY_FUNC_ENTRY();
324 pthread_mutex_lock(&private_display->lock);
326 func_display = &private_display->func_display;
328 if (!func_display->display_handle_events)
330 pthread_mutex_unlock(&private_display->lock);
331 return TDM_ERROR_NONE;
334 ret = func_display->display_handle_events(private_display->bdata);
336 pthread_mutex_unlock(&private_display->lock);
342 tdm_display_create_pp(tdm_display *dpy, tdm_error *error)
346 DISPLAY_FUNC_ENTRY_ERROR();
348 pthread_mutex_lock(&private_display->lock);
350 pp = (tdm_pp*)tdm_pp_create_internal(private_display, error);
352 pthread_mutex_unlock(&private_display->lock);
358 tdm_output_get_conn_status(tdm_output *output, tdm_output_conn_status *status)
362 TDM_RETURN_VAL_IF_FAIL(status != NULL, TDM_ERROR_INVALID_PARAMETER);
364 pthread_mutex_lock(&private_display->lock);
366 *status = private_output->caps.status;
368 pthread_mutex_unlock(&private_display->lock);
374 tdm_output_get_output_type(tdm_output *output, tdm_output_type *type)
378 TDM_RETURN_VAL_IF_FAIL(type != NULL, TDM_ERROR_INVALID_PARAMETER);
380 pthread_mutex_lock(&private_display->lock);
382 *type = private_output->caps.type;
384 pthread_mutex_unlock(&private_display->lock);
390 tdm_output_get_layer_count(tdm_output *output, int *count)
392 tdm_private_layer *private_layer = NULL;
396 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
398 pthread_mutex_lock(&private_display->lock);
401 LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link)
405 pthread_mutex_unlock(&private_display->lock);
406 return TDM_ERROR_NONE;
409 pthread_mutex_unlock(&private_display->lock);
416 tdm_output_get_layer(tdm_output *output, int index, tdm_error *error)
418 tdm_private_layer *private_layer = NULL;
421 OUTPUT_FUNC_ENTRY_ERROR();
423 pthread_mutex_lock(&private_display->lock);
426 *error = TDM_ERROR_NONE;
428 LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link)
432 pthread_mutex_unlock(&private_display->lock);
433 return private_layer;
438 pthread_mutex_unlock(&private_display->lock);
444 tdm_output_get_available_properties(tdm_output *output, const tdm_prop **props, int *count)
448 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
449 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
451 pthread_mutex_lock(&private_display->lock);
453 *props = (const tdm_prop*)private_output->caps.props;
454 *count = private_output->caps.prop_count;
456 pthread_mutex_unlock(&private_display->lock);
462 tdm_output_get_available_modes(tdm_output *output, const tdm_output_mode **modes, int *count)
466 TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
467 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
469 pthread_mutex_lock(&private_display->lock);
471 *modes = (const tdm_output_mode*)private_output->caps.modes;
472 *count = private_output->caps.mode_count;
474 pthread_mutex_unlock(&private_display->lock);
480 tdm_output_get_available_size(tdm_output *output, int *min_w, int *min_h,
481 int *max_w, int *max_h, int *preferred_align)
485 pthread_mutex_lock(&private_display->lock);
488 *min_w = private_output->caps.min_w;
490 *min_h = private_output->caps.min_h;
492 *max_w = private_output->caps.max_w;
494 *max_h = private_output->caps.max_h;
496 *preferred_align = private_output->caps.preferred_align;
498 pthread_mutex_unlock(&private_display->lock);
504 tdm_output_get_physical_size(tdm_output *output, unsigned int *mmWidth, unsigned int *mmHeight)
508 pthread_mutex_lock(&private_display->lock);
511 *mmWidth = private_output->caps.mmWidth;
513 *mmHeight = private_output->caps.mmHeight;
515 pthread_mutex_unlock(&private_display->lock);
521 tdm_output_get_subpixel(tdm_output *output, unsigned int *subpixel)
524 TDM_RETURN_VAL_IF_FAIL(subpixel != NULL, TDM_ERROR_INVALID_PARAMETER);
526 pthread_mutex_lock(&private_display->lock);
528 *subpixel = private_output->caps.subpixel;
530 pthread_mutex_unlock(&private_display->lock);
536 tdm_output_get_pipe(tdm_output *output, unsigned int *pipe)
539 TDM_RETURN_VAL_IF_FAIL(pipe != NULL, TDM_ERROR_INVALID_PARAMETER);
541 pthread_mutex_lock(&private_display->lock);
543 *pipe = private_output->pipe;
545 pthread_mutex_unlock(&private_display->lock);
552 tdm_output_set_property(tdm_output *output, unsigned int id, tdm_value value)
554 tdm_func_display *func_display;
557 pthread_mutex_lock(&private_display->lock);
559 func_display = &private_display->func_display;
561 if (!func_display->output_set_property)
563 pthread_mutex_unlock(&private_display->lock);
564 return TDM_ERROR_NONE;
567 ret = func_display->output_set_property(private_output->output_backend, id, value);
569 pthread_mutex_unlock(&private_display->lock);
575 tdm_output_get_property(tdm_output *output, unsigned int id, tdm_value *value)
577 tdm_func_display *func_display;
580 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
582 pthread_mutex_lock(&private_display->lock);
584 func_display = &private_display->func_display;
586 if (!func_display->output_get_property)
588 pthread_mutex_unlock(&private_display->lock);
589 return TDM_ERROR_NONE;
592 ret = func_display->output_get_property(private_output->output_backend, id, value);
594 pthread_mutex_unlock(&private_display->lock);
600 _tdm_output_cb_vblank(tdm_output *output_backend, unsigned int sequence,
601 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
603 tdm_private_vblank_handler *vblank_handler = user_data;
604 tdm_private_display *private_display;
606 TDM_RETURN_IF_FAIL(vblank_handler);
608 private_display = vblank_handler->private_output->private_display;
610 if (vblank_handler->func)
612 pthread_mutex_unlock(&private_display->lock);
613 vblank_handler->func(vblank_handler->private_output, sequence,
614 tv_sec, tv_usec, vblank_handler->user_data);
615 pthread_mutex_lock(&private_display->lock);
618 LIST_DEL(&vblank_handler->link);
619 free(vblank_handler);
623 _tdm_output_cb_commit(tdm_output *output_backend, unsigned int sequence,
624 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
626 tdm_private_commit_handler *commit_handler = user_data;
627 tdm_private_display *private_display;
628 tdm_private_output *private_output;
629 tdm_private_layer *private_layer = NULL;
631 TDM_RETURN_IF_FAIL(commit_handler);
633 private_output = commit_handler->private_output;
634 private_display = private_output->private_display;
636 if (commit_handler->func)
638 pthread_mutex_unlock(&private_display->lock);
639 commit_handler->func(private_output, sequence,
640 tv_sec, tv_usec, commit_handler->user_data);
641 pthread_mutex_lock(&private_display->lock);
644 LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link)
646 if (!private_layer->waiting_buffer)
649 if (private_layer->showing_buffer)
651 pthread_mutex_unlock(&private_display->lock);
652 tdm_buffer_unref_backend(private_layer->showing_buffer);
653 pthread_mutex_lock(&private_display->lock);
656 private_layer->showing_buffer = private_layer->waiting_buffer;
657 private_layer->waiting_buffer = NULL;
660 LIST_DEL(&commit_handler->link);
661 free(commit_handler);
665 tdm_output_wait_vblank(tdm_output *output, int interval, int sync,
666 tdm_output_vblank_handler func, void *user_data)
668 tdm_func_display *func_display;
669 tdm_private_vblank_handler *vblank_handler;
672 pthread_mutex_lock(&private_display->lock);
674 func_display = &private_display->func_display;
676 if (!func_display->output_wait_vblank)
678 pthread_mutex_unlock(&private_display->lock);
679 return TDM_ERROR_NONE;
682 vblank_handler = calloc(1, sizeof(tdm_private_vblank_handler));
685 TDM_ERR("failed: alloc memory");
686 pthread_mutex_unlock(&private_display->lock);
687 return TDM_ERROR_OUT_OF_MEMORY;
690 LIST_ADD(&vblank_handler->link, &private_output->vblank_handler_list);
691 vblank_handler->private_output = private_output;
692 vblank_handler->func = func;
693 vblank_handler->user_data = user_data;
695 ret = func_display->output_wait_vblank(private_output->output_backend, interval,
696 sync, vblank_handler);
697 if (ret != TDM_ERROR_NONE)
699 pthread_mutex_unlock(&private_display->lock);
703 if (!private_output->regist_vblank_cb)
705 private_output->regist_vblank_cb = 1;
706 ret = func_display->output_set_vblank_handler(private_output->output_backend,
707 _tdm_output_cb_vblank);
710 pthread_mutex_unlock(&private_display->lock);
716 tdm_output_commit(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
718 tdm_func_display *func_display;
719 tdm_private_commit_handler *commit_handler;
722 pthread_mutex_lock(&private_display->lock);
724 func_display = &private_display->func_display;
726 if (!func_display->output_commit)
728 pthread_mutex_unlock(&private_display->lock);
729 return TDM_ERROR_NONE;
732 commit_handler = calloc(1, sizeof(tdm_private_commit_handler));
735 TDM_ERR("failed: alloc memory");
736 pthread_mutex_unlock(&private_display->lock);
737 return TDM_ERROR_OUT_OF_MEMORY;
740 LIST_ADD(&commit_handler->link, &private_output->commit_handler_list);
741 commit_handler->private_output = private_output;
742 commit_handler->func = func;
743 commit_handler->user_data = user_data;
745 ret = func_display->output_commit(private_output->output_backend, sync, commit_handler);
746 if (ret != TDM_ERROR_NONE)
748 pthread_mutex_unlock(&private_display->lock);
752 if (!private_output->regist_commit_cb)
754 private_output->regist_commit_cb = 1;
755 ret = func_display->output_set_commit_handler(private_output->output_backend,
756 _tdm_output_cb_commit);
759 pthread_mutex_unlock(&private_display->lock);
765 tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode)
767 tdm_func_display *func_display;
770 TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER);
772 pthread_mutex_lock(&private_display->lock);
774 func_display = &private_display->func_display;
776 if (!func_display->output_set_mode)
778 pthread_mutex_unlock(&private_display->lock);
779 return TDM_ERROR_NONE;
782 ret = func_display->output_set_mode(private_output->output_backend, mode);
784 pthread_mutex_unlock(&private_display->lock);
790 tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode)
792 tdm_func_display *func_display;
795 TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER);
797 pthread_mutex_lock(&private_display->lock);
799 func_display = &private_display->func_display;
801 if (!func_display->output_get_mode)
803 pthread_mutex_unlock(&private_display->lock);
804 return TDM_ERROR_NONE;
807 ret = func_display->output_get_mode(private_output->output_backend, mode);
809 pthread_mutex_unlock(&private_display->lock);
815 tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
817 tdm_func_display *func_display;
820 if (dpms_value < TDM_OUTPUT_DPMS_ON)
821 dpms_value = TDM_OUTPUT_DPMS_ON;
822 else if (dpms_value > TDM_OUTPUT_DPMS_OFF)
823 dpms_value = TDM_OUTPUT_DPMS_OFF;
825 pthread_mutex_lock(&private_display->lock);
827 func_display = &private_display->func_display;
829 if (!func_display->output_set_dpms)
831 pthread_mutex_unlock(&private_display->lock);
832 return TDM_ERROR_NONE;
835 ret = func_display->output_set_dpms(private_output->output_backend, dpms_value);
837 pthread_mutex_unlock(&private_display->lock);
843 tdm_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value)
845 tdm_func_display *func_display;
848 TDM_RETURN_VAL_IF_FAIL(dpms_value != NULL, TDM_ERROR_INVALID_PARAMETER);
850 pthread_mutex_lock(&private_display->lock);
852 func_display = &private_display->func_display;
854 if (!func_display->output_get_dpms)
856 pthread_mutex_unlock(&private_display->lock);
857 return TDM_ERROR_NONE;
860 ret = func_display->output_get_dpms(private_output->output_backend, dpms_value);
862 pthread_mutex_unlock(&private_display->lock);
868 tdm_output_create_capture(tdm_output *output, tdm_error *error)
870 tdm_capture *capture = NULL;
872 OUTPUT_FUNC_ENTRY_ERROR();
874 pthread_mutex_lock(&private_display->lock);
876 capture = (tdm_capture*)tdm_capture_create_output_internal(private_output, error);
878 pthread_mutex_unlock(&private_display->lock);
884 tdm_layer_get_capabilities(tdm_layer *layer, tdm_layer_capability *capabilities)
888 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
890 pthread_mutex_lock(&private_display->lock);
892 *capabilities = private_layer->caps.capabilities;
894 pthread_mutex_unlock(&private_display->lock);
900 tdm_layer_get_available_formats(tdm_layer *layer, const tbm_format **formats, int *count)
904 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
905 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
907 pthread_mutex_lock(&private_display->lock);
909 *formats = (const tbm_format*)private_layer->caps.formats;
910 *count = private_layer->caps.format_count;
912 pthread_mutex_unlock(&private_display->lock);
918 tdm_layer_get_available_properties(tdm_layer *layer, const tdm_prop **props, int *count)
922 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
923 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
925 pthread_mutex_lock(&private_display->lock);
927 *props = (const tdm_prop*)private_layer->caps.props;
928 *count = private_layer->caps.prop_count;
930 pthread_mutex_unlock(&private_display->lock);
936 tdm_layer_get_zpos(tdm_layer *layer, unsigned int *zpos)
940 TDM_RETURN_VAL_IF_FAIL(zpos != NULL, TDM_ERROR_INVALID_PARAMETER);
942 pthread_mutex_lock(&private_display->lock);
944 *zpos = private_layer->caps.zpos;
946 pthread_mutex_unlock(&private_display->lock);
952 tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value)
954 tdm_func_display *func_display;
957 pthread_mutex_lock(&private_display->lock);
959 func_display = &private_display->func_display;
961 if (!func_display->layer_set_property)
963 pthread_mutex_unlock(&private_display->lock);
964 return TDM_ERROR_NONE;
967 ret = func_display->layer_set_property(private_layer->layer_backend, id, value);
969 pthread_mutex_unlock(&private_display->lock);
975 tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value)
977 tdm_func_display *func_display;
980 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
982 pthread_mutex_lock(&private_display->lock);
984 func_display = &private_display->func_display;
986 if (!func_display->layer_get_property)
988 pthread_mutex_unlock(&private_display->lock);
989 return TDM_ERROR_NONE;
992 ret = func_display->layer_get_property(private_layer->layer_backend, id, value);
994 pthread_mutex_unlock(&private_display->lock);
1000 tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info)
1002 tdm_func_display *func_display;
1005 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
1007 pthread_mutex_lock(&private_display->lock);
1009 func_display = &private_display->func_display;
1011 private_layer->usable = 0;
1013 if (!func_display->layer_set_info)
1015 pthread_mutex_unlock(&private_display->lock);
1016 return TDM_ERROR_NONE;
1019 ret = func_display->layer_set_info(private_layer->layer_backend, info);
1021 pthread_mutex_unlock(&private_display->lock);
1027 tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info)
1029 tdm_func_display *func_display;
1032 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
1034 pthread_mutex_lock(&private_display->lock);
1036 func_display = &private_display->func_display;
1038 if (!func_display->layer_get_info)
1040 pthread_mutex_unlock(&private_display->lock);
1041 return TDM_ERROR_NONE;
1044 ret = func_display->layer_get_info(private_layer->layer_backend, info);
1046 pthread_mutex_unlock(&private_display->lock);
1052 tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer)
1054 tdm_func_display *func_display;
1057 TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
1059 pthread_mutex_lock(&private_display->lock);
1061 func_display = &private_display->func_display;
1063 private_layer->usable = 0;
1065 if (!func_display->layer_set_buffer)
1067 pthread_mutex_unlock(&private_display->lock);
1068 return TDM_ERROR_NONE;
1071 if (private_layer->waiting_buffer)
1073 pthread_mutex_unlock(&private_display->lock);
1074 tdm_buffer_unref_backend(private_layer->waiting_buffer);
1075 pthread_mutex_lock(&private_display->lock);
1078 private_layer->waiting_buffer = tdm_buffer_ref_backend(buffer);
1080 ret = func_display->layer_set_buffer(private_layer->layer_backend, buffer);
1082 pthread_mutex_unlock(&private_display->lock);
1088 tdm_layer_unset_buffer(tdm_layer *layer)
1090 tdm_func_display *func_display;
1093 pthread_mutex_lock(&private_display->lock);
1095 func_display = &private_display->func_display;
1097 if (private_layer->waiting_buffer)
1099 pthread_mutex_unlock(&private_display->lock);
1100 tdm_buffer_unref_backend(private_layer->waiting_buffer);
1101 pthread_mutex_lock(&private_display->lock);
1102 private_layer->waiting_buffer = NULL;
1105 if (private_layer->showing_buffer)
1107 pthread_mutex_unlock(&private_display->lock);
1108 tdm_buffer_unref_backend(private_layer->showing_buffer);
1109 pthread_mutex_lock(&private_display->lock);
1110 private_layer->showing_buffer = NULL;
1113 private_layer->usable = 1;
1115 if (!func_display->layer_unset_buffer)
1117 pthread_mutex_unlock(&private_display->lock);
1118 return TDM_ERROR_NONE;
1121 ret = func_display->layer_unset_buffer(private_layer->layer_backend);
1123 pthread_mutex_unlock(&private_display->lock);
1129 tdm_layer_is_usable(tdm_layer *layer, unsigned int *usable)
1133 TDM_RETURN_VAL_IF_FAIL(usable != NULL, TDM_ERROR_INVALID_PARAMETER);
1135 pthread_mutex_lock(&private_display->lock);
1137 *usable = private_layer->usable;
1139 pthread_mutex_unlock(&private_display->lock);
1145 tdm_layer_set_video_pos(tdm_layer *layer, int zpos)
1147 tdm_func_display *func_display;
1150 pthread_mutex_lock(&private_display->lock);
1152 func_display = &private_display->func_display;
1154 if (!(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO))
1156 TDM_ERR("layer is not video layer");
1157 pthread_mutex_unlock(&private_display->lock);
1158 return TDM_ERROR_INVALID_PARAMETER;
1161 if (!func_display->layer_set_video_pos)
1163 pthread_mutex_unlock(&private_display->lock);
1164 return TDM_ERROR_NONE;
1167 ret = func_display->layer_set_video_pos(private_layer->layer_backend, zpos);
1169 pthread_mutex_unlock(&private_display->lock);
1175 tdm_layer_create_capture(tdm_layer *layer, tdm_error *error)
1177 tdm_capture *capture = NULL;
1179 LAYER_FUNC_ENTRY_ERROR();
1181 pthread_mutex_lock(&private_display->lock);
1183 capture = (tdm_capture*)tdm_capture_create_layer_internal(private_layer, error);
1185 pthread_mutex_unlock(&private_display->lock);