cc36d58233740b2a35bc770a886b3dbe4296a979
[platform/core/uifw/libtdm.git] / backends / virtual / tdm_virtual.h
1 #ifndef _TDM_VIRTUAL_H_
2 #define _TDM_VIRTUAL_H_
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7
8 #include <stdio.h>
9 #include <string.h>
10 #include <stdlib.h>
11 #include <pthread.h>
12 #include <errno.h>
13 #include <unistd.h>
14 #include <limits.h>
15 #include <sys/types.h>
16 #include <sys/stat.h>
17 #include <sys/ioctl.h>
18 #include <fcntl.h>
19
20 #include <tbm_surface.h>
21 #include <tbm_surface_internal.h>
22 #include <tdm_backend.h>
23 #include <tdm_log.h>
24 #include <tdm_list.h>
25 #include <tdm_helper.h>
26
27 /* virtual backend functions (display) */
28 tdm_error virtual_display_get_capability(tdm_backend_data *bdata, tdm_caps_display *caps);
29 tdm_output **virtual_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error);
30 tdm_error virtual_display_get_fd(tdm_backend_data *bdata, int *fd);
31 tdm_error virtual_display_handle_events(tdm_backend_data *bdata);
32 tdm_voutput *virtual_display_voutput_create(tdm_backend_data *bdata, const char *name, tdm_error *error);
33
34 tdm_error virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps);
35 tdm_layer **virtual_output_get_layers(tdm_output *output, int *count, tdm_error *error);
36 tdm_error virtual_output_wait_vblank(tdm_output *output, int interval, int sync, void *user_data);
37 tdm_error virtual_output_set_vblank_handler(tdm_output *output, tdm_output_vblank_handler func);
38 tdm_error virtual_output_commit(tdm_output *output, int sync, void *user_data);
39 tdm_error virtual_output_set_commit_handler(tdm_output *output, tdm_output_commit_handler func);
40 tdm_error virtual_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value);
41 tdm_error virtual_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value);
42 tdm_error virtual_output_set_mode(tdm_output *output, const tdm_output_mode *mode);
43 tdm_error virtual_output_get_mode(tdm_output *output, const tdm_output_mode **mode);
44 tdm_error virtual_output_set_status_handler(tdm_output *output, tdm_output_status_handler func, void *user_data);
45
46 tdm_error virtual_voutput_set_available_mode(tdm_output *output, const tdm_output_mode *modes, int count);
47 tdm_error virtual_voutput_set_physical_size(tdm_output *output, unsigned int mmwidth, unsigned int mmheight);
48 tdm_error virtual_voutput_connect(tdm_output *output);
49 tdm_error virtual_voutput_disconnect(tdm_output *output);
50 tdm_error virtual_voutput_destroy(tdm_voutput *voutput);
51 tdm_output *virtual_voutput_get_output(tdm_voutput *voutput, tdm_error *error);
52 tdm_error virtual_voutput_set_commit_func(tdm_voutput *voutput,  tdm_voutput_commit_handler commit_func);
53 tdm_error virtual_voutput_commit_done(tdm_voutput *voutput);
54
55 tdm_hwc *virtual_output_get_hwc(tdm_output *output, tdm_error *error);
56 tdm_hwc_window *virtual_hwc_create_window(tdm_hwc *hwc, tdm_error *error);
57 tdm_error virtual_hwc_get_video_supported_formats(tdm_output *output, const tbm_format **formats, int *count);
58 tdm_error virtual_hwc_get_capabilities(tdm_hwc *hwc, tdm_hwc_capability *capabilities);
59 tdm_error virtual_hwc_get_available_properties(tdm_hwc *hwc, const tdm_prop **props, int *count);
60 tbm_surface_queue_h virtual_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error);
61 tdm_error virtual_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h buffer, tdm_region damage);
62 tdm_error virtual_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types);
63 tdm_error virtual_hwc_get_changed_composition_types(tdm_hwc *hwc, uint32_t *num_elements, tdm_hwc_window **hwc_wnds, tdm_hwc_window_composition *composition_types);
64 tdm_error virtual_hwc_accept_validation(tdm_hwc *hwc);
65 tdm_error virtual_hwc_commit(tdm_hwc *hwc, int sync, void *user_data);
66 tdm_error virtual_hwc_set_commit_handler(tdm_hwc *hwc, tdm_hwc_commit_handler func);
67
68 void virtual_hwc_window_destroy(tdm_hwc_window *hwc_window);
69 tdm_error virtual_hwc_window_set_composition_type(tdm_hwc_window *hwc_window, tdm_hwc_window_composition composition_type);
70 tdm_error virtual_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_region damage);
71 tdm_error virtual_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info);
72 tdm_error virtual_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h surface);
73 tdm_error virtual_hwc_window_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value);
74 tdm_error virtual_hwc_window_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value);
75 tdm_error virtual_hwc_window_get_constraints(tdm_hwc_window *hwc_window, int *constraints);
76 tdm_error virtual_hwc_window_set_name(tdm_hwc_window *hwc_window, const char *name);
77
78 tdm_error virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
79 tdm_error virtual_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
80 tdm_error virtual_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
81 tdm_error virtual_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
82 tdm_error virtual_layer_unset_buffer(tdm_layer *layer);
83
84 #define C(b,m)              (((b) >> (m)) & 0xFF)
85 #define B(c,s)              ((((unsigned int)(c)) & 0xff) << (s))
86 #define FOURCC(a,b,c,d)     (B(d,24) | B(c,16) | B(b,8) | B(a,0))
87 #define FOURCC_STR(id)      C(id,0), C(id,8), C(id,16), C(id,24)
88
89 #define IS_RGB(format)      (format == TBM_FORMAT_XRGB8888 || format == TBM_FORMAT_ARGB8888 || \
90                              format == TBM_FORMAT_XBGR8888 || format == TBM_FORMAT_ABGR8888)
91
92 #define RETURN_IF_FAIL(cond) { \
93         if (!(cond)) { \
94                 TDM_ERR("'%s' failed", #cond); \
95                 return; \
96         } \
97 }
98
99 #define RETURN_VAL_IF_FAIL(cond, val) {\
100         if (!(cond)) {\
101                 TDM_ERR("'%s' failed", #cond);\
102                 return val;\
103         }\
104 }
105
106 #define GOTO_IF_FAIL(cond, val) {\
107         if (!(cond)) {\
108                 TDM_ERR("'%s' failed", #cond);\
109                 goto val;\
110         }\
111 }
112
113 typedef struct _tdm_virtual_data tdm_virtual_data;
114 typedef struct _tdm_virtual_output_data tdm_virtual_output_data;
115 typedef struct _tdm_virtual_hwc_data tdm_virtual_hwc_data;
116 typedef struct _tdm_virtual_hwc_window_data tdm_virtual_hwc_window_data;
117 typedef struct _tdm_virtual_voutput_data tdm_virtual_voutput_data;
118 typedef struct _tdm_virtual_layer_data tdm_virtual_layer_data;
119 typedef struct _tdm_virtual_event_data tdm_virtual_event_data;
120
121 typedef enum {
122         TDM_VIRTUAL_EVENT_TYPE_WAIT,
123         TDM_VIRTUAL_EVENT_TYPE_COMMIT,
124         TDM_VIRTUAL_EVENT_TYPE_VCOMMIT,
125 } tdm_virtual_event_type;
126
127 struct _tdm_virtual_data {
128         tdm_display *dpy;
129         int hwc_mode;
130
131         int pipe[2];
132
133         struct list_head voutput_list;
134         struct list_head output_list;
135         struct list_head buffer_list;
136 };
137
138 struct _tdm_virtual_output_data {
139         struct list_head link;
140
141         /* data which are fixed at initializing */
142         tdm_virtual_data *virtual_data;
143         tdm_virtual_voutput_data *voutput_data;
144
145         char name[TDM_NAME_LEN]; /* output name */
146         uint32_t pipe;
147         tdm_output_type connector_type;
148         struct list_head layer_list;
149         tdm_virtual_layer_data *primary_layer;
150
151         tdm_output_dpms dpms;
152
153         /* not fixed data below */
154         tdm_output_vblank_handler vblank_func;
155         tdm_output_commit_handler commit_func;
156         void *commit_user_data;
157
158         tdm_output_conn_status status;
159         tdm_output_status_handler status_func;
160         void *status_user_data;
161
162         int mode_changed;
163         const tdm_output_mode *current_mode;
164
165         tdm_event_loop_source *timer;
166         unsigned int timer_waiting;
167         struct list_head timer_event_list;
168
169         /* hwc data */
170         int hwc_enable;
171         tdm_virtual_hwc_data *hwc_data;
172 };
173
174 struct _tdm_virtual_hwc_data {
175         tdm_virtual_hwc_window_data *target_hwc_window;
176
177         int need_validate;
178         int need_target_window;
179         int need_set_crtc;
180
181         int target_window_zpos;
182
183         tdm_virtual_output_data *output_data;
184         struct list_head hwc_window_list;
185
186         tdm_hwc_commit_handler commit_func;
187 };
188
189 struct _tdm_virtual_hwc_window_data {
190         struct list_head link;
191
192         tdm_virtual_hwc_data *hwc_data;
193
194         tdm_hwc_window_info info;
195         tbm_surface_h surface;
196         tdm_hwc_window_composition client_type;
197         tdm_hwc_window_composition validated_type;
198         int lzpos;
199
200         char name[TDM_NAME_LEN];
201 };
202
203 struct _tdm_virtual_voutput_data {
204         struct list_head link;
205
206         /* data which are fixed at initializing */
207         tdm_virtual_data *virtual_data;
208         tdm_virtual_output_data *output_data;
209
210         char name[TDM_NAME_LEN]; /* output name */
211
212         tdm_voutput_commit_handler vcommit_func;
213
214         tdm_output_mode *output_modes;
215         int mode_count;
216
217         unsigned int mmwidth;
218         unsigned int mmheight;
219 };
220
221 struct _tdm_virtual_layer_data {
222         struct list_head link;
223
224         /* data which are fixed at initializing */
225         tdm_virtual_data *virtual_data;
226         tdm_virtual_output_data *output_data;
227         tdm_layer_capability capabilities;
228         int zpos;
229
230         /* not fixed data below */
231         tdm_info_layer info;
232         int info_changed;
233
234         tbm_surface_h display_buffer;
235         int display_buffer_changed;
236 };
237
238 struct _tdm_virtual_event_data {
239         struct list_head link;
240
241         tdm_virtual_event_type type;
242         tdm_virtual_output_data *output_data;
243         void *user_data;
244 };
245
246 void tdm_virtual_display_destroy_output_list(tdm_virtual_data *virtual_data);
247 tdm_virtual_layer_data *virtual_output_data_get_layer_data(tdm_virtual_output_data *output_data, int layer_zpos);
248 tdm_error    virtual_hwc_initailize_target_window(tdm_hwc *hwc_data, int width, int height);
249 #endif /* _TDM_VIRTUAL_H_ */