second implementation 00/253100/2
authorSooChan Lim <sc1.lim@samsung.com>
Thu, 4 Feb 2021 06:42:39 +0000 (15:42 +0900)
committerSooChan Lim <sc1.lim@samsung.com>
Thu, 4 Feb 2021 23:59:24 +0000 (08:59 +0900)
Change-Id: Idc619c05f464c5e6069978c512a50e39b8a648df

include/hal-tdm-interface.h
include/hal-tdm-types.h
include/hal-tdm.h
src/hal-api-tdm.c

index f72b828bf2896475aae5406e8d66e2a178869e08..139586b72cf34c828ac5962a9ed9c29cc47c32f1 100644 (file)
@@ -35,7 +35,7 @@
 #ifndef __HAL_TDM_INTERFACE__
 #define __HAL_TDM_INTERFACE__
 
-#include <hal/hal-common-interface.h>
+#include <hal-common-interface.h>
 #include <tbm_surface.h>
 #include <tbm_surface_queue.h>
 
 extern "C" {
 #endif
 
-typedef struct _hal_tdm_func_display {
-       hal_tdm_error (*display_get_capability)(hal_tdm_backend_data *bdata, hal_tdm_caps_display *caps);
-       hal_tdm_error (*display_get_pp_capability)(hal_tdm_backend_data *bdata, hal_tdm_caps_pp *caps);
-       hal_tdm_error (*display_get_capture_capability)(hal_tdm_backend_data *bdata, hal_tdm_caps_capture *caps);
-       hal_tdm_output **(*display_get_outputs)(hal_tdm_backend_data *bdata, int *count, hal_tdm_error *error);
-       hal_tdm_error (*display_get_fd)(hal_tdm_backend_data *bdata, int *fd);
-       hal_tdm_error (*display_handle_events)(hal_tdm_backend_data *bdata);
-       hal_tdm_pp *(*display_create_pp)(hal_tdm_backend_data *bdata, hal_tdm_error *error);
-       hal_tdm_voutput *(*display_voutput_create)(hal_tdm_backend_data *bdata, const char *name, hal_tdm_error *error);
-} hal_tdm_func_display;
-
-typedef struct _hal_tdm_func_output {
+typedef struct _hal_tdm_backend_data     hal_tdm_backend_data;
+
+typedef struct _hal_tdm_display_funcs     hal_tdm_display_funcs;
+typedef struct _hal_tdm_output_funcs      hal_tdm_output_funcs;
+typedef struct _hal_tdm_hwc_funcs         hal_tdm_hwc_funcs;
+typedef struct _hal_tdm_hwc_window_funcs  hal_tdm_hwc_window_funcs;
+typedef struct _hal_tdm_pp_funcs          hal_tdm_pp_funcs;
+typedef struct _hal_tdm_capture_funcs     hal_tdm_capture_funcs;
+typedef struct _hal_tdm_voutput_funcs     hal_tdm_voutput_funcs;
+
+#define HAL_TDM_EVENT_SOURCE_MAX 3
+
+struct _hal_tdm_backend_data {
+       hal_tdm_display         *display; // handle
+
+       int                      num_event_sources;
+       hal_tdm_event_source    *event_sources[HAL_TDM_EVENT_SOURCE_MAX];
+
+       hal_tdm_display_funcs    *display_funcs;
+       hal_tdm_output_funcs     *output_funcs;
+       hal_tdm_hwc_funcs        *hwc_funcs;
+       hal_tdm_hwc_window_funcs *hwc_window_funcs;
+       hal_tdm_pp_funcs         *pp_funcs;
+       hal_tdm_capture_funcs    *capture_funcs;
+       hal_tdm_voutput_funcs    *voutput_funcs;
+};
+
+struct _hal_tdm_display_funcs {
+       hal_tdm_error (*display_get_capability)(hal_tdm_display *display, hal_tdm_caps_display *caps);
+       hal_tdm_error (*display_get_pp_capability)(hal_tdm_display *display, hal_tdm_caps_pp *caps);
+       hal_tdm_error (*display_get_capture_capability)(hal_tdm_display *display, hal_tdm_caps_capture *caps);
+       hal_tdm_output **(*display_get_outputs)(hal_tdm_display *display, int *count, hal_tdm_error *error);
+       hal_tdm_error (*display_get_fd)(hal_tdm_display *display, int *fd);
+       hal_tdm_error (*display_handle_events)(hal_tdm_display *display);
+       hal_tdm_pp *(*display_create_pp)(hal_tdm_display *display, hal_tdm_error *error);
+       hal_tdm_voutput *(*display_voutput_create)(hal_tdm_display *display, const char *name, hal_tdm_error *error);
+};
+
+struct _hal_tdm_output_funcs {
        hal_tdm_error (*output_get_capability)(hal_tdm_output *output, hal_tdm_caps_output *caps);
        hal_tdm_error (*output_set_property)(hal_tdm_output *output, unsigned int id, hal_tdm_value value);
        hal_tdm_error (*output_get_property)(hal_tdm_output *output, unsigned int id, hal_tdm_value *value);
@@ -75,9 +102,9 @@ typedef struct _hal_tdm_func_output {
        hal_tdm_hwc *(*output_get_hwc)(hal_tdm_output *output, hal_tdm_error *error);
        hal_tdm_error (*output_set_mirror)(hal_tdm_output *output, hal_tdm_output *src_output, hal_tdm_transform transform);
        hal_tdm_error (*output_unset_mirror)(hal_tdm_output *output);
-} hal_tdm_func_output;
+};
 
-typedef struct _hal_tdm_func_voutput {
+struct _hal_tdm_voutput_funcs {
        hal_tdm_error (*voutput_destroy)(hal_tdm_voutput *voutput);
        hal_tdm_error (*voutput_set_available_mode)(hal_tdm_voutput *voutput, const hal_tdm_output_mode *modes, int count);
        hal_tdm_error (*voutput_set_physical_size)(hal_tdm_voutput *voutput, unsigned int mmwidth, unsigned int mmheight);
@@ -87,9 +114,9 @@ typedef struct _hal_tdm_func_voutput {
        hal_tdm_error (*voutput_set_commit_func)(hal_tdm_voutput *voutput, hal_tdm_voutput_commit_handler commit_func);
        hal_tdm_error (*voutput_commit_done)(hal_tdm_voutput *voutput);
        hal_tdm_error (*voutput_set_target_buffer_queue_flag)(hal_tdm_voutput *voutput, int flags);
-} hal_tdm_func_voutput;
+};
 
-typedef struct _hal_tdm_func_hwc {
+struct _hal_tdm_hwc_funcs {
        hal_tdm_hwc_window *(*hwc_create_window)(hal_tdm_hwc *hwc, hal_tdm_error *error);
        hal_tdm_error (*hwc_get_video_supported_formats)(hal_tdm_hwc *hwc, const tbm_format **formats, int *count);
        hal_tdm_error (*hwc_get_video_available_properties)(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count);
@@ -108,9 +135,9 @@ typedef struct _hal_tdm_func_hwc {
        hal_tdm_error (*hwc_set_property)(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value value);
        hal_tdm_error (*hwc_get_property)(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value *value);
        hal_tdm_error (*hwc_get_commit_interval)(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_interval *interval);
-} hal_tdm_func_hwc;
+};
 
-typedef struct _hal_tdm_func_hwc_window {
+struct _hal_tdm_hwc_window_funcs {
        void (*hwc_window_destroy)(hal_tdm_hwc_window *hwc_window);
        tbm_surface_queue_h (*hwc_window_acquire_buffer_queue)(hal_tdm_hwc_window *hwc_window, hal_tdm_error *error);
        void (*hwc_window_release_buffer_queue)(hal_tdm_hwc_window *hwc_window, tbm_surface_queue_h queue);
@@ -124,57 +151,37 @@ typedef struct _hal_tdm_func_hwc_window {
        hal_tdm_error (*hwc_window_set_name)(hal_tdm_hwc_window *hwc_window, const char *name);
        hal_tdm_error (*hwc_window_set_cursor_image)(hal_tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr);
        hal_tdm_error (*hwc_window_set_acquire_fence)(hal_tdm_hwc_window *hwc_window, int acquire_fence);
-} hal_tdm_func_hwc_window;
+};
 
-typedef struct _hal_tdm_func_pp {
+struct _hal_tdm_pp_funcs {
        void (*pp_destroy)(hal_tdm_pp *pp);
        hal_tdm_error (*pp_set_info)(hal_tdm_pp *pp, hal_tdm_info_pp *info);
        hal_tdm_error (*pp_attach)(hal_tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
        hal_tdm_error (*pp_commit)(hal_tdm_pp *pp);
        hal_tdm_error (*pp_set_done_handler)(hal_tdm_pp *pp, hal_tdm_pp_done_handler func, void *user_data);
-} hal_tdm_func_pp;
+};
 
-typedef struct _hal_tdm_func_capture {
+typedef struct _hal_tdm_capture_funcs {
        void (*capture_destroy)(hal_tdm_capture *capture);
        hal_tdm_error (*capture_set_info)(hal_tdm_capture *capture, hal_tdm_info_capture *info);
        hal_tdm_error (*capture_attach)(hal_tdm_capture *capture, tbm_surface_h buffer);
        hal_tdm_error (*capture_commit)(hal_tdm_capture *capture);
        hal_tdm_error (*capture_set_done_handler)(hal_tdm_capture *capture, hal_tdm_capture_done_handler func, void *user_data);
-} hal_tdm_func_capture;
-
-typedef struct _hal_backend_tdm_funcs {
-       hal_tdm_func_display *tdm_func_display;
-       hal_tdm_func_output *tdm_func_output;
-       hal_tdm_func_voutput *tdm_func_voutput;
-       hal_tdm_func_hwc *tdm_func_hwc;
-       hal_tdm_func_hwc_window *tdm_func_hwc_window;
-       hal_tdm_func_pp *tdm_func_pp;
-       hal_tdm_func_capture *tdm_func_capture;
-} hal_backend_tdm_funcs;
-
-hal_tdm_error hal_tdm_backend_register_func_display(hal_tdm_display *dpy, hal_tdm_func_display *func_display);
-hal_tdm_error hal_tdm_backend_register_func_output(hal_tdm_display *dpy, hal_tdm_func_output *func_output);
-hal_tdm_error hal_tdm_backend_register_func_voutput(hal_tdm_display *dpy, hal_tdm_func_voutput *func_voutput);
-hal_tdm_error hal_tdm_backend_register_func_hwc(hal_tdm_display *dpy, hal_tdm_func_hwc *func_hwc);
-hal_tdm_error hal_tdm_backend_register_func_hwc_window(hal_tdm_display *dpy, hal_tdm_func_hwc_window *func_hwc_window);
-hal_tdm_error hal_tdm_backend_register_func_pp(hal_tdm_display *dpy, hal_tdm_func_pp *func_pp);
-hal_tdm_error hal_tdm_backend_register_func_capture(hal_tdm_display *dpy, hal_tdm_func_capture *func_capture);
-
-typedef void hal_tdm_event_loop_source;
-typedef hal_tdm_error (*hal_tdm_event_loop_fd_handler)(int fd, hal_tdm_event_loop_mask mask, void *user_data);
-typedef hal_tdm_error (*hal_tdm_event_loop_timer_handler)(void *user_data);
+} hal_tdm_capture_funcs;
+
+hal_tdm_error hal_tdm_backend_register_display_funcs(hal_tdm_display *dpy, hal_tdm_display_funcs *display_funcs);
+hal_tdm_error hal_tdm_backend_register_output_funcs(hal_tdm_display *dpy, hal_tdm_output_funcs *output_funcs);
+hal_tdm_error hal_tdm_backend_register_voutput_funcs(hal_tdm_display *dpy, hal_tdm_voutput_funcs *voutput_funcs);
+hal_tdm_error hal_tdm_backend_register_hwc_funcs(hal_tdm_display *dpy, hal_tdm_hwc_funcs *hwc_funcs);
+hal_tdm_error hal_tdm_backend_register_hwc_window_funcs(hal_tdm_display *dpy, hal_tdm_hwc_window_funcs *hwc_window_funcs);
+hal_tdm_error hal_tdm_backend_register_pp_funcs(hal_tdm_display *dpy, hal_tdm_pp_funcs *pp_funcs);
+hal_tdm_error hal_tdm_backend_register_capture_funcs(hal_tdm_display *dpy, hal_tdm_capture_funcs *capture_funcs);
 
 tbm_surface_h hal_tdm_buffer_ref_backend(tbm_surface_h buffer);
-void hal_tdm_buffer_unref_backend(tbm_surface_h buffer);
+void          hal_tdm_buffer_unref_backend(tbm_surface_h buffer);
 typedef void (*hal_tdm_buffer_destroy_handler)(tbm_surface_h buffer, void *user_data);
 hal_tdm_error hal_tdm_buffer_add_destroy_handler(tbm_surface_h buffer, hal_tdm_buffer_destroy_handler func, void *user_data);
-void hal_tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, hal_tdm_buffer_destroy_handler func, void *user_data);
-hal_tdm_event_loop_source *hal_tdm_event_loop_add_fd_handler(hal_tdm_display *dpy, int fd, hal_tdm_event_loop_mask mask,
-                                                         hal_tdm_event_loop_fd_handler func, void *user_data, hal_tdm_error *error);
-hal_tdm_event_loop_source *hal_tdm_event_loop_add_timer_handler(hal_tdm_display *dpy, hal_tdm_event_loop_timer_handler func,
-                                                                void *user_data, hal_tdm_error *error);
-hal_tdm_error hal_tdm_event_loop_source_timer_update(hal_tdm_event_loop_source *source, unsigned int ms_delay);
-void hal_tdm_event_loop_source_remove(hal_tdm_event_loop_source *source);
+void          hal_tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, hal_tdm_buffer_destroy_handler func, void *user_data);
 
 #ifdef __cplusplus
 }
index 51edf7a7f21dae44790d95cd8f1b66fe824686f5..6a3dd0010146c7e952c18a5c73fbdf60a61b4681 100644 (file)
@@ -32,8 +32,8 @@
  *
 **************************************************************************/
 
-#ifndef _HAL_TDM_TYPES_H_
-#define _HAL_TDM_TYPES_H_
+#ifndef __HAL_TDM_TYPES_H__
+#define __HAL_TDM_TYPES_H__
 
 #include <stdint.h>
 #include <tbm_surface.h>
@@ -501,7 +501,14 @@ typedef void hal_tdm_vblank;
 /**
  * @brief The tdm backend object
  */
-typedef void hal_tdm_backend_data;
+typedef void hal_tdm_backend;
+
+/**
+ * @brief The event_loop_fd handler
+ * @details This handler will be called when the output object is
+ * createed in runtime.
+ */
+typedef hal_tdm_error (*hal_tdm_event_loop_fd_handler)(int event_fd, hal_tdm_event_loop_mask mask, void *user_data);
 
 /**
  * @brief The output create handler
@@ -529,7 +536,7 @@ typedef void (*hal_tdm_output_change_handler)(hal_tdm_output *output,
 
 /**
  * @brief The vblank handler
- * @see output_set_vblank_handler() function of #hal_tdm_func_display
+ * @see output_set_vblank_handler() function of #hal_tdm_display_funcs
  */
 typedef void (*hal_tdm_output_vblank_handler)(hal_tdm_output *output, unsigned int sequence,
                                                                                          unsigned int tv_sec, unsigned int tv_usec,
@@ -537,7 +544,7 @@ typedef void (*hal_tdm_output_vblank_handler)(hal_tdm_output *output, unsigned i
 
 /**
  * @brief The output commit handler
- * @see output_set_commit_handler() function of #hal_tdm_func_display
+ * @see output_set_commit_handler() function of #hal_tdm_display_funcs
  */
 typedef void (*hal_tdm_output_commit_handler)(hal_tdm_output *output, unsigned int sequence,
                                                                                          unsigned int tv_sec, unsigned int tv_usec,
@@ -580,7 +587,7 @@ typedef void (*hal_tdm_vblank_create_handler)(hal_tdm_vblank *vblank, void *user
 
 /**
  * @brief The hwc commit handler
- * @see hwc_set_commit_handler() function of #hal_tdm_func_hwc
+ * @see hwc_set_commit_handler() function of #hal_tdm_hwc_funcs
  */
 typedef void (*hal_tdm_hwc_commit_handler)(hal_tdm_hwc *hwc, unsigned int sequence,
                                                                                  unsigned int tv_sec, unsigned int tv_usec,
@@ -598,6 +605,14 @@ typedef void (*hal_tdm_voutput_commit_handler)(hal_tdm_voutput *voutput, unsigne
  */
 typedef void (*hal_tdm_voutput_commit_func)(hal_tdm_voutput *voutput, tbm_surface_h buffer);
 
+/**
+ * @brief The event source information
+ */
+typedef struct _hal_tdm_event_source {
+       int event_fd;
+       hal_tdm_event_loop_fd_handler func;
+       void *user_data;
+} hal_tdm_event_source;
 
 typedef struct _hal_tdm_caps_output {
        char maker[HAL_TDM_NAME_LEN];       /**< The output maker */
index 31169fce84a1a3f720107a6744b33e216f5fdee4..ed2855c8b5379611fe4a0790d0e8a706a4419f8f 100644 (file)
 extern "C" {
 #endif
 
+#include <tbm_surface.h>
+#include <tbm_surface_queue.h>
 #include "hal-tdm-types.h"
 
-hal_tdm_error hal_tdm_get_backend(hal_tdm_display *dpy);
-void hal_tdm_put_backend(void);
+/* hal_tdm */
+hal_tdm_backend   *hal_tdm_get_backend(hal_tdm_error *error);
+hal_tdm_error      hal_tdm_put_backend(hal_tdm_backend *backend);
 
-/* tdm_func_display */
-hal_tdm_error hal_tdm_display_get_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_display *caps);
-hal_tdm_error hal_tdm_display_get_pp_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_pp *caps);
-hal_tdm_error hal_tdm_display_get_capture_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_capture *caps);
-hal_tdm_output **hal_tdm_display_get_outputs(hal_tdm_backend_data *bdata, int *count, hal_tdm_error *error);
-hal_tdm_error hal_tdm_display_get_fd(hal_tdm_backend_data *bdata, int *fd);
-hal_tdm_error hal_tdm_display_handle_events(hal_tdm_backend_data *bdata);
-hal_tdm_pp *hal_tdm_display_create_pp(hal_tdm_backend_data *bdata, hal_tdm_error *error);
-hal_tdm_voutput *hal_tdm_display_voutput_create(hal_tdm_backend_data *bdata, const char *name, hal_tdm_error *error);
+/* tdm_backend_data */
+hal_tdm_display        *hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error);
+hal_tdm_event_source  **hal_tdm_backend_get_event_sources(hal_tdm_backend *backend, int num_event_sources, hal_tdm_error *error);
 
-/* tdm_func_output */
-hal_tdm_error hal_tdm_output_get_capability(hal_tdm_output *output, hal_tdm_caps_output *caps);
-hal_tdm_error hal_tdm_output_set_property(hal_tdm_output *output, unsigned int id, hal_tdm_value value);
-hal_tdm_error hal_tdm_output_get_property(hal_tdm_output *output, unsigned int id, hal_tdm_value *value);
-hal_tdm_error hal_tdm_output_wait_vblank(hal_tdm_output *output, int interval, int sync, void *user_data);
-hal_tdm_error hal_tdm_output_set_vblank_handler(hal_tdm_output *output, hal_tdm_output_vblank_handler func);
-hal_tdm_error hal_tdm_output_commit(hal_tdm_output *output, int sync, void *user_data);
-hal_tdm_error hal_tdm_output_set_commit_handler(hal_tdm_output *output, hal_tdm_output_commit_handler func);
-hal_tdm_error hal_tdm_output_set_dpms(hal_tdm_output *output, hal_tdm_output_dpms dpms_value);
-hal_tdm_error hal_tdm_output_get_dpms(hal_tdm_output *output, hal_tdm_output_dpms *dpms_value);
-hal_tdm_error hal_tdm_output_set_mode(hal_tdm_output *output, const hal_tdm_output_mode *mode);
-hal_tdm_error hal_tdm_output_get_mode(hal_tdm_output *output, const hal_tdm_output_mode **mode);
+/* tdm_display_funcs */
+hal_tdm_error    hal_tdm_display_get_capability(hal_tdm_display *display, hal_tdm_caps_display *caps);
+hal_tdm_error    hal_tdm_display_get_pp_capability(hal_tdm_display *display, hal_tdm_caps_pp *caps);
+hal_tdm_error    hal_tdm_display_get_capture_capability(hal_tdm_display *display, hal_tdm_caps_capture *caps);
+hal_tdm_output **hal_tdm_display_get_outputs(hal_tdm_display *display, int *count, hal_tdm_error *error);
+hal_tdm_error    hal_tdm_display_get_fd(hal_tdm_display *display, int *fd);
+hal_tdm_error    hal_tdm_display_handle_events(hal_tdm_display *display);
+hal_tdm_pp      *hal_tdm_display_create_pp(hal_tdm_display *display, hal_tdm_error *error);
+hal_tdm_voutput *hal_tdm_display_voutput_create(hal_tdm_display *display, const char *name, hal_tdm_error *error);
+
+/* output_funcs */
+hal_tdm_error    hal_tdm_output_get_capability(hal_tdm_output *output, hal_tdm_caps_output *caps);
+hal_tdm_error    hal_tdm_output_set_property(hal_tdm_output *output, unsigned int id, hal_tdm_value value);
+hal_tdm_error    hal_tdm_output_get_property(hal_tdm_output *output, unsigned int id, hal_tdm_value *value);
+hal_tdm_error    hal_tdm_output_wait_vblank(hal_tdm_output *output, int interval, int sync, void *user_data);
+hal_tdm_error    hal_tdm_output_set_vblank_handler(hal_tdm_output *output, hal_tdm_output_vblank_handler func);
+hal_tdm_error    hal_tdm_output_commit(hal_tdm_output *output, int sync, void *user_data);
+hal_tdm_error    hal_tdm_output_set_commit_handler(hal_tdm_output *output, hal_tdm_output_commit_handler func);
+hal_tdm_error    hal_tdm_output_set_dpms(hal_tdm_output *output, hal_tdm_output_dpms dpms_value);
+hal_tdm_error    hal_tdm_output_get_dpms(hal_tdm_output *output, hal_tdm_output_dpms *dpms_value);
+hal_tdm_error    hal_tdm_output_set_mode(hal_tdm_output *output, const hal_tdm_output_mode *mode);
+hal_tdm_error    hal_tdm_output_get_mode(hal_tdm_output *output, const hal_tdm_output_mode **mode);
 hal_tdm_capture *hal_tdm_output_create_capture(hal_tdm_output *output, hal_tdm_error *error);
-hal_tdm_error hal_tdm_output_set_status_handler(hal_tdm_output *output, hal_tdm_output_status_handler func, void *user_data);
-hal_tdm_error hal_tdm_output_set_dpms_handler(hal_tdm_output *output, hal_tdm_output_dpms_handler func, void *user_data);
-hal_tdm_error hal_tdm_output_set_dpms_async(hal_tdm_output *output, hal_tdm_output_dpms dpms_value, int *sync);
-hal_tdm_hwc *hal_tdm_output_get_hwc(hal_tdm_output *output, hal_tdm_error *error);
-hal_tdm_error hal_tdm_output_set_mirror(hal_tdm_output *output, hal_tdm_output *src_output, hal_tdm_transform transform);
-hal_tdm_error hal_tdm_output_unset_mirror(hal_tdm_output *output);
+hal_tdm_error    hal_tdm_output_set_status_handler(hal_tdm_output *output, hal_tdm_output_status_handler func, void *user_data);
+hal_tdm_error    hal_tdm_output_set_dpms_handler(hal_tdm_output *output, hal_tdm_output_dpms_handler func, void *user_data);
+hal_tdm_error    hal_tdm_output_set_dpms_async(hal_tdm_output *output, hal_tdm_output_dpms dpms_value, int *sync);
+hal_tdm_hwc     *hal_tdm_output_get_hwc(hal_tdm_output *output, hal_tdm_error *error);
+hal_tdm_error    hal_tdm_output_set_mirror(hal_tdm_output *output, hal_tdm_output *src_output, hal_tdm_transform transform);
+hal_tdm_error    hal_tdm_output_unset_mirror(hal_tdm_output *output);
 
-/* tdm_func_voutput */
-hal_tdm_error hal_tdm_voutput_destroy(hal_tdm_voutput *voutput);
-hal_tdm_error hal_tdm_voutput_set_available_mode(hal_tdm_voutput *voutput, const hal_tdm_output_mode *modes, int count);
-hal_tdm_error hal_tdm_voutput_set_physical_size(hal_tdm_voutput *voutput, unsigned int mmwidth, unsigned int mmheight);
-hal_tdm_error hal_tdm_voutput_connect(hal_tdm_voutput *voutput);
-hal_tdm_error hal_tdm_voutput_disconnect(hal_tdm_voutput *voutput);
+/* voutput_funcs */
+hal_tdm_error   hal_tdm_voutput_destroy(hal_tdm_voutput *voutput);
+hal_tdm_error   hal_tdm_voutput_set_available_mode(hal_tdm_voutput *voutput, const hal_tdm_output_mode *modes, int count);
+hal_tdm_error   hal_tdm_voutput_set_physical_size(hal_tdm_voutput *voutput, unsigned int mmwidth, unsigned int mmheight);
+hal_tdm_error   hal_tdm_voutput_connect(hal_tdm_voutput *voutput);
+hal_tdm_error   hal_tdm_voutput_disconnect(hal_tdm_voutput *voutput);
 hal_tdm_output *hal_tdm_voutput_get_output(hal_tdm_voutput *voutput, hal_tdm_error *error);
-hal_tdm_error hal_tdm_voutput_set_commit_func(hal_tdm_voutput *voutput, hal_tdm_voutput_commit_handler commit_func);
-hal_tdm_error hal_tdm_voutput_commit_done(hal_tdm_voutput *voutput);
-hal_tdm_error hal_tdm_voutput_set_target_buffer_queue_flag(hal_tdm_voutput *voutput, int flags);
+hal_tdm_error   hal_tdm_voutput_set_commit_func(hal_tdm_voutput *voutput, hal_tdm_voutput_commit_handler commit_func);
+hal_tdm_error   hal_tdm_voutput_commit_done(hal_tdm_voutput *voutput);
+hal_tdm_error   hal_tdm_voutput_set_target_buffer_queue_flag(hal_tdm_voutput *voutput, int flags);
 
-/* tdm_func_hwc */
+/* hwc_funcs */
 hal_tdm_hwc_window *hal_tdm_hwc_create_window(hal_tdm_hwc *hwc, hal_tdm_error *error);
-hal_tdm_error hal_tdm_hwc_get_video_supported_formats(hal_tdm_hwc *hwc, const tbm_format **formats, int *count);
-hal_tdm_error hal_tdm_hwc_get_video_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count);
-hal_tdm_error hal_tdm_hwc_get_capabilities(hal_tdm_hwc *hwc, hal_tdm_hwc_capability *capabilities);
-hal_tdm_error hal_tdm_hwc_get_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count);
+hal_tdm_error       hal_tdm_hwc_get_video_supported_formats(hal_tdm_hwc *hwc, const tbm_format **formats, int *count);
+hal_tdm_error       hal_tdm_hwc_get_video_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count);
+hal_tdm_error       hal_tdm_hwc_get_capabilities(hal_tdm_hwc *hwc, hal_tdm_hwc_capability *capabilities);
+hal_tdm_error       hal_tdm_hwc_get_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count);
 tbm_surface_queue_h hal_tdm_hwc_get_client_target_buffer_queue(hal_tdm_hwc *hwc, hal_tdm_error *error);
-hal_tdm_error hal_tdm_hwc_set_client_target_buffer(hal_tdm_hwc *hwc, tbm_surface_h target_buffer, hal_tdm_region damage);
-hal_tdm_error hal_tdm_hwc_set_client_target_acquire_fence(hal_tdm_hwc *hwc, int acquire_fence);
-hal_tdm_error hal_tdm_hwc_validate(hal_tdm_hwc *hwc, hal_tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types);
-hal_tdm_error hal_tdm_hwc_get_changed_composition_types(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_window, hal_tdm_hwc_window_composition *composition_types);
-hal_tdm_error hal_tdm_hwc_accept_validation(hal_tdm_hwc *hwc);
-hal_tdm_error hal_tdm_hwc_commit(hal_tdm_hwc *hwc, int sync, void *user_data);
-hal_tdm_error hal_tdm_hwc_set_commit_handler(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_handler func);
-hal_tdm_error hal_tdm_hwc_get_commit_fence(hal_tdm_hwc *hwc, int *commit_fence);
-hal_tdm_error hal_tdm_hwc_get_release_fences(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_windows, int *release_fences);
-hal_tdm_error hal_tdm_hwc_set_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value value);
-hal_tdm_error hal_tdm_hwc_get_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value *value);
-hal_tdm_error hal_tdm_hwc_get_commit_interval(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_interval *interval);
+hal_tdm_error       hal_tdm_hwc_set_client_target_buffer(hal_tdm_hwc *hwc, tbm_surface_h target_buffer, hal_tdm_region damage);
+hal_tdm_error       hal_tdm_hwc_set_client_target_acquire_fence(hal_tdm_hwc *hwc, int acquire_fence);
+hal_tdm_error       hal_tdm_hwc_validate(hal_tdm_hwc *hwc, hal_tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types);
+hal_tdm_error       hal_tdm_hwc_get_changed_composition_types(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_window, hal_tdm_hwc_window_composition *composition_types);
+hal_tdm_error       hal_tdm_hwc_accept_validation(hal_tdm_hwc *hwc);
+hal_tdm_error       hal_tdm_hwc_commit(hal_tdm_hwc *hwc, int sync, void *user_data);
+hal_tdm_error       hal_tdm_hwc_set_commit_handler(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_handler func);
+hal_tdm_error       hal_tdm_hwc_get_commit_fence(hal_tdm_hwc *hwc, int *commit_fence);
+hal_tdm_error       hal_tdm_hwc_get_release_fences(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_windows, int *release_fences);
+hal_tdm_error       hal_tdm_hwc_set_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value value);
+hal_tdm_error       hal_tdm_hwc_get_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value *value);
+hal_tdm_error       hal_tdm_hwc_get_commit_interval(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_interval *interval);
 
-/* tdm_func_hwc_window */
-void hal_tdm_hwc_window_destroy(hal_tdm_hwc_window *hwc_window);
+/* hwc_window_funcs */
+void                hal_tdm_hwc_window_destroy(hal_tdm_hwc_window *hwc_window);
 tbm_surface_queue_h hal_tdm_hwc_window_acquire_buffer_queue(hal_tdm_hwc_window *hwc_window, hal_tdm_error *error);
-void hal_tdm_hwc_window_release_buffer_queue(hal_tdm_hwc_window *hwc_window, tbm_surface_queue_h queue);
-hal_tdm_error hal_tdm_hwc_window_set_composition_type(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_composition composition_type);
-hal_tdm_error hal_tdm_hwc_window_set_buffer_damage(hal_tdm_hwc_window *hwc_window, hal_tdm_region damage);
-hal_tdm_error hal_tdm_hwc_window_set_info(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_info *info);
-hal_tdm_error hal_tdm_hwc_window_set_buffer(hal_tdm_hwc_window *hwc_window, tbm_surface_h buffer);
-hal_tdm_error hal_tdm_hwc_window_set_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value value);
-hal_tdm_error hal_tdm_hwc_window_get_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value *value);
-hal_tdm_error hal_tdm_hwc_window_get_constraints(hal_tdm_hwc_window *hwc_window, int *constraints);
-hal_tdm_error hal_tdm_hwc_window_set_name(hal_tdm_hwc_window *hwc_window, const char *name);
-hal_tdm_error hal_tdm_hwc_window_set_cursor_image(hal_tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr);
-hal_tdm_error hal_tdm_hwc_window_set_acquire_fence(hal_tdm_hwc_window *hwc_window, int acquire_fence);
+void                hal_tdm_hwc_window_release_buffer_queue(hal_tdm_hwc_window *hwc_window, tbm_surface_queue_h queue);
+hal_tdm_error       hal_tdm_hwc_window_set_composition_type(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_composition composition_type);
+hal_tdm_error       hal_tdm_hwc_window_set_buffer_damage(hal_tdm_hwc_window *hwc_window, hal_tdm_region damage);
+hal_tdm_error       hal_tdm_hwc_window_set_info(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_info *info);
+hal_tdm_error       hal_tdm_hwc_window_set_buffer(hal_tdm_hwc_window *hwc_window, tbm_surface_h buffer);
+hal_tdm_error       hal_tdm_hwc_window_set_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value value);
+hal_tdm_error       hal_tdm_hwc_window_get_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value *value);
+hal_tdm_error       hal_tdm_hwc_window_get_constraints(hal_tdm_hwc_window *hwc_window, int *constraints);
+hal_tdm_error       hal_tdm_hwc_window_set_name(hal_tdm_hwc_window *hwc_window, const char *name);
+hal_tdm_error       hal_tdm_hwc_window_set_cursor_image(hal_tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr);
+hal_tdm_error       hal_tdm_hwc_window_set_acquire_fence(hal_tdm_hwc_window *hwc_window, int acquire_fence);
 
-/* tdm_func_pp */
-void hal_tdm_pp_destroy(hal_tdm_pp *pp);
+/* pp_funcs */
+void          hal_tdm_pp_destroy(hal_tdm_pp *pp);
 hal_tdm_error hal_tdm_pp_set_info(hal_tdm_pp *pp, hal_tdm_info_pp *info);
 hal_tdm_error hal_tdm_pp_attach(hal_tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
 hal_tdm_error hal_tdm_pp_commit(hal_tdm_pp *pp);
 hal_tdm_error hal_tdm_pp_set_done_handler(hal_tdm_pp *pp, hal_tdm_pp_done_handler func, void *user_data);
 
-/* tdm_func_capture */
-void hal_tdm_capture_destroy(hal_tdm_capture *capture);
+/* capture_funcs */
+void          hal_tdm_capture_destroy(hal_tdm_capture *capture);
 hal_tdm_error hal_tdm_capture_set_info(hal_tdm_capture *capture, hal_tdm_info_capture *info);
 hal_tdm_error hal_tdm_capture_attach(hal_tdm_capture *capture, tbm_surface_h buffer);
 hal_tdm_error hal_tdm_capture_commit(hal_tdm_capture *capture);
index 05ec556d58f8823c2648b5097653f7d9aa370f95..9f3fc6db0b5dba87fa77168d610554f36ef1e118 100644 (file)
@@ -38,9 +38,9 @@
 #include <dlfcn.h>
 #include <dlog.h>
 
-#include <hal/hal-common.h>
-#include "hal-tdm-interface.h"
+#include <hal-common.h>
 #include "hal-tdm.h"
+#include "hal-tdm-interface.h"
 #include "common.h"
 
 #if defined(__GNUC__) && __GNUC__ >= 4
 #define ARRAY_SIZE(name)       (sizeof(name)/sizeof(name[0]))
 
 #define DISPLAY_FUNC_ENTRY(__func__) \
-       hal_tdm_func_display *func_display; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_display) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_display = g_tdm_funcs->tdm_func_display; \
-       if (!func_display->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_display_funcs *display_funcs; \
+       if (!display) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->display_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       display_funcs = g_hal_tdm_backend_data->display_funcs; \
+       if (!display_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define DISPLAY_FUNC_ENTRY_NULL(__func__) \
-       hal_tdm_func_display *func_display; \
-       if (!g_tdm_funcs) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
-       if (!g_tdm_funcs->tdm_func_display) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
-       func_display = g_tdm_funcs->tdm_func_display; \
-       if (!func_display->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
+       hal_tdm_display_funcs *display_funcs; \
+       if (!display) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       if (!g_hal_tdm_backend_data) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
+       if (!g_hal_tdm_backend_data->display_funcs) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       display_funcs = g_hal_tdm_backend_data->display_funcs; \
+       if (!display_funcs->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
 
 #define OUTPUT_FUNC_ENTRY(__func__) \
-       hal_tdm_func_output *func_output; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_output) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_output = g_tdm_funcs->tdm_func_output; \
-       if (!func_output->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_output_funcs *output_funcs; \
+       if (!output) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->output_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       output_funcs = g_hal_tdm_backend_data->output_funcs; \
+       if (!output_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define OUTPUT_FUNC_ENTRY_NULL(__func__) \
-       hal_tdm_func_output *func_output; \
-       if (!g_tdm_funcs) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
-       if (!g_tdm_funcs->tdm_func_output) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
-       func_output = g_tdm_funcs->tdm_func_output; \
-       if (!func_output->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
+       hal_tdm_output_funcs *output_funcs; \
+       if (!output) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       if (!g_hal_tdm_backend_data) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
+       if (!g_hal_tdm_backend_data->output_funcs) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       output_funcs = g_hal_tdm_backend_data->output_funcs; \
+       if (!output_funcs->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
 
 #define VOUTPUT_FUNC_ENTRY(__func__) \
-       hal_tdm_func_voutput *func_voutput; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_voutput) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_voutput = g_tdm_funcs->tdm_func_voutput; \
-       if (!func_voutput->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_voutput_funcs *voutput_funcs; \
+       if (!voutput) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->voutput_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       voutput_funcs = g_hal_tdm_backend_data->voutput_funcs; \
+       if (!voutput_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define VOUTPUT_FUNC_ENTRY_NULL(__func__) \
-       hal_tdm_func_voutput *func_voutput; \
-       if (!g_tdm_funcs) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
-       if (!g_tdm_funcs->tdm_func_voutput) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
-       func_voutput = g_tdm_funcs->tdm_func_voutput; \
-       if (!func_voutput->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
+       hal_tdm_voutput_funcs *voutput_funcs; \
+       if (!voutput) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       if (!g_hal_tdm_backend_data) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
+       if (!g_hal_tdm_backend_data->voutput_funcs) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       voutput_funcs = g_hal_tdm_backend_data->voutput_funcs; \
+       if (!voutput_funcs->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
 
 #define HWC_FUNC_ENTRY(__func__) \
-       hal_tdm_func_hwc *func_hwc; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_hwc) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_hwc = g_tdm_funcs->tdm_func_hwc; \
-       if (!func_hwc->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_hwc_funcs *hwc_funcs; \
+       if (!hwc) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->hwc_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       hwc_funcs = g_hal_tdm_backend_data->hwc_funcs; \
+       if (!hwc_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define HWC_FUNC_ENTRY_NULL(__func__) \
-       hal_tdm_func_hwc *func_hwc; \
-       if (!g_tdm_funcs) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
-       if (!g_tdm_funcs->tdm_func_hwc) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
-       func_hwc = g_tdm_funcs->tdm_func_hwc; \
-       if (!func_hwc->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
+       hal_tdm_hwc_funcs *hwc_funcs; \
+       if (!hwc) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       if (!g_hal_tdm_backend_data) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
+       if (!g_hal_tdm_backend_data->hwc_funcs) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       hwc_funcs = g_hal_tdm_backend_data->hwc_funcs; \
+       if (!hwc_funcs->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
 
 #define HWC_WINDOW_FUNC_ENTRY(__func__) \
-       hal_tdm_func_hwc_window *func_hwc_window; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_hwc_window) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_hwc_window = g_tdm_funcs->tdm_func_hwc_window; \
-       if (!func_hwc_window->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_hwc_window_funcs *hwc_window_funcs; \
+       if (!hwc_window) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->hwc_window_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       hwc_window_funcs = g_hal_tdm_backend_data->hwc_window_funcs; \
+       if (!hwc_window_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define HWC_WINDOW_FUNC_ENTRY_NULL(__func__) \
-       hal_tdm_func_hwc_window *func_hwc_window; \
-       if (!g_tdm_funcs) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
-       if (!g_tdm_funcs->tdm_func_hwc_window) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
-       func_hwc_window = g_tdm_funcs->tdm_func_hwc_window; \
-       if (!func_hwc_window->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
+       hal_tdm_hwc_window_funcs *hwc_window_funcs; \
+       if (!hwc_window) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       if (!g_hal_tdm_backend_data) { if (*error) *error = HAL_TDM_ERROR_NO_MODULE; return NULL; } \
+       if (!g_hal_tdm_backend_data->hwc_window_funcs) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; } \
+       hwc_window_funcs = g_hal_tdm_backend_data->hwc_window_funcs; \
+       if (!hwc_window_funcs->__func__) { if (*error) *error = HAL_TDM_ERROR_NOT_IMPLEMENTED; return NULL; };
 
 #define HWC_WINDOW_FUNC_ENTRY_VOID(__func__) \
-       hal_tdm_func_hwc_window *func_hwc_window; \
-       if (!g_tdm_funcs) return; \
-       if (!g_tdm_funcs->tdm_func_hwc_window) return; \
-       func_hwc_window = g_tdm_funcs->tdm_func_hwc_window; \
-       if (!func_hwc_window->__func__) return;
+       hal_tdm_hwc_window_funcs *hwc_window_funcs; \
+       if (!hwc_window) return; \
+       if (!g_hal_tdm_backend_data) return; \
+       if (!g_hal_tdm_backend_data->hwc_window_funcs) return; \
+       hwc_window_funcs = g_hal_tdm_backend_data->hwc_window_funcs; \
+       if (!hwc_window_funcs->__func__) return;
 
 #define PP_FUNC_ENTRY(__func__) \
-       hal_tdm_func_pp *func_pp; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_pp) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_pp = g_tdm_funcs->tdm_func_pp; \
-       if (!func_pp->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_pp_funcs *pp_funcs; \
+       if (!pp) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->pp_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       pp_funcs = g_hal_tdm_backend_data->pp_funcs; \
+       if (!pp_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define PP_FUNC_ENTRY_VOID(__func__) \
-       hal_tdm_func_pp *func_pp; \
-       if (!g_tdm_funcs) return; \
-       if (!g_tdm_funcs->tdm_func_pp) return; \
-       func_pp = g_tdm_funcs->tdm_func_pp; \
-       if (!func_pp->__func__) return;
+       hal_tdm_pp_funcs *pp_funcs; \
+       if (!pp) return; \
+       if (!g_hal_tdm_backend_data) return; \
+       if (!g_hal_tdm_backend_data->pp_funcs) return; \
+       pp_funcs = g_hal_tdm_backend_data->pp_funcs; \
+       if (!pp_funcs->__func__) return;
 
 #define CAPTURE_FUNC_ENTRY(__func__) \
-       hal_tdm_func_capture *func_capture; \
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_NO_MODULE; \
-       if (!g_tdm_funcs->tdm_func_capture) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
-       func_capture = g_tdm_funcs->tdm_func_capture; \
-       if (!func_capture->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
+       hal_tdm_capture_funcs *capture_funcs; \
+       if (!capture) return HAL_TDM_ERROR_INVALID_PARAMETER; \
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_NO_MODULE; \
+       if (!g_hal_tdm_backend_data->capture_funcs) return HAL_TDM_ERROR_NOT_IMPLEMENTED; \
+       capture_funcs = g_hal_tdm_backend_data->capture_funcs; \
+       if (!capture_funcs->__func__) return HAL_TDM_ERROR_NOT_IMPLEMENTED;
 
 #define CAPTURE_FUNC_ENTRY_VOID(__func__) \
-       hal_tdm_func_capture *func_capture; \
-       if (!g_tdm_funcs) return; \
-       if (!g_tdm_funcs->tdm_func_capture) return; \
-       func_capture = g_tdm_funcs->tdm_func_capture; \
-       if (!func_capture->__func__) return;
+       hal_tdm_capture_funcs *capture_funcs; \
+       if (!capture) return; \
+       if (!g_hal_tdm_backend_data) return; \
+       if (!g_hal_tdm_backend_data->capture_funcs) return; \
+       capture_funcs = g_hal_tdm_backend_data->capture_funcs; \
+       if (!capture_funcs->__func__) return;
 
-static hal_backend_tdm_funcs *g_tdm_funcs = NULL;
+static hal_tdm_backend_data *g_hal_tdm_backend_data = NULL;
 
-EXTERN hal_tdm_error
-hal_tdm_get_backend(hal_tdm_display *dpy)
+EXTERN hal_tdm_backend *
+hal_tdm_get_backend(hal_tdm_error *error)
 {
+       hal_tdm_backend_data *backend_data;
        int ret;
 
-       if (!dpy)
-               return HAL_TDM_ERROR_INVALID_PARAMETER;
-
-       if (g_tdm_funcs)
-               return HAL_TDM_ERROR_BAD_REQUEST;
-
-       g_tdm_funcs = calloc(1, sizeof(hal_backend_tdm_funcs));
-       if (!g_tdm_funcs)
-               return HAL_TDM_ERROR_OUT_OF_MEMORY;
+       if (g_hal_tdm_backend_data) {
+               if (error)
+                       *error = HAL_TDM_ERROR_BAD_REQUEST;
+               return NULL;
+       }
 
-       ret = hal_common_get_backend(HAL_MODULE_TDM, (void **)&dpy);
+       ret = hal_common_get_backend(HAL_MODULE_TDM, (void **)&backend_data);
        if (ret < 0) {
                 _E("Failed to get backend\n");
-                free(g_tdm_funcs);
-                g_tdm_funcs = NULL;
-               return HAL_TDM_ERROR_NO_MODULE;
+                if (error)
+                       *error = HAL_TDM_ERROR_NO_MODULE;
+               return NULL;
        }
 
+       g_hal_tdm_backend_data = (hal_tdm_backend_data *)backend_data;
+
+       if (error)
+               *error = HAL_TDM_ERROR_NONE;
+
        _I("hal_tdm_get_backend");
 
-       return HAL_TDM_ERROR_NONE;
+       return (hal_tdm_backend *)backend_data;
 }
 
-EXTERN void
-hal_tdm_put_backend(void)
+EXTERN hal_tdm_error
+hal_tdm_put_backend(hal_tdm_backend *backend)
 {
-       if (!g_tdm_funcs)
-               return;
+       hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
+       int ret;
 
-       hal_common_put_backend(HAL_MODULE_TDM, NULL);
-       free(g_tdm_funcs);
-       g_tdm_funcs = NULL;
+       if (!backend_data && g_hal_tdm_backend_data != backend) {
+               _E("no backend_data\n");
+               return HAL_TDM_ERROR_NO_MODULE;
+       }
+
+       ret = hal_common_put_backend(HAL_MODULE_TDM, NULL);
+       if (ret < 0) {
+                _E("Failed to put backend\n");
+                return HAL_TDM_ERROR_OPERATION_FAILED;
+       }
+
+       g_hal_tdm_backend_data = NULL;
 
        _I("hal_tdm_put_backend");
+
+       return HAL_TDM_ERROR_NONE;
+}
+
+EXTERN hal_tdm_display *
+hal_tdm_backend_get_display(hal_tdm_backend *backend, hal_tdm_error *error)
+{
+       hal_tdm_backend_data *backend_data = (hal_tdm_backend_data *)backend;
+       hal_tdm_display *display;
+
+       if (!backend_data && g_hal_tdm_backend_data != backend) {
+               _E("no backend_data\n");
+               if (error)
+                       *error = HAL_TDM_ERROR_NO_MODULE;
+               return NULL;
+       }
+
+       display = backend_data->display;
+       if (!display) {
+               _E("no display\n");
+               if (error)
+                       *error = HAL_TDM_ERROR_OPERATION_FAILED;
+               return NULL;
+       }
+
+       if (error)
+               *error = HAL_TDM_ERROR_NONE;
+
+       return display;
 }
 
-/* tdm_func_display */
+EXTERN hal_tdm_event_source **
+hal_tdm_backend_data_get_event_sources(hal_tdm_backend_data *backend_data, int num_event_sources, hal_tdm_error *error)
+{
+       hal_tdm_event_source **event_source;
+
+       if (!backend_data && g_hal_tdm_backend_data != backend_data) {
+               _E("no backend_data\n");
+               if (error)
+                       *error = HAL_TDM_ERROR_NO_MODULE;
+               return NULL;
+       }
+
+       event_source = backend_data->event_sources;
+
+       return backend_data->event_sources;
+}
+
+/* tdm_display_funcs */
 EXTERN hal_tdm_error
-hal_tdm_display_get_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_display *caps)
+hal_tdm_display_get_capability(hal_tdm_display *display, hal_tdm_caps_display *caps)
 {
        DISPLAY_FUNC_ENTRY(display_get_capability);
-       return func_display->display_get_capability(bdata, caps);
+
+       return display_funcs->display_get_capability(display, caps);
 }
 
 EXTERN hal_tdm_error
-hal_tdm_display_get_pp_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_pp *caps)
+hal_tdm_display_get_pp_capability(hal_tdm_display *display, hal_tdm_caps_pp *caps)
 {
        DISPLAY_FUNC_ENTRY(display_get_pp_capability);
-       return func_display->display_get_pp_capability(bdata, caps);
+
+       return display_funcs->display_get_pp_capability(display, caps);
 }
 
 EXTERN hal_tdm_error
-hal_tdm_display_get_capture_capability(hal_tdm_backend_data *bdata, hal_tdm_caps_capture *caps)
+hal_tdm_display_get_capture_capability(hal_tdm_display *display, hal_tdm_caps_capture *caps)
 {
        DISPLAY_FUNC_ENTRY(display_get_capture_capability);
-       return func_display->display_get_capture_capability(bdata, caps);
+
+       return display_funcs->display_get_capture_capability(display, caps);
 }
 
 EXTERN hal_tdm_output **
-hal_tdm_display_get_outputs(hal_tdm_backend_data *bdata, int *count, hal_tdm_error *error)
+hal_tdm_display_get_outputs(hal_tdm_display *display, int *count, hal_tdm_error *error)
 {
        DISPLAY_FUNC_ENTRY_NULL(display_get_outputs);
-       return func_display->display_get_outputs(bdata, count, error);
+
+       return display_funcs->display_get_outputs(display, count, error);
 }
 
 EXTERN hal_tdm_error
-hal_tdm_display_get_fd(hal_tdm_backend_data *bdata, int *fd)
+hal_tdm_display_get_fd(hal_tdm_display *display, int *fd)
 {
        DISPLAY_FUNC_ENTRY(display_get_fd);
-       return func_display->display_get_fd(bdata, fd);
+
+       return display_funcs->display_get_fd(display, fd);
 }
 
 EXTERN hal_tdm_error
-hal_tdm_display_handle_events(hal_tdm_backend_data *bdata)
+hal_tdm_display_handle_events(hal_tdm_display *display)
 {
        DISPLAY_FUNC_ENTRY(display_handle_events);
-       return func_display->display_handle_events(bdata);
+
+       return display_funcs->display_handle_events(display);
 }
 
 EXTERN hal_tdm_pp *
-hal_tdm_display_create_pp(hal_tdm_backend_data *bdata, hal_tdm_error *error)
+hal_tdm_display_create_pp(hal_tdm_display *display, hal_tdm_error *error)
 {
        DISPLAY_FUNC_ENTRY_NULL(display_create_pp);
-       return func_display->display_create_pp(bdata, error);
+
+       return display_funcs->display_create_pp(display, error);
 }
 
 EXTERN hal_tdm_voutput *
-hal_tdm_display_voutput_create(hal_tdm_backend_data *bdata, const char *name, hal_tdm_error *error)
+hal_tdm_display_voutput_create(hal_tdm_display *display, const char *name, hal_tdm_error *error)
 {
        DISPLAY_FUNC_ENTRY_NULL(display_voutput_create);
-       return func_display->display_voutput_create(bdata, name, error);
+
+       return display_funcs->display_voutput_create(display, name, error);
 }
 
 
-/* tdm_func_output */
+/* output_funcs */
 EXTERN hal_tdm_error
 hal_tdm_output_get_capability(hal_tdm_output *output, hal_tdm_caps_output *caps)
 {
        OUTPUT_FUNC_ENTRY(output_get_capability);
-       return func_output->output_get_capability(output, caps);
+
+       return output_funcs->output_get_capability(output, caps);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_property(hal_tdm_output *output, unsigned int id, hal_tdm_value value)
 {
        OUTPUT_FUNC_ENTRY(output_set_property);
-       return func_output->output_set_property(output, id, value);
+
+       return output_funcs->output_set_property(output, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_get_property(hal_tdm_output *output, unsigned int id, hal_tdm_value *value)
 {
        OUTPUT_FUNC_ENTRY(output_get_property);
-       return func_output->output_get_property(output, id, value);
+
+       return output_funcs->output_get_property(output, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_wait_vblank(hal_tdm_output *output, int interval, int sync, void *user_data)
 {
        OUTPUT_FUNC_ENTRY(output_wait_vblank);
-       return func_output->output_wait_vblank(output, interval, sync, user_data);
+
+       return output_funcs->output_wait_vblank(output, interval, sync, user_data);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_vblank_handler(hal_tdm_output *output, hal_tdm_output_vblank_handler func)
 {
        OUTPUT_FUNC_ENTRY(output_set_vblank_handler);
-       return func_output->output_set_vblank_handler(output, func);
+
+       return output_funcs->output_set_vblank_handler(output, func);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_commit(hal_tdm_output *output, int sync, void *user_data)
 {
        OUTPUT_FUNC_ENTRY(output_commit);
-       return func_output->output_commit(output, sync, user_data);
+
+       return output_funcs->output_commit(output, sync, user_data);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_commit_handler(hal_tdm_output *output, hal_tdm_output_commit_handler func)
 {
        OUTPUT_FUNC_ENTRY(output_set_commit_handler);
-       return func_output->output_set_commit_handler(output, func);
+
+       return output_funcs->output_set_commit_handler(output, func);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_dpms(hal_tdm_output *output, hal_tdm_output_dpms dpms_value)
 {
        OUTPUT_FUNC_ENTRY(output_set_dpms);
-       return func_output->output_set_dpms(output, dpms_value);
+
+       return output_funcs->output_set_dpms(output, dpms_value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_get_dpms(hal_tdm_output *output, hal_tdm_output_dpms *dpms_value)
 {
        OUTPUT_FUNC_ENTRY(output_get_dpms);
-       return func_output->output_get_dpms(output, dpms_value);
+
+       return output_funcs->output_get_dpms(output, dpms_value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_mode(hal_tdm_output *output, const hal_tdm_output_mode *mode)
 {
        OUTPUT_FUNC_ENTRY(output_set_mode);
-       return func_output->output_set_mode(output, mode);
+
+       return output_funcs->output_set_mode(output, mode);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_get_mode(hal_tdm_output *output, const hal_tdm_output_mode **mode)
 {
        OUTPUT_FUNC_ENTRY(output_get_mode);
-       return func_output->output_get_mode(output, mode);
+
+       return output_funcs->output_get_mode(output, mode);
 }
 
 EXTERN hal_tdm_capture *
 hal_tdm_output_create_capture(hal_tdm_output *output, hal_tdm_error *error)
 {
        OUTPUT_FUNC_ENTRY_NULL(output_create_capture);
-       return func_output->output_create_capture(output, error);
+
+       return output_funcs->output_create_capture(output, error);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_status_handler(hal_tdm_output *output, hal_tdm_output_status_handler func, void *user_data)
 {
        OUTPUT_FUNC_ENTRY(output_set_status_handler);
-       return func_output->output_set_status_handler(output, func, user_data);
+
+       return output_funcs->output_set_status_handler(output, func, user_data);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_dpms_handler(hal_tdm_output *output, hal_tdm_output_dpms_handler func, void *user_data)
 {
        OUTPUT_FUNC_ENTRY(output_set_dpms_handler);
-       return func_output->output_set_dpms_handler(output, func, user_data);
+
+       return output_funcs->output_set_dpms_handler(output, func, user_data);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_dpms_async(hal_tdm_output *output, hal_tdm_output_dpms dpms_value, int *sync)
 {
        OUTPUT_FUNC_ENTRY(output_set_dpms_async);
-       return func_output->output_set_dpms_async(output, dpms_value, sync);
+
+       return output_funcs->output_set_dpms_async(output, dpms_value, sync);
 }
 
 EXTERN hal_tdm_hwc *
 hal_tdm_output_get_hwc(hal_tdm_output *output, hal_tdm_error *error)
 {
        OUTPUT_FUNC_ENTRY_NULL(output_get_hwc);
-       return func_output->output_get_hwc(output, error);
+
+       return output_funcs->output_get_hwc(output, error);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_set_mirror(hal_tdm_output *output, hal_tdm_output *src_output, hal_tdm_transform transform)
 {
        OUTPUT_FUNC_ENTRY(output_set_mirror);
-       return func_output->output_set_mirror(output, src_output, transform);
+
+       return output_funcs->output_set_mirror(output, src_output, transform);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_output_unset_mirror(hal_tdm_output *output)
 {
        OUTPUT_FUNC_ENTRY(output_unset_mirror);
-       return func_output->output_unset_mirror(output);
+
+       return output_funcs->output_unset_mirror(output);
 }
 
 
-/* tdm_func_voutput */
+/* voutput_funcs */
 EXTERN hal_tdm_error
 hal_tdm_voutput_destroy(hal_tdm_voutput *voutput)
 {
        VOUTPUT_FUNC_ENTRY(voutput_destroy);
-       return func_voutput->voutput_destroy(voutput);
+
+       return voutput_funcs->voutput_destroy(voutput);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_set_available_mode(hal_tdm_voutput *voutput, const hal_tdm_output_mode *modes, int count)
 {
        VOUTPUT_FUNC_ENTRY(voutput_set_available_mode);
-       return func_voutput->voutput_set_available_mode(voutput, modes, count);
+
+       return voutput_funcs->voutput_set_available_mode(voutput, modes, count);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_set_physical_size(hal_tdm_voutput *voutput, unsigned int mmwidth, unsigned int mmheight)
 {
        VOUTPUT_FUNC_ENTRY(voutput_set_physical_size);
-       return func_voutput->voutput_set_physical_size(voutput, mmwidth, mmheight);
+
+       return voutput_funcs->voutput_set_physical_size(voutput, mmwidth, mmheight);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_connect(hal_tdm_voutput *voutput)
 {
        VOUTPUT_FUNC_ENTRY(voutput_connect);
-       return func_voutput->voutput_connect(voutput);
+
+       return voutput_funcs->voutput_connect(voutput);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_disconnect(hal_tdm_voutput *voutput)
 {
        VOUTPUT_FUNC_ENTRY(voutput_disconnect);
-       return func_voutput->voutput_disconnect(voutput);
+
+       return voutput_funcs->voutput_disconnect(voutput);
 }
 
 EXTERN hal_tdm_output *
 hal_tdm_voutput_get_output(hal_tdm_voutput *voutput, hal_tdm_error *error)
 {
        VOUTPUT_FUNC_ENTRY_NULL(voutput_get_output);
-       return func_voutput->voutput_get_output(voutput, error);
+
+       return voutput_funcs->voutput_get_output(voutput, error);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_set_commit_func(hal_tdm_voutput *voutput, hal_tdm_voutput_commit_handler commit_func)
 {
        VOUTPUT_FUNC_ENTRY(voutput_set_commit_func);
-       return func_voutput->voutput_set_commit_func(voutput, commit_func);
+
+       return voutput_funcs->voutput_set_commit_func(voutput, commit_func);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_commit_done(hal_tdm_voutput *voutput)
 {
        VOUTPUT_FUNC_ENTRY(voutput_commit_done);
-       return func_voutput->voutput_commit_done(voutput);
+
+       return voutput_funcs->voutput_commit_done(voutput);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_voutput_set_target_buffer_queue_flag(hal_tdm_voutput *voutput, int flags)
 {
        VOUTPUT_FUNC_ENTRY(voutput_set_target_buffer_queue_flag);
-       return func_voutput->voutput_set_target_buffer_queue_flag(voutput, flags);
+
+       return voutput_funcs->voutput_set_target_buffer_queue_flag(voutput, flags);
 }
 
 
-/* tdm_func_hwc */
+/* hwc_funcs */
 EXTERN hal_tdm_hwc_window *
 hal_tdm_hwc_create_window(hal_tdm_hwc *hwc, hal_tdm_error *error)
 {
        HWC_FUNC_ENTRY_NULL(hwc_create_window);
-       return func_hwc->hwc_create_window(hwc, error);
+
+       return hwc_funcs->hwc_create_window(hwc, error);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_video_supported_formats(hal_tdm_hwc *hwc, const tbm_format **formats, int *count)
 {
        HWC_FUNC_ENTRY(hwc_get_video_supported_formats);
-       return func_hwc->hwc_get_video_supported_formats(hwc, formats, count);
+
+       return hwc_funcs->hwc_get_video_supported_formats(hwc, formats, count);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_video_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count)
 {
        HWC_FUNC_ENTRY(hwc_get_video_available_properties);
-       return func_hwc->hwc_get_video_available_properties(hwc, props, count);
+
+       return hwc_funcs->hwc_get_video_available_properties(hwc, props, count);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_capabilities(hal_tdm_hwc *hwc, hal_tdm_hwc_capability *capabilities)
 {
        HWC_FUNC_ENTRY(hwc_get_capabilities);
-       return func_hwc->hwc_get_capabilities(hwc, capabilities);
+
+       return hwc_funcs->hwc_get_capabilities(hwc, capabilities);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_available_properties(hal_tdm_hwc *hwc, const hal_tdm_prop **props, int *count)
 {
        HWC_FUNC_ENTRY(hwc_get_available_properties);
-       return func_hwc->hwc_get_available_properties(hwc, props, count);
+
+       return hwc_funcs->hwc_get_available_properties(hwc, props, count);
 }
 
 EXTERN tbm_surface_queue_h
 hal_tdm_hwc_get_client_target_buffer_queue(hal_tdm_hwc *hwc, hal_tdm_error *error)
 {
        HWC_FUNC_ENTRY_NULL(hwc_get_client_target_buffer_queue);
-       return func_hwc->hwc_get_client_target_buffer_queue(hwc, error);
+
+       return hwc_funcs->hwc_get_client_target_buffer_queue(hwc, error);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_set_client_target_buffer(hal_tdm_hwc *hwc, tbm_surface_h target_buffer, hal_tdm_region damage)
 {
        HWC_FUNC_ENTRY(hwc_set_client_target_buffer);
-       return func_hwc->hwc_set_client_target_buffer(hwc, target_buffer, damage);
+
+       return hwc_funcs->hwc_set_client_target_buffer(hwc, target_buffer, damage);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_set_client_target_acquire_fence(hal_tdm_hwc *hwc, int acquire_fence)
 {
        HWC_FUNC_ENTRY(hwc_set_client_target_acquire_fence);
-       return func_hwc->hwc_set_client_target_acquire_fence(hwc, acquire_fence);
+
+       return hwc_funcs->hwc_set_client_target_acquire_fence(hwc, acquire_fence);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_validate(hal_tdm_hwc *hwc, hal_tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types)
 {
        HWC_FUNC_ENTRY(hwc_validate);
-       return func_hwc->hwc_validate(hwc, composited_wnds, num_wnds, num_types);
+
+       return hwc_funcs->hwc_validate(hwc, composited_wnds, num_wnds, num_types);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_changed_composition_types(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_window, hal_tdm_hwc_window_composition *composition_types)
 {
        HWC_FUNC_ENTRY(hwc_get_changed_composition_types);
-       return func_hwc->hwc_get_changed_composition_types(hwc, num_elements, hwc_window, composition_types);
+
+       return hwc_funcs->hwc_get_changed_composition_types(hwc, num_elements, hwc_window, composition_types);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_accept_validation(hal_tdm_hwc *hwc)
 {
        HWC_FUNC_ENTRY(hwc_accept_validation);
-       return func_hwc->hwc_accept_validation(hwc);
+
+       return hwc_funcs->hwc_accept_validation(hwc);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_commit(hal_tdm_hwc *hwc, int sync, void *user_data)
 {
        HWC_FUNC_ENTRY(hwc_commit);
-       return func_hwc->hwc_commit(hwc, sync, user_data);
+
+       return hwc_funcs->hwc_commit(hwc, sync, user_data);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_set_commit_handler(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_handler func)
 {
        HWC_FUNC_ENTRY(hwc_set_commit_handler);
-       return func_hwc->hwc_set_commit_handler(hwc, func);
+
+       return hwc_funcs->hwc_set_commit_handler(hwc, func);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_commit_fence(hal_tdm_hwc *hwc, int *commit_fence)
 {
        HWC_FUNC_ENTRY(hwc_get_commit_fence);
-       return func_hwc->hwc_get_commit_fence(hwc, commit_fence);
+
+       return hwc_funcs->hwc_get_commit_fence(hwc, commit_fence);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_release_fences(hal_tdm_hwc *hwc, uint32_t *num_elements, hal_tdm_hwc_window **hwc_windows, int *release_fences)
 {
        HWC_FUNC_ENTRY(hwc_get_release_fences);
-       return func_hwc->hwc_get_release_fences(hwc, num_elements, hwc_windows, release_fences);
+
+       return hwc_funcs->hwc_get_release_fences(hwc, num_elements, hwc_windows, release_fences);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_set_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value value)
 {
        HWC_FUNC_ENTRY(hwc_set_property);
-       return func_hwc->hwc_set_property(hwc, id, value);
+
+       return hwc_funcs->hwc_set_property(hwc, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_property(hal_tdm_hwc *hwc, uint32_t id, hal_tdm_value *value)
 {
        HWC_FUNC_ENTRY(hwc_get_property);
-       return func_hwc->hwc_get_property(hwc, id, value);
+
+       return hwc_funcs->hwc_get_property(hwc, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_get_commit_interval(hal_tdm_hwc *hwc, hal_tdm_hwc_commit_interval *interval)
 {
        HWC_FUNC_ENTRY(hwc_get_commit_interval);
-       return func_hwc->hwc_get_commit_interval(hwc, interval);
+
+       return hwc_funcs->hwc_get_commit_interval(hwc, interval);
 }
 
 
-/* tdm_func_hwc_window */
+/* hwc_window_funcs */
 EXTERN void
 hal_tdm_hwc_window_destroy(hal_tdm_hwc_window *hwc_window)
 {
        HWC_WINDOW_FUNC_ENTRY_VOID(hwc_window_destroy);
-       func_hwc_window->hwc_window_destroy(hwc_window);
+
+       hwc_window_funcs->hwc_window_destroy(hwc_window);
 }
 
 EXTERN tbm_surface_queue_h
 hal_tdm_hwc_window_acquire_buffer_queue(hal_tdm_hwc_window *hwc_window, hal_tdm_error *error)
 {
        HWC_WINDOW_FUNC_ENTRY_NULL(hwc_window_acquire_buffer_queue);
-       return func_hwc_window->hwc_window_acquire_buffer_queue(hwc_window, error);
+
+       return hwc_window_funcs->hwc_window_acquire_buffer_queue(hwc_window, error);
 }
 
 EXTERN void
 hal_tdm_hwc_window_release_buffer_queue(hal_tdm_hwc_window *hwc_window, tbm_surface_queue_h queue)
 {
        HWC_WINDOW_FUNC_ENTRY_VOID(hwc_window_release_buffer_queue);
-       func_hwc_window->hwc_window_release_buffer_queue(hwc_window, queue);
+
+       hwc_window_funcs->hwc_window_release_buffer_queue(hwc_window, queue);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_composition_type(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_composition composition_type)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_composition_type);
-       return func_hwc_window->hwc_window_set_composition_type(hwc_window, composition_type);
+
+       return hwc_window_funcs->hwc_window_set_composition_type(hwc_window, composition_type);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_buffer_damage(hal_tdm_hwc_window *hwc_window, hal_tdm_region damage)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_buffer_damage);
-       return func_hwc_window->hwc_window_set_buffer_damage(hwc_window, damage);
+
+       return hwc_window_funcs->hwc_window_set_buffer_damage(hwc_window, damage);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_info(hal_tdm_hwc_window *hwc_window, hal_tdm_hwc_window_info *info)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_info);
-       return func_hwc_window->hwc_window_set_info(hwc_window, info);
+
+       return hwc_window_funcs->hwc_window_set_info(hwc_window, info);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_buffer(hal_tdm_hwc_window *hwc_window, tbm_surface_h buffer)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_buffer);
-       return func_hwc_window->hwc_window_set_buffer(hwc_window, buffer);
+
+       return hwc_window_funcs->hwc_window_set_buffer(hwc_window, buffer);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value value)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_property);
-       return func_hwc_window->hwc_window_set_property(hwc_window, id, value);
+
+       return hwc_window_funcs->hwc_window_set_property(hwc_window, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_get_property(hal_tdm_hwc_window *hwc_window, uint32_t id, hal_tdm_value *value)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_get_property);
-       return func_hwc_window->hwc_window_get_property(hwc_window, id, value);
+
+       return hwc_window_funcs->hwc_window_get_property(hwc_window, id, value);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_get_constraints(hal_tdm_hwc_window *hwc_window, int *constraints)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_get_constraints);
-       return func_hwc_window->hwc_window_get_constraints(hwc_window, constraints);
+
+       return hwc_window_funcs->hwc_window_get_constraints(hwc_window, constraints);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_name(hal_tdm_hwc_window *hwc_window, const char *name)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_name);
-       return func_hwc_window->hwc_window_set_name(hwc_window, name);
+
+       return hwc_window_funcs->hwc_window_set_name(hwc_window, name);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_cursor_image(hal_tdm_hwc_window *hwc_window, int width, int height, int stride, void *ptr)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_cursor_image);
-       return func_hwc_window->hwc_window_set_cursor_image(hwc_window, width, height, stride, ptr);
+
+       return hwc_window_funcs->hwc_window_set_cursor_image(hwc_window, width, height, stride, ptr);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_hwc_window_set_acquire_fence(hal_tdm_hwc_window *hwc_window, int acquire_fence)
 {
        HWC_WINDOW_FUNC_ENTRY(hwc_window_set_acquire_fence);
-       return func_hwc_window->hwc_window_set_acquire_fence(hwc_window, acquire_fence);
+
+       return hwc_window_funcs->hwc_window_set_acquire_fence(hwc_window, acquire_fence);
 }
 
 
-/* tdm_func_pp */
+/* pp_funcs */
 EXTERN void
 hal_tdm_pp_destroy(hal_tdm_pp *pp)
 {
        PP_FUNC_ENTRY_VOID(pp_destroy);
-       func_pp->pp_destroy(pp);
+       pp_funcs->pp_destroy(pp);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_pp_set_info(hal_tdm_pp *pp, hal_tdm_info_pp *info)
 {
        PP_FUNC_ENTRY(pp_set_info);
-       return func_pp->pp_set_info(pp, info);
+
+       return pp_funcs->pp_set_info(pp, info);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_pp_attach(hal_tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst)
 {
        PP_FUNC_ENTRY(pp_attach);
-       return func_pp->pp_attach(pp, src, dst);
+
+       return pp_funcs->pp_attach(pp, src, dst);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_pp_commit(hal_tdm_pp *pp)
 {
        PP_FUNC_ENTRY(pp_commit);
-       return func_pp->pp_commit(pp);
+
+       return pp_funcs->pp_commit(pp);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_pp_set_done_handler(hal_tdm_pp *pp, hal_tdm_pp_done_handler func, void *user_data)
 {
        PP_FUNC_ENTRY(pp_set_done_handler);
-       return func_pp->pp_set_done_handler(pp, func, user_data);
+
+       return pp_funcs->pp_set_done_handler(pp, func, user_data);
 }
 
 
-/* tdm_func_capture */
+/* capture_funcs */
 EXTERN void
 hal_tdm_capture_destroy(hal_tdm_capture *capture)
 {
        CAPTURE_FUNC_ENTRY_VOID(capture_destroy);
-       func_capture->capture_destroy(capture);
+       capture_funcs->capture_destroy(capture);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_capture_set_info(hal_tdm_capture *capture, hal_tdm_info_capture *info)
 {
        CAPTURE_FUNC_ENTRY(capture_set_info);
-       return func_capture->capture_set_info(capture, info);
+
+       return capture_funcs->capture_set_info(capture, info);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_capture_attach(hal_tdm_capture *capture, tbm_surface_h buffer)
 {
        CAPTURE_FUNC_ENTRY(capture_attach);
-       return func_capture->capture_attach(capture, buffer);
+
+       return capture_funcs->capture_attach(capture, buffer);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_capture_commit(hal_tdm_capture *capture)
 {
        CAPTURE_FUNC_ENTRY(capture_commit);
-       return func_capture->capture_commit(capture);
+
+       return capture_funcs->capture_commit(capture);
 }
 
 EXTERN hal_tdm_error
 hal_tdm_capture_set_done_handler(hal_tdm_capture *capture, hal_tdm_capture_done_handler func, void *user_data)
 {
        CAPTURE_FUNC_ENTRY(capture_set_done_handler);
-       return func_capture->capture_set_done_handler(capture, func, user_data);
+
+       return capture_funcs->capture_set_done_handler(capture, func, user_data);
 }
 
 
 /* tdm_backend_func */
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_display(hal_tdm_display *dpy, hal_tdm_func_display *func_display)
+hal_tdm_backend_register_display_funcs(hal_tdm_display *dpy, hal_tdm_display_funcs *display_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_display) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_display) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_display = func_display;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->display_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !display_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->display_funcs = display_funcs;
+
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_output(hal_tdm_display *dpy, hal_tdm_func_output *func_output)
+hal_tdm_backend_register_output_funcs(hal_tdm_display *dpy, hal_tdm_output_funcs *output_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_output) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_output) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_output = func_output;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->output_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !output_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->output_funcs = output_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_voutput(hal_tdm_display *dpy, hal_tdm_func_voutput *func_voutput)
+hal_tdm_backend_register_voutput_funcs(hal_tdm_display *dpy, hal_tdm_voutput_funcs *voutput_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_voutput) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_voutput) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_voutput = func_voutput;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->voutput_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !voutput_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->voutput_funcs = voutput_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_hwc(hal_tdm_display *dpy, hal_tdm_func_hwc *func_hwc)
+hal_tdm_backend_register_hwc_funcs(hal_tdm_display *dpy, hal_tdm_hwc_funcs *hwc_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_hwc) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_hwc) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_hwc = func_hwc;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->hwc_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !hwc_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->hwc_funcs = hwc_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_hwc_window(hal_tdm_display *dpy, hal_tdm_func_hwc_window *func_hwc_window)
+hal_tdm_backend_register_hwc_window_funcs(hal_tdm_display *dpy, hal_tdm_hwc_window_funcs *hwc_window_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_hwc_window) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_hwc_window) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_hwc_window = func_hwc_window;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->hwc_window_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !hwc_window_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->hwc_window_funcs = hwc_window_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_pp(hal_tdm_display *dpy, hal_tdm_func_pp *func_pp)
+hal_tdm_backend_register_pp_funcs(hal_tdm_display *dpy, hal_tdm_pp_funcs *pp_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_pp) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_pp) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_pp = func_pp;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->pp_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !pp_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->pp_funcs = pp_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
 EXTERN hal_tdm_error
-hal_tdm_backend_register_func_capture(hal_tdm_display *dpy, hal_tdm_func_capture *func_capture)
+hal_tdm_backend_register_capture_funcs(hal_tdm_display *dpy, hal_tdm_capture_funcs *capture_funcs)
 {
-       if (!g_tdm_funcs) return HAL_TDM_ERROR_OPERATION_FAILED;
-       if (g_tdm_funcs->tdm_func_capture) return HAL_TDM_ERROR_BAD_REQUEST;
-       if (!dpy || !func_capture) return HAL_TDM_ERROR_INVALID_PARAMETER;
-       g_tdm_funcs->tdm_func_capture = func_capture;
+       if (!g_hal_tdm_backend_data) return HAL_TDM_ERROR_OPERATION_FAILED;
+       if (g_hal_tdm_backend_data->capture_funcs) return HAL_TDM_ERROR_BAD_REQUEST;
+       if (!dpy || !capture_funcs) return HAL_TDM_ERROR_INVALID_PARAMETER;
+       g_hal_tdm_backend_data->capture_funcs = capture_funcs;
        return HAL_TDM_ERROR_NONE;
 }
 
@@ -847,32 +994,3 @@ hal_tdm_buffer_remove_destroy_handler(tbm_surface_h buffer, hal_tdm_buffer_destr
 {
 //     tdm_buffer_remove_destroy_handler(buffer, func, user_data);
 }
-
-EXTERN hal_tdm_event_loop_source *
-hal_tdm_event_loop_add_fd_handler(hal_tdm_display *dpy, int fd, hal_tdm_event_loop_mask mask,
-                                                         hal_tdm_event_loop_fd_handler func, void *user_data, hal_tdm_error *error)
-{
-//     return tdm_event_loop_add_fd_handler(dpy, fd, mask, func, user_data, error);
-       return NULL;
-}
-
-EXTERN hal_tdm_event_loop_source *
-hal_tdm_event_loop_add_timer_handler(hal_tdm_display *dpy, hal_tdm_event_loop_timer_handler func,
-                                                                void *user_data, hal_tdm_error *error)
-{
-//     return tdm_event_loop_add_timer_handler(dpy, func, user_data, error);
-       return NULL;
-}
-
-EXTERN hal_tdm_error
-hal_tdm_event_loop_source_timer_update(hal_tdm_event_loop_source *source, unsigned int ms_delay)
-{
-//     return tdm_event_loop_source_timer_update(source, ms_delay);
-       return HAL_TDM_ERROR_NONE;
-}
-
-EXTERN void
-hal_tdm_event_loop_source_remove(hal_tdm_event_loop_source *source)
-{
-//     tdm_event_loop_source_remove(source);
-}