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 *capabilities = private_display->caps_pp.capabilities;
121 pthread_mutex_unlock(&private_display->lock);
127 tdm_display_get_pp_available_formats(tdm_display *dpy, const tbm_format **formats, int *count)
129 DISPLAY_FUNC_ENTRY();
131 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
132 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
134 pthread_mutex_lock(&private_display->lock);
136 *formats = (const tbm_format*)private_display->caps_pp.formats;
137 *count = private_display->caps_pp.format_count;
139 pthread_mutex_unlock(&private_display->lock);
145 tdm_display_get_pp_available_size(tdm_display *dpy, int *min_w, int *min_h,
146 int *max_w, int *max_h, int *preferred_align)
148 DISPLAY_FUNC_ENTRY();
150 pthread_mutex_lock(&private_display->lock);
153 *min_w = private_display->caps_pp.min_w;
155 *min_h = private_display->caps_pp.min_h;
157 *max_w = private_display->caps_pp.max_w;
159 *max_h = private_display->caps_pp.max_h;
161 *preferred_align = private_display->caps_pp.preferred_align;
163 pthread_mutex_unlock(&private_display->lock);
169 tdm_display_get_capture_capabilities(tdm_display *dpy, tdm_capture_capability *capabilities)
171 DISPLAY_FUNC_ENTRY();
173 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
175 pthread_mutex_lock(&private_display->lock);
177 *capabilities = private_display->caps_capture.capabilities;
179 pthread_mutex_unlock(&private_display->lock);
185 tdm_display_get_catpure_available_formats(tdm_display *dpy, const tbm_format **formats, int *count)
187 DISPLAY_FUNC_ENTRY();
189 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
190 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
192 pthread_mutex_lock(&private_display->lock);
194 *formats = (const tbm_format*)private_display->caps_capture.formats;
195 *count = private_display->caps_capture.format_count;
197 pthread_mutex_unlock(&private_display->lock);
203 tdm_display_get_output_count(tdm_display *dpy, int *count)
205 tdm_private_output *private_output = NULL;
207 DISPLAY_FUNC_ENTRY();
209 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
211 pthread_mutex_lock(&private_display->lock);
214 LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link)
219 pthread_mutex_unlock(&private_display->lock);
220 return TDM_ERROR_NONE;
223 pthread_mutex_unlock(&private_display->lock);
229 EXTERN const tdm_output*
230 tdm_display_get_output(tdm_display *dpy, int index, tdm_error *error)
232 tdm_private_output *private_output = NULL;
235 DISPLAY_FUNC_ENTRY_ERROR();
237 pthread_mutex_lock(&private_display->lock);
240 *error = TDM_ERROR_NONE;
243 LIST_FOR_EACH_ENTRY(private_output, &private_display->output_list, link)
247 pthread_mutex_unlock(&private_display->lock);
248 return (const tdm_output*)private_output;
253 pthread_mutex_unlock(&private_display->lock);
259 tdm_display_get_fd(tdm_display *dpy, int *fd)
261 tdm_func_display *func_display;
262 DISPLAY_FUNC_ENTRY();
264 TDM_RETURN_VAL_IF_FAIL(fd != NULL, TDM_ERROR_INVALID_PARAMETER);
266 pthread_mutex_lock(&private_display->lock);
268 func_display = &private_display->func_display;
270 if (!func_display->display_get_fd)
272 pthread_mutex_unlock(&private_display->lock);
273 return TDM_ERROR_NONE;
276 ret = func_display->display_get_fd(private_display->bdata, fd);
278 pthread_mutex_unlock(&private_display->lock);
284 tdm_display_handle_events(tdm_display *dpy)
286 tdm_func_display *func_display;
287 DISPLAY_FUNC_ENTRY();
289 pthread_mutex_lock(&private_display->lock);
291 func_display = &private_display->func_display;
293 if (!func_display->display_handle_events)
295 pthread_mutex_unlock(&private_display->lock);
296 return TDM_ERROR_NONE;
299 ret = func_display->display_handle_events(private_display->bdata);
301 pthread_mutex_unlock(&private_display->lock);
307 tdm_display_create_pp(tdm_display *dpy, tdm_error *error)
311 DISPLAY_FUNC_ENTRY_ERROR();
313 pthread_mutex_lock(&private_display->lock);
315 pp = (tdm_pp*)tdm_pp_create_internal(private_display, error);
317 pthread_mutex_unlock(&private_display->lock);
323 tdm_output_get_conn_status(tdm_output *output, tdm_output_conn_status *status)
327 TDM_RETURN_VAL_IF_FAIL(status != NULL, TDM_ERROR_INVALID_PARAMETER);
329 pthread_mutex_lock(&private_display->lock);
331 *status = private_output->caps.status;
333 pthread_mutex_unlock(&private_display->lock);
339 tdm_output_get_output_type(tdm_output *output, tdm_output_type *type)
343 TDM_RETURN_VAL_IF_FAIL(type != NULL, TDM_ERROR_INVALID_PARAMETER);
345 pthread_mutex_lock(&private_display->lock);
347 *type = private_output->caps.type;
349 pthread_mutex_unlock(&private_display->lock);
355 tdm_output_get_layer_count(tdm_output *output, int *count)
357 tdm_private_layer *private_layer = NULL;
361 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
363 pthread_mutex_lock(&private_display->lock);
366 LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link)
370 pthread_mutex_unlock(&private_display->lock);
371 return TDM_ERROR_NONE;
374 pthread_mutex_unlock(&private_display->lock);
380 EXTERN const tdm_layer*
381 tdm_output_get_layer(tdm_output *output, int index, tdm_error *error)
383 tdm_private_layer *private_layer = NULL;
386 OUTPUT_FUNC_ENTRY_ERROR();
388 pthread_mutex_lock(&private_display->lock);
391 *error = TDM_ERROR_NONE;
393 LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link)
397 pthread_mutex_unlock(&private_display->lock);
398 return private_layer;
403 pthread_mutex_unlock(&private_display->lock);
409 tdm_output_get_available_properties(tdm_output *output, const tdm_prop **props, int *count)
413 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
414 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
416 pthread_mutex_lock(&private_display->lock);
418 *props = (const tdm_prop*)private_output->caps.props;
419 *count = private_output->caps.prop_count;
421 pthread_mutex_unlock(&private_display->lock);
427 tdm_output_get_available_modes(tdm_output *output, const tdm_output_mode **modes, int *count)
431 TDM_RETURN_VAL_IF_FAIL(modes != NULL, TDM_ERROR_INVALID_PARAMETER);
432 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
434 pthread_mutex_lock(&private_display->lock);
436 *modes = (const tdm_output_mode*)private_output->caps.modes;
437 *count = private_output->caps.mode_count;
439 pthread_mutex_unlock(&private_display->lock);
445 tdm_output_get_available_size(tdm_output *output, int *min_w, int *min_h,
446 int *max_w, int *max_h, int *preferred_align)
450 pthread_mutex_lock(&private_display->lock);
453 *min_w = private_output->caps.min_w;
455 *min_h = private_output->caps.min_h;
457 *max_w = private_output->caps.max_w;
459 *max_h = private_output->caps.max_h;
461 *preferred_align = private_output->caps.preferred_align;
463 pthread_mutex_unlock(&private_display->lock);
469 tdm_output_get_physical_size(tdm_output *output, unsigned int *mmWidth, unsigned int *mmHeight)
473 pthread_mutex_lock(&private_display->lock);
476 *mmWidth = private_output->caps.mmWidth;
478 *mmHeight = private_output->caps.mmHeight;
480 pthread_mutex_unlock(&private_display->lock);
486 tdm_output_get_subpixel(tdm_output *output, unsigned int *subpixel)
489 TDM_RETURN_VAL_IF_FAIL(subpixel != NULL, TDM_ERROR_INVALID_PARAMETER);
491 pthread_mutex_lock(&private_display->lock);
493 *subpixel = private_output->caps.subpixel;
495 pthread_mutex_unlock(&private_display->lock);
501 tdm_output_get_pipe(tdm_output *output, unsigned int *pipe)
504 TDM_RETURN_VAL_IF_FAIL(pipe != NULL, TDM_ERROR_INVALID_PARAMETER);
506 pthread_mutex_lock(&private_display->lock);
508 *pipe = private_output->pipe;
510 pthread_mutex_unlock(&private_display->lock);
517 tdm_output_set_property(tdm_output *output, unsigned int id, tdm_value value)
519 tdm_func_display *func_display;
522 pthread_mutex_lock(&private_display->lock);
524 func_display = &private_display->func_display;
526 if (!func_display->output_set_property)
528 pthread_mutex_unlock(&private_display->lock);
529 return TDM_ERROR_NONE;
532 ret = func_display->output_set_property(private_output->output_backend, id, value);
534 pthread_mutex_unlock(&private_display->lock);
540 tdm_output_get_property(tdm_output *output, unsigned int id, tdm_value *value)
542 tdm_func_display *func_display;
545 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
547 pthread_mutex_lock(&private_display->lock);
549 func_display = &private_display->func_display;
551 if (!func_display->output_get_property)
553 pthread_mutex_unlock(&private_display->lock);
554 return TDM_ERROR_NONE;
557 ret = func_display->output_get_property(private_output->output_backend, id, value);
559 pthread_mutex_unlock(&private_display->lock);
565 _tdm_output_cb_vblank(tdm_output *output_backend, unsigned int sequence,
566 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
568 tdm_private_vblank_handler *vblank_handler = user_data;
569 tdm_private_display *private_display;
571 TDM_RETURN_IF_FAIL(vblank_handler);
573 private_display = vblank_handler->private_output->private_display;
575 pthread_mutex_unlock(&private_display->lock);
577 if (vblank_handler->func)
578 vblank_handler->func(vblank_handler->private_output, sequence,
579 tv_sec, tv_usec, vblank_handler->user_data);
581 pthread_mutex_lock(&private_display->lock);
583 LIST_DEL(&vblank_handler->link);
584 free(vblank_handler);
588 _tdm_output_cb_commit(tdm_output *output_backend, unsigned int sequence,
589 unsigned int tv_sec, unsigned int tv_usec, void *user_data)
591 tdm_private_commit_handler *commit_handler = user_data;
592 tdm_private_display *private_display;
594 TDM_RETURN_IF_FAIL(commit_handler);
596 private_display = commit_handler->private_output->private_display;
598 pthread_mutex_unlock(&private_display->lock);
600 if (commit_handler->func)
601 commit_handler->func(commit_handler->private_output, sequence,
602 tv_sec, tv_usec, commit_handler->user_data);
604 pthread_mutex_lock(&private_display->lock);
606 LIST_DEL(&commit_handler->link);
607 free(commit_handler);
611 tdm_output_wait_vblank(tdm_output *output, int interval, int sync,
612 tdm_output_vblank_handler func, void *user_data)
614 tdm_func_display *func_display;
615 tdm_private_vblank_handler *vblank_handler;
618 pthread_mutex_lock(&private_display->lock);
620 func_display = &private_display->func_display;
622 if (!func_display->output_wait_vblank)
624 pthread_mutex_unlock(&private_display->lock);
625 return TDM_ERROR_NONE;
628 vblank_handler = calloc(1, sizeof(tdm_private_vblank_handler));
631 TDM_ERR("failed: alloc memory");
632 pthread_mutex_unlock(&private_display->lock);
633 return TDM_ERROR_OUT_OF_MEMORY;
636 LIST_ADD(&vblank_handler->link, &private_output->vblank_handler_list);
637 vblank_handler->private_output = private_output;
638 vblank_handler->func = func;
639 vblank_handler->user_data = user_data;
641 ret = func_display->output_wait_vblank(private_output->output_backend, interval,
642 sync, vblank_handler);
643 if (ret != TDM_ERROR_NONE)
645 pthread_mutex_unlock(&private_display->lock);
649 if (!private_output->regist_vblank_cb)
651 private_output->regist_vblank_cb = 1;
652 ret = func_display->output_set_vblank_handler(private_output->output_backend,
653 _tdm_output_cb_vblank);
656 pthread_mutex_unlock(&private_display->lock);
662 tdm_output_commit(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
664 tdm_func_display *func_display;
665 tdm_private_commit_handler *commit_handler;
668 pthread_mutex_lock(&private_display->lock);
670 func_display = &private_display->func_display;
672 if (!func_display->output_commit)
674 pthread_mutex_unlock(&private_display->lock);
675 return TDM_ERROR_NONE;
678 commit_handler = calloc(1, sizeof(tdm_private_commit_handler));
681 TDM_ERR("failed: alloc memory");
682 pthread_mutex_unlock(&private_display->lock);
683 return TDM_ERROR_OUT_OF_MEMORY;
686 LIST_ADD(&commit_handler->link, &private_output->commit_handler_list);
687 commit_handler->private_output = private_output;
688 commit_handler->func = func;
689 commit_handler->user_data = user_data;
691 ret = func_display->output_commit(private_output->output_backend, sync, commit_handler);
692 if (ret != TDM_ERROR_NONE)
694 pthread_mutex_unlock(&private_display->lock);
698 if (!private_output->regist_commit_cb)
700 private_output->regist_commit_cb = 1;
701 ret = func_display->output_set_commit_handler(private_output->output_backend,
702 _tdm_output_cb_commit);
705 pthread_mutex_unlock(&private_display->lock);
711 tdm_output_set_mode(tdm_output *output, tdm_output_mode *mode)
713 tdm_func_display *func_display;
716 TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER);
718 pthread_mutex_lock(&private_display->lock);
720 func_display = &private_display->func_display;
722 if (!func_display->output_set_mode)
724 pthread_mutex_unlock(&private_display->lock);
725 return TDM_ERROR_NONE;
728 ret = func_display->output_set_mode(private_output->output_backend, mode);
730 pthread_mutex_unlock(&private_display->lock);
736 tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode)
738 tdm_func_display *func_display;
741 TDM_RETURN_VAL_IF_FAIL(mode != NULL, TDM_ERROR_INVALID_PARAMETER);
743 pthread_mutex_lock(&private_display->lock);
745 func_display = &private_display->func_display;
747 if (!func_display->output_get_mode)
749 pthread_mutex_unlock(&private_display->lock);
750 return TDM_ERROR_NONE;
753 ret = func_display->output_get_mode(private_output->output_backend, mode);
755 pthread_mutex_unlock(&private_display->lock);
761 tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value)
763 tdm_func_display *func_display;
766 TDM_RETURN_VAL_IF_FAIL(dpms_value >= TDM_OUTPUT_DPMS_ON, TDM_ERROR_INVALID_PARAMETER);
767 TDM_RETURN_VAL_IF_FAIL(dpms_value < TDM_OUTPUT_DPMS_MAX, TDM_ERROR_INVALID_PARAMETER);
769 pthread_mutex_lock(&private_display->lock);
771 func_display = &private_display->func_display;
773 if (!func_display->output_set_dpms)
775 pthread_mutex_unlock(&private_display->lock);
776 return TDM_ERROR_NONE;
779 ret = func_display->output_set_dpms(private_output->output_backend, dpms_value);
781 pthread_mutex_unlock(&private_display->lock);
787 tdm_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value)
789 tdm_func_display *func_display;
792 TDM_RETURN_VAL_IF_FAIL(dpms_value != NULL, TDM_ERROR_INVALID_PARAMETER);
794 pthread_mutex_lock(&private_display->lock);
796 func_display = &private_display->func_display;
798 if (!func_display->output_get_dpms)
800 pthread_mutex_unlock(&private_display->lock);
801 return TDM_ERROR_NONE;
804 ret = func_display->output_get_dpms(private_output->output_backend, dpms_value);
806 pthread_mutex_unlock(&private_display->lock);
812 tdm_output_create_capture(tdm_output *output, tdm_error *error)
814 tdm_capture *capture = NULL;
816 OUTPUT_FUNC_ENTRY_ERROR();
818 pthread_mutex_lock(&private_display->lock);
820 capture = (tdm_capture*)tdm_capture_create_output_internal(private_output, error);
822 pthread_mutex_unlock(&private_display->lock);
828 tdm_layer_get_capabilities(tdm_layer *layer, tdm_layer_capability *capabilities)
832 TDM_RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
834 pthread_mutex_lock(&private_display->lock);
836 *capabilities = private_layer->caps.capabilities;
838 pthread_mutex_unlock(&private_display->lock);
844 tdm_layer_get_available_formats(tdm_layer *layer, const tbm_format **formats, int *count)
848 TDM_RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
849 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
851 pthread_mutex_lock(&private_display->lock);
853 *formats = (const tbm_format*)private_layer->caps.formats;
854 *count = private_layer->caps.format_count;
856 pthread_mutex_unlock(&private_display->lock);
862 tdm_layer_get_available_properties(tdm_layer *layer, const tdm_prop **props, int *count)
866 TDM_RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
867 TDM_RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
869 pthread_mutex_lock(&private_display->lock);
871 *props = (const tdm_prop*)private_layer->caps.props;
872 *count = private_layer->caps.prop_count;
874 pthread_mutex_unlock(&private_display->lock);
880 tdm_layer_get_zpos(tdm_layer *layer, unsigned int *zpos)
884 TDM_RETURN_VAL_IF_FAIL(zpos != NULL, TDM_ERROR_INVALID_PARAMETER);
886 pthread_mutex_lock(&private_display->lock);
888 *zpos = private_layer->caps.zpos;
890 pthread_mutex_unlock(&private_display->lock);
896 tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value)
898 tdm_func_display *func_display;
901 pthread_mutex_lock(&private_display->lock);
903 func_display = &private_display->func_display;
905 if (!func_display->layer_set_property)
907 pthread_mutex_unlock(&private_display->lock);
908 return TDM_ERROR_NONE;
911 ret = func_display->layer_set_property(private_layer->layer_backend, id, value);
913 pthread_mutex_unlock(&private_display->lock);
919 tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value)
921 tdm_func_display *func_display;
924 TDM_RETURN_VAL_IF_FAIL(value != NULL, TDM_ERROR_INVALID_PARAMETER);
926 pthread_mutex_lock(&private_display->lock);
928 func_display = &private_display->func_display;
930 if (!func_display->layer_get_property)
932 pthread_mutex_unlock(&private_display->lock);
933 return TDM_ERROR_NONE;
936 ret = func_display->layer_get_property(private_layer->layer_backend, id, value);
938 pthread_mutex_unlock(&private_display->lock);
944 tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info)
946 tdm_func_display *func_display;
949 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
951 pthread_mutex_lock(&private_display->lock);
953 func_display = &private_display->func_display;
955 private_layer->usable = 0;
957 if (!func_display->layer_set_info)
959 pthread_mutex_unlock(&private_display->lock);
960 return TDM_ERROR_NONE;
963 ret = func_display->layer_set_info(private_layer->layer_backend, info);
965 pthread_mutex_unlock(&private_display->lock);
971 tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info)
973 tdm_func_display *func_display;
976 TDM_RETURN_VAL_IF_FAIL(info != NULL, TDM_ERROR_INVALID_PARAMETER);
978 pthread_mutex_lock(&private_display->lock);
980 func_display = &private_display->func_display;
982 if (!func_display->layer_get_info)
984 pthread_mutex_unlock(&private_display->lock);
985 return TDM_ERROR_NONE;
988 ret = func_display->layer_get_info(private_layer->layer_backend, info);
990 pthread_mutex_unlock(&private_display->lock);
996 tdm_layer_set_buffer(tdm_layer *layer, tdm_buffer *buffer)
998 tdm_func_display *func_display;
1001 TDM_RETURN_VAL_IF_FAIL(buffer != NULL, TDM_ERROR_INVALID_PARAMETER);
1003 pthread_mutex_lock(&private_display->lock);
1005 func_display = &private_display->func_display;
1007 private_layer->usable = 0;
1009 if (!func_display->layer_set_buffer)
1011 pthread_mutex_unlock(&private_display->lock);
1012 return TDM_ERROR_NONE;
1015 if (private_layer->current_buffer)
1017 /* TODO: need to unref after next buffer is showing on screen */
1018 tdm_buffer_unref_backend(private_layer->current_buffer);
1019 tdm_buffer_unref(private_layer->current_buffer);
1022 private_layer->current_buffer = tdm_buffer_ref(buffer, NULL);
1023 tdm_buffer_ref_backend(buffer);
1025 ret = func_display->layer_set_buffer(private_layer->layer_backend,
1026 tdm_buffer_get_surface(buffer));
1028 pthread_mutex_unlock(&private_display->lock);
1034 tdm_layer_unset_buffer(tdm_layer *layer)
1036 tdm_func_display *func_display;
1039 pthread_mutex_lock(&private_display->lock);
1041 func_display = &private_display->func_display;
1043 if (private_layer->current_buffer)
1045 tdm_buffer_unref(private_layer->current_buffer);
1046 tdm_buffer_unref_backend(private_layer->current_buffer);
1047 private_layer->current_buffer = NULL;
1050 private_layer->usable = 1;
1052 if (!func_display->layer_unset_buffer)
1054 pthread_mutex_unlock(&private_display->lock);
1055 return TDM_ERROR_NONE;
1058 ret = func_display->layer_unset_buffer(private_layer->layer_backend);
1060 pthread_mutex_unlock(&private_display->lock);
1066 tdm_layer_is_usable(tdm_layer *layer, unsigned int *usable)
1070 TDM_RETURN_VAL_IF_FAIL(usable != NULL, TDM_ERROR_INVALID_PARAMETER);
1072 pthread_mutex_lock(&private_display->lock);
1074 *usable = private_layer->usable;
1076 pthread_mutex_unlock(&private_display->lock);
1083 tdm_layer_create_capture(tdm_layer *layer, tdm_error *error)
1085 tdm_capture *capture = NULL;
1087 LAYER_FUNC_ENTRY_ERROR();
1089 pthread_mutex_lock(&private_display->lock);
1091 capture = (tdm_capture*)tdm_capture_create_layer_internal(private_layer, error);
1093 pthread_mutex_unlock(&private_display->lock);