modify doxygen
[platform/core/uifw/libtdm.git] / include / tdm.h
1 /**************************************************************************
2
3 libtdm
4
5 Copyright 2015 Samsung Electronics co., Ltd. All Rights Reserved.
6
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>
13
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:
21
22 The above copyright notice and this permission notice (including the
23 next paragraph) shall be included in all copies or substantial portions
24 of the Software.
25
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.
33
34 **************************************************************************/
35
36 #ifndef _TDM_H_
37 #define _TDM_H_
38
39 #include <stdint.h>
40 #include <tbm_surface.h>
41 #include <tbm_surface_internal.h>
42
43 #include "tdm_types.h"
44
45 #ifdef __cplusplus
46 extern "C" {
47 #endif
48
49 /**
50  * @file tdm.h
51  * @brief The header file for a frontend user.
52  * @par Example
53  * @code
54    #include <tdm.h>    //for a frontend user
55  * @endcode
56  */
57
58 /**
59  * @brief The display capability enumeration
60  */
61 typedef enum
62 {
63     TDM_DISPLAY_CAPABILITY_PP       = (1<<0),   /**< if hardware supports pp operation */
64     TDM_DISPLAY_CAPABILITY_CAPTURE  = (1<<1),   /**< if hardware supports capture operation */
65 } tdm_display_capability;
66
67 /**
68  * @brief Initialize a display object
69  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
70  * @return A display object
71  * @see tdm_display_deinit
72  */
73 tdm_display* tdm_display_init(tdm_error *error);
74
75 /**
76  * @brief Deinitialize a display object
77  * @param[in] dpy A display object
78  * @see tdm_display_init
79  */
80 void         tdm_display_deinit(tdm_display *dpy);
81
82 /**
83  * @brief Update a display object
84  * @details
85  * When new output is connected, a frontend user need to call this function.
86  * And a frontend user can the new output information with tdm_output_get_xxx functions.
87  * @param[in] dpy A display object
88  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
89  */
90 tdm_error    tdm_display_update(tdm_display *dpy);
91
92 /**
93  * @brief Get the file descriptor
94  * @details TDM handles the events of fd with #tdm_display_handle_events.
95  * @param[in] dpy A display object
96  * @param[out] fd The file descriptor
97  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
98  * @see tdm_display_handle_events
99  */
100 tdm_error    tdm_display_get_fd(tdm_display *dpy, int *fd);
101
102 /**
103  * @brief Handle the events
104  * @param[in] dpy A display object
105  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
106  * @see tdm_display_get_fd
107  */
108 tdm_error    tdm_display_handle_events(tdm_display *dpy);
109
110 /**
111  * @brief Get the capabilities of a display object.
112  * @details A frontend user can get whether TDM supports pp/capture functionality with this function.
113  * @param[in] dpy A display object
114  * @param[out] capabilities The capabilities of a display object
115  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
116  */
117 tdm_error    tdm_display_get_capabilities(tdm_display *dpy, tdm_display_capability *capabilities);
118
119 /**
120  * @brief Get the pp capabilities of a display object.
121  * @param[in] dpy A display object
122  * @param[out] capabilities The pp capabilities
123  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
124  */
125 tdm_error    tdm_display_get_pp_capabilities(tdm_display *dpy, tdm_pp_capability *capabilities);
126
127 /**
128  * @brief Get the pp available format array of a display object.
129  * @param[in] dpy A display object
130  * @param[out] formats The pp available format array
131  * @param[out] count The count of formats
132  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
133  */
134 tdm_error    tdm_display_get_pp_available_formats(tdm_display *dpy, const tbm_format **formats, int *count);
135
136 /**
137  * @brief Get the pp available size of a display object.
138  * @details -1 means that a TDM backend module doesn't define the value.
139  * @param[in] dpy A display object
140  * @param[out] min_w The minimum width which TDM can handle
141  * @param[out] min_h The minimum height which TDM can handle
142  * @param[out] max_w The maximum width which TDM can handle
143  * @param[out] max_h The maximum height which TDM can handle
144  * @param[out] preferred_align The preferred align width which TDM can handle
145  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
146  */
147 tdm_error    tdm_display_get_pp_available_size(tdm_display *dpy, int *min_w, int *min_h, int *max_w, int *max_h, int *preferred_align);
148
149 /**
150  * @brief Get the capture capabilities of a display object.
151  * @param[in] dpy A display object
152  * @param[out] capabilities The capture capabilities
153  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
154  */
155 tdm_error    tdm_display_get_capture_capabilities(tdm_display *dpy, tdm_capture_capability *capabilities);
156
157 /**
158  * @brief Get the capture available format array of a display object.
159  * @param[in] dpy A display object
160  * @param[out] formats The capture available format array
161  * @param[out] count The count of formats
162  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
163  */
164 tdm_error    tdm_display_get_catpure_available_formats(tdm_display *dpy, const tbm_format **formats, int *count);
165
166 /**
167  * @brief Get the output counts which a display object has.
168  * @param[in] dpy A display object
169  * @param[out] count The count of outputs
170  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
171  * @see tdm_display_get_output
172  */
173 tdm_error    tdm_display_get_output_count(tdm_display *dpy, int *count);
174
175 /**
176  * @brief Get a output object which has the given index.
177  * @param[in] dpy A display object
178  * @param[in] index The index of a output object
179  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
180  * @return A output object if success. Otherwise, NULL.
181  * @see tdm_display_get_output_count
182  */
183 tdm_output*  tdm_display_get_output(tdm_display *dpy, int index, tdm_error *error);
184
185 /**
186  * @brief Create a pp object.
187  * @param[in] dpy A display object
188  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
189  * @return A pp object if success. Otherwise, NULL.
190  * @see tdm_pp_destroy
191  */
192 tdm_pp*      tdm_display_create_pp(tdm_display *dpy, tdm_error *error);
193
194 /**
195  * @brief Get the connection status of a output object.
196  * @param[in] output A output object
197  * @param[out] status The connection status.
198  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
199  */
200 tdm_error    tdm_output_get_conn_status(tdm_output *output, tdm_output_conn_status *status);
201
202 /**
203  * @brief Get the connection type of a output object.
204  * @param[in] output A output object
205  * @param[out] type The connection type.
206  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
207  */
208 tdm_error    tdm_output_get_output_type(tdm_output *output, tdm_output_type *type);
209
210 /**
211  * @brief Get the layer counts which a output object has.
212  * @param[in] output A output object
213  * @param[out] count The count of layers
214  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
215  * @see tdm_output_get_layer
216  */
217 tdm_error    tdm_output_get_layer_count(tdm_output *output, int *count);
218
219 /**
220  * @brief Get a layer object which has the given index.
221  * @param[in] output A output object
222  * @param[in] index The index of a layer object
223  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
224  * @return A layer object if success. Otherwise, NULL.
225  * @see tdm_output_get_layer_count
226  */
227 tdm_layer*   tdm_output_get_layer(tdm_output *output, int index, tdm_error *error);
228
229 /**
230  * @brief Get the available property array of a output object.
231  * @param[in] output A output object
232  * @param[out] props The available property array
233  * @param[out] count The count of properties
234  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
235  */
236 tdm_error    tdm_output_get_available_properties(tdm_output *output, const tdm_prop **props, int *count);
237
238 /**
239  * @brief Get the available mode array of a output object.
240  * @param[in] output A output object
241  * @param[out] modes The available mode array
242  * @param[out] count The count of modes
243  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
244  */
245 tdm_error    tdm_output_get_available_modes(tdm_output *output, const tdm_output_mode **modes, int *count);
246
247 /**
248  * @brief Get the available size of a output object.
249  * @details -1 means that a TDM backend module doesn't define the value.
250  * @param[in] output A output object
251  * @param[out] min_w The minimum width which TDM can handle
252  * @param[out] min_h The minimum height which TDM can handle
253  * @param[out] max_w The maximum width which TDM can handle
254  * @param[out] max_h The maximum height which TDM can handle
255  * @param[out] preferred_align The preferred align width which TDM can handle
256  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
257  */
258 tdm_error    tdm_output_get_available_size(tdm_output *output, int *min_w, int *min_h, int *max_w, int *max_h, int *preferred_align);
259
260 /**
261  * @brief Get the physical size of a output object.
262  * @param[in] output A output object
263  * @param[out] mmWidth The milimeter width
264  * @param[out] mmHeight The milimeter height
265  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
266  */
267 tdm_error    tdm_output_get_physical_size(tdm_output *output, unsigned int *mmWidth, unsigned int *mmHeight);
268
269 /**
270  * @brief Get the subpixel of a output object.
271  * @param[in] output A output object
272  * @param[out] subpixel The subpixel
273  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
274  */
275 tdm_error    tdm_output_get_subpixel(tdm_output *output, unsigned int *subpixel);
276
277 /**
278  * @brief Get the pipe of a output object.
279  * @param[in] output A output object
280  * @param[out] pipe The pipe
281  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
282  */
283 tdm_error    tdm_output_get_pipe(tdm_output *output, unsigned int *pipe);
284
285 /**
286  * @brief Set the property which has a given id.
287  * @param[in] output A output object
288  * @param[in] id The property id
289  * @param[in] value The value
290  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
291  */
292 tdm_error    tdm_output_set_property(tdm_output *output, unsigned int id, tdm_value value);
293
294 /**
295  * @brief Get the property which has a given id
296  * @param[in] output A output object
297  * @param[in] id The property id
298  * @param[out] value The value
299  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
300  */
301 tdm_error    tdm_output_get_property(tdm_output *output, unsigned int id, tdm_value *value);
302
303 /**
304  * @brief Wait for VBLANK
305  * @details After interval vblanks, a user vblank handler will be called.
306  * @param[in] output A output object
307  * @param[in] interval vblank interval
308  * @param[in] sync 0: asynchronous, 1:synchronous
309  * @param[in] func A user vblank handler
310  * @param[in] user_data The user data
311  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
312  * @see #tdm_output_vblank_handler
313  */
314 tdm_error    tdm_output_wait_vblank(tdm_output *output, int interval, int sync, tdm_output_vblank_handler func, void *user_data);
315
316 /**
317  * @brief Commit changes for a output object
318  * @details After all change of a output object are applied, a user commit handler
319  * will be called.
320  * @param[in] output A output object
321  * @param[in] sync 0: asynchronous, 1:synchronous
322  * @param[in] func A user commit handler
323  * @param[in] user_data The user data
324  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
325  */
326 tdm_error    tdm_output_commit(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data);
327
328 /**
329  * @brief Set one of available modes of a output object
330  * @param[in] output A output object
331  * @param[in] mode A output mode
332  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
333  */
334 tdm_error    tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode);
335
336 /**
337  * @brief Get the mode of a output object
338  * @param[in] output A output object
339  * @param[out] mode A output mode
340  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
341  */
342 tdm_error    tdm_output_get_mode(tdm_output *output, const tdm_output_mode **mode);
343
344 /**
345  * @brief Set DPMS of a output object
346  * @param[in] output A output object
347  * @param[in] dpms_value DPMS value
348  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
349  */
350 tdm_error    tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value);
351
352 /**
353  * @brief Get DPMS of a output object
354  * @param[in] output A output object
355  * @param[out] dpms_value DPMS value
356  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
357  */
358 tdm_error    tdm_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value);
359
360 /**
361  * @brief Create a capture object of a output object
362  * @param[in] output A output object
363  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
364  * @return A capture object
365  * @see tdm_capture_destroy
366  */
367 tdm_capture *tdm_output_create_capture(tdm_output *output, tdm_error *error);
368
369 /**
370  * @brief Get the capabilities of a layer object.
371  * @param[in] layer A layer object
372  * @param[out] capabilities The capabilities of a layer object
373  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
374  */
375 tdm_error    tdm_layer_get_capabilities(tdm_layer *layer, tdm_layer_capability *capabilities);
376
377 /**
378  * @brief Get the available format array of a layer object.
379  * @param[in] layer A layer object
380  * @param[out] formats The available format array
381  * @param[out] count The count of formats
382  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
383  */
384 tdm_error    tdm_layer_get_available_formats(tdm_layer *layer, const tbm_format **formats, int *count);
385
386 /**
387  * @brief Get the available property array of a layer object.
388  * @param[in] layer A layer object
389  * @param[out] props The available property array
390  * @param[out] count The count of properties
391  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
392  */
393 tdm_error    tdm_layer_get_available_properties(tdm_layer *layer, const tdm_prop **props, int *count);
394
395 /**
396  * @brief Get the zpos of a layer object.
397  * @details
398  * - GRAPHIC layers have fixed zpos. It starts from 0. It's @b non-changeable.
399  * - But the zpos of VIDEO layers will be decided by a backend module side.
400  * - A frontend user only can set the relative zpos to VIDEO layers via #tdm_layer_set_video_pos
401  * - The zpos of video layers is less than GRAPHIC layers or more than GRAPHIC
402  * layers. ie, ..., -2, -1, 4, 5, ... (if 0 <= GRAPHIC layer's zpos < 4).
403  * @param[in] layer A layer object
404  * @param[out] zpos The zpos
405  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
406  * @see tdm_layer_set_video_pos, tdm_layer_capability
407  */
408 tdm_error    tdm_layer_get_zpos(tdm_layer *layer, unsigned int *zpos);
409
410 /**
411  * @brief Set the property which has a given id.
412  * @param[in] layer A layer object
413  * @param[in] id The property id
414  * @param[in] value The value
415  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
416  */
417 tdm_error    tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value);
418
419 /**
420  * @brief Get the property which has a given id.
421  * @param[in] layer A layer object
422  * @param[in] id The property id
423  * @param[out] value The value
424  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
425  */
426 tdm_error    tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value);
427
428 /**
429  * @brief Set the geometry information to a layer object
430  * @details The geometry information will be applied when the output object
431  * of a layer object is committed.
432  * @param[in] layer A layer object
433  * @param[in] info The geometry information
434  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
435  * @see tdm_output_commit
436  */
437 tdm_error    tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
438
439 /**
440  * @brief Get the geometry information to a layer object
441  * @param[in] layer A layer object
442  * @param[out] info The geometry information
443  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
444  */
445 tdm_error    tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
446
447 /**
448  * @brief Set a TDM buffer to a layer object
449  * @details A TDM buffer will be applied when the output object
450  * of a layer object is committed.
451  * @param[in] layer A layer object
452  * @param[in] buffer A TDM buffer
453  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
454  * @see tdm_output_commit
455  */
456 tdm_error    tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
457
458 /**
459  * @brief Unset a TDM buffer from a layer object
460  * @details When this function is called, a current showing buffer will be
461  * disappeared from screen. Then nothing is showing on a layer object.
462  * @param[in] layer A layer object
463  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
464  */
465 tdm_error    tdm_layer_unset_buffer(tdm_layer *layer);
466
467 /**
468  * @brief Check wheter a layer object is available for a frontend user to use.
469  * @details A layer object is not usable if a TDM buffer is showing on screen
470  * via this layer object. By calling #tdm_layer_unset_buffer, this layer object
471  * will become usable.
472  * @param[in] layer A layer object
473  * @param[out] usable 1 if usable, 0 if not usable
474  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
475  */
476 tdm_error    tdm_layer_is_usable(tdm_layer *layer, unsigned int *usable);
477
478 /**
479  * @brief Set the relative zpos to a VIDEO layer object
480  * @details The zpos value is less than the minimum zpos of GRAPHIC layers, or
481  * it is more than the maximum zpos of GRAPHIC layers.
482  * @param[in] layer A VIDEO layer object
483  * @param[in] zpos The zpos
484  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
485  * @see tdm_layer_get_zpos, tdm_layer_capability
486  */
487 tdm_error    tdm_layer_set_video_pos(tdm_layer *layer, int zpos);
488
489 /**
490  * @brief Create a capture object of a layer object
491  * @param[in] layer A layer object
492  * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
493  * @return A capture object
494  * @see tdm_capture_destroy
495  */
496 tdm_capture *tdm_layer_create_capture(tdm_layer *layer, tdm_error *error);
497
498 /**
499  * @brief Destroy a pp object
500  * @param[in] pp A pp object
501  * @see tdm_display_create_pp
502  */
503 void         tdm_pp_destroy(tdm_pp *pp);
504
505 /**
506  * @brief Set the geometry information to a pp object
507  * @param[in] pp A pp object
508  * @param[in] info The geometry information
509  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
510  * @see tdm_pp_commit
511  */
512 tdm_error    tdm_pp_set_info(tdm_pp *pp, tdm_info_pp *info);
513
514 /**
515  * @brief Attach a source buffer and a destination buffer to a pp object
516  * @param[in] pp A pp object
517  * @param[in] src A source buffer
518  * @param[in] dst A destination buffer
519  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
520  * @see tdm_pp_commit, tdm_buffer_add_release_handler, tdm_buffer_release_handler
521  */
522 tdm_error    tdm_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
523
524 /**
525  * @brief Commit changes for a pp object
526  * @param[in] pp A pp object
527  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
528  */
529 tdm_error    tdm_pp_commit(tdm_pp *pp);
530
531 /**
532  * @brief Destroy a capture object
533  * @param[in] capture A capture object
534  * @see tdm_output_create_capture, tdm_layer_create_capture
535  */
536 void         tdm_capture_destroy(tdm_capture *capture);
537
538 /**
539  * @brief Set the geometry information to a capture object
540  * @param[in] capture A capture object
541  * @param[in] info The geometry information
542  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
543  * @see tdm_capture_commit
544  */
545 tdm_error    tdm_capture_set_info(tdm_capture *capture, tdm_info_capture *info);
546
547 /**
548  * @brief Attach a TDM buffer to a capture object
549  * @param[in] capture A capture object
550  * @param[in] buffer A TDM buffer
551  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
552  * @see tdm_capture_commit, tdm_buffer_add_release_handler, tdm_buffer_release_handler
553  */
554 tdm_error    tdm_capture_attach(tdm_capture *capture, tbm_surface_h buffer);
555
556 /**
557  * @brief Commit changes for a capture object
558  * @param[in] capture A capture object
559  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
560  */
561 tdm_error    tdm_capture_commit(tdm_capture *capture);
562
563 /**
564  * @brief The release handler of a TDM buffer
565  * @param[in] buffer A TDM buffer
566  * @param[in] user_data user data
567  * @see tdm_buffer_add_release_handler, tdm_buffer_remove_release_handler
568  */
569 typedef void (*tdm_buffer_release_handler)(tbm_surface_h buffer, void *user_data);
570
571 /**
572  * @brief Add a release handler to a TDM buffer
573  * @details
574  * TDM has its own buffer release mechanism to let an frontend user know when a TDM buffer
575  * becomes available for a next job. A TDM buffer can be used for TDM to show
576  * it on screen or to capture an output and a layer. After all operations,
577  * TDM will release it immediately when TDM doesn't need it any more.
578  * @param[in] buffer A TDM buffer
579  * @param[in] func A release handler
580  * @param[in] user_data user data
581  * @return #TDM_ERROR_NONE if success. Otherwise, error value.
582  * @see tdm_buffer_remove_release_handler
583  */
584 tdm_error    tdm_buffer_add_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data);
585
586 /**
587  * @brief Remove a release handler from a TDM buffer
588  * @param[in] buffer A TDM buffer
589  * @param[in] func A release handler
590  * @param[in] user_data user data
591  * @see tdm_buffer_add_release_handler
592  */
593 void         tdm_buffer_remove_release_handler(tbm_surface_h buffer, tdm_buffer_release_handler func, void *user_data);
594
595 #ifdef __cplusplus
596 }
597 #endif
598
599 #endif /* _TDM_H_ */