hwc: added backend function of video
[platform/adaptation/spreadtrum/libtdm-sprd.git] / src / tdm_sprd.h
1 #ifndef _TDM_SPRD_H_
2 #define _TDM_SPRD_H_
3
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7 #include <pthread.h>
8 #include <errno.h>
9 #include <unistd.h>
10 #include <limits.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13 #include <sys/ioctl.h>
14 #include <fcntl.h>
15
16 #include <xf86drm.h>
17 #include <tbm_surface.h>
18 #include <tbm_surface_internal.h>
19 #include <tbm_surface_queue.h>
20 #include <tdm_backend.h>
21 #include <tdm_log.h>
22 #include <tdm_list.h>
23 #include "sprd_pp_7727.h"
24 /* sprd backend functions (display) */
25 tdm_error    sprd_display_get_capability(tdm_backend_data *bdata, tdm_caps_display *caps);
26 tdm_error    sprd_display_get_pp_capability(tdm_backend_data *bdata, tdm_caps_pp *caps);
27 tdm_output** sprd_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error);
28 tdm_error    sprd_display_get_fd(tdm_backend_data *bdata, int *fd);
29 tdm_error    sprd_display_handle_events(tdm_backend_data *bdata);
30 tdm_pp*      sprd_display_create_pp(tdm_backend_data *bdata, tdm_error *error);
31 tdm_error    sprd_output_get_capability(tdm_output *output, tdm_caps_output *caps);
32 tdm_layer**  sprd_output_get_layers(tdm_output *output, int *count, tdm_error *error);
33 tdm_error    sprd_output_set_property(tdm_output *output, unsigned int id, tdm_value value);
34 tdm_error    sprd_output_get_property(tdm_output *output, unsigned int id, tdm_value *value);
35 tdm_error    sprd_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_data);
36 tdm_error    sprd_output_set_vblank_handler(tdm_output *output, tdm_output_vblank_handler func);
37 tdm_error    sprd_output_commit(tdm_output *output, int sync, void *user_data);
38 tdm_error    sprd_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func);
39 tdm_error    sprd_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value);
40 tdm_error    sprd_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value);
41 tdm_error    sprd_output_set_mode(tdm_output *output, const tdm_output_mode *mode);
42 tdm_error    sprd_output_get_mode(tdm_output *output, const tdm_output_mode **mode);
43 tdm_hwc *    sprd_output_get_hwc(tdm_output *output, tdm_error *error);
44
45 tdm_error    sprd_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
46 tdm_error    sprd_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value);
47 tdm_error    sprd_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value);
48 tdm_error    sprd_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
49 tdm_error    sprd_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
50 tdm_error    sprd_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
51 tdm_error    sprd_layer_unset_buffer(tdm_layer *layer);
52 tdm_error    sprd_layer_get_buffer_flags(tdm_layer *layer, unsigned int *flags);
53
54 tdm_hwc_window     *sprd_hwc_create_window(tdm_hwc *hwc, tdm_error *error);
55 tdm_error           sprd_hwc_get_video_supported_formats(tdm_hwc *hwc, const tbm_format **formats, int *count);
56 tdm_error           sprd_hwc_get_video_capability(tdm_hwc *hwc, tdm_hwc_video_capability *video_capability);
57 tdm_error           sprd_hwc_get_available_properties(tdm_hwc *hwc, const tdm_prop **props, int *count);
58 tbm_surface_queue_h sprd_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error);
59 tdm_error           sprd_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h buffer, tdm_region damage);
60 tdm_error           sprd_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types);
61 tdm_error           sprd_hwc_get_changed_composition_types(tdm_hwc *hwc, uint32_t *num_elements, tdm_hwc_window **hwc_window, tdm_hwc_window_composition *composition_types);
62 tdm_error           sprd_hwc_accept_changes(tdm_hwc *hwc);
63 tdm_error           sprd_hwc_commit(tdm_hwc *hwc, int sync, void *user_data);
64 tdm_error           sprd_hwc_set_commit_handler(tdm_hwc *hwc, tdm_hwc_commit_handler func);
65
66 void         sprd_hwc_window_destroy(tdm_hwc_window *hwc_window);
67 tdm_error    sprd_hwc_window_set_composition_type(tdm_hwc_window *hwc_window, tdm_hwc_window_composition composition_type);
68 tdm_error    sprd_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_region damage);
69 tdm_error    sprd_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info);
70 tdm_error    sprd_hwc_window_get_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info);
71 tdm_error    sprd_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h surface);
72 tdm_error    sprd_hwc_window_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value);
73 tdm_error    sprd_hwc_window_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value);
74
75 void         sprd_pp_destroy(tdm_pp *pp);
76 tdm_error    sprd_pp_set_info(tdm_pp *pp, tdm_info_pp *info);
77 tdm_error    sprd_pp_attach(tdm_pp *pp, tbm_surface_h src, tbm_surface_h dst);
78 tdm_error    sprd_pp_commit(tdm_pp *pp);
79 tdm_error    sprd_pp_set_done_handler(tdm_pp *pp, tdm_pp_done_handler func, void *user_data);
80
81 /* Capture funcs */
82 tdm_error    sprd_capture_get_capability (tdm_backend_data *bdata, tdm_caps_capture *caps);
83 tdm_capture* sprd_capture_create (tdm_output *output, tdm_error *error);
84 void         sprd_capture_destroy(tdm_capture *capture);
85 tdm_error    sprd_capture_attach(tdm_capture *capture, tbm_surface_h buffer);
86 tdm_error    sprd_capture_set_info(tdm_capture *capture, tdm_info_capture *info);
87 tdm_error    sprd_capture_commit(tdm_capture *capture);
88 tdm_error    sprd_capture_set_done_handler(tdm_capture *capture, tdm_capture_done_handler func, void *user_data);
89
90 tdm_error    sprd_output_attach_capture(tdm_output *output, tdm_capture *capture);
91 void         sprd_output_dettach_capture(tdm_output *output, tdm_capture *capture);
92
93
94
95 tdm_backend_data* sprd_output_get_sprd_data(tdm_output *output);
96
97 /* sprd module internal macros, structures, functions */
98 #define NEVER_GET_HERE() TDM_ERR("** NEVER GET HERE **")
99
100 #define C(b, m)            (((b) >> (m)) & 0xFF)
101 #define B(c, s)            ((((unsigned int)(c)) & 0xff) << (s))
102 #define FOURCC(a, b, c, d) (B(d, 24) | B(c, 16) | B(b, 8) | B(a, 0))
103 #define FOURCC_STR(id)     C(id, 0), C(id, 8), C(id, 16), C(id, 24)
104
105 #define IS_RGB(format)     (format == TBM_FORMAT_XRGB8888 || format == TBM_FORMAT_ARGB8888 || \
106                                                         format == TBM_FORMAT_XBGR8888 || format == TBM_FORMAT_ABGR8888)
107
108 #define CLEAR(x) memset(&(x), 0, sizeof(x))
109 #define MAX(a, b) (((a) > (b)) ? (a) : (b))
110 #define MIN(a, b) (((a) < (b)) ? (a) : (b))
111 #define SWAP(a, b)  ({int t; t = a; a = b; b = t; })
112 #define ROUNDUP(x)  (ceil(floor((float)(height) / 4)))
113
114 #define ALIGN_TO_16B(x)    ((((x) + (1 <<  4) - 1) >>  4) <<  4)
115 #define ALIGN_TO_32B(x)    ((((x) + (1 <<  5) - 1) >>  5) <<  5)
116 #define ALIGN_TO_128B(x)   ((((x) + (1 <<  7) - 1) >>  7) <<  7)
117 #define ALIGN_TO_2KB(x)    ((((x) + (1 << 11) - 1) >> 11) << 11)
118 #define ALIGN_TO_8KB(x)    ((((x) + (1 << 13) - 1) >> 13) << 13)
119 #define ALIGN_TO_64KB(x)   ((((x) + (1 << 16) - 1) >> 16) << 16)
120
121 #define RETURN_VAL_IF_FAIL(cond, val) {\
122         if (!(cond)) {\
123                 TDM_ERR("'%s' failed", #cond);\
124                 return val;\
125         } \
126 }
127 #define LAYER_COUNT_PER_OUTPUT   2
128 #define NOP
129
130 #define RETURN_VOID_IF_FAIL(cond) RETURN_VAL_IF_FAIL(cond, NOP)
131
132 typedef struct _tdm_sprd_data {
133         drmEventContext evctx;
134
135         tdm_display *dpy;
136         int drm_fd;
137         int output_count;
138
139         int hwc_mode;
140
141         struct list_head output_list;
142         struct list_head buffer_list;
143
144 } tdm_sprd_data;
145
146 uint32_t     tdm_sprd_format_to_drm_format(tbm_format format);
147 tbm_format   tdm_sprd_format_to_tbm_format(uint32_t format);
148
149 tdm_error    tdm_sprd_display_create_output_list(tdm_sprd_data *sprd_data);
150 void         tdm_sprd_display_destroy_output_list(tdm_sprd_data *sprd_data);
151 void         tdm_sprd_display_destroy_buffer_list(tdm_sprd_data *sprd_data);
152 tdm_error    tdm_sprd_display_create_layer_list(tdm_sprd_data *sprd_data);
153
154 tdm_error    tdm_sprd_pp_get_capability(tdm_sprd_data *sprd_data, tdm_caps_pp *caps);
155 tdm_pp*      tdm_sprd_pp_create(tdm_sprd_data *sprd_data, tdm_error *error);
156 void         tdm_sprd_pp_handler(struct drm_sprd_ipp_event *hw_ipp_p);
157 tdm_error    tdm_sprd_display_init_event_handling(tdm_sprd_data *sprd_data);
158 void         tdm_sprd_display_deinit_event_handling(tdm_sprd_data *sprd_data);
159 tdm_error    sprd_layer_get_buffer(tdm_layer *layer, tbm_surface_h *surface);
160 tdm_error    sprd_layer_get_zpos(tdm_layer *layer, int *zpos);
161
162 tdm_error    sprd_hwc_initailize_target_window(tdm_hwc *hwc_data, int width, int height);
163 #endif /* _TDM_SPRD_H_ */