tdm_output: change log 'dpms' to 'DPMS'
[platform/core/uifw/libtdm.git] / backends / virtual / tdm_virtual.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4
5 #include "tdm_virtual.h"
6
7 #define TDM_HWC 1
8
9 static tdm_virtual_data *virtual_data;
10
11 void
12 tdm_virtual_deinit(tdm_backend_data *bdata)
13 {
14         if (virtual_data != bdata)
15                 return;
16
17         TDM_INFO("deinit");
18
19         tdm_virtual_display_destroy_output_list(virtual_data);
20
21         if (virtual_data->pipe[0] >= 0)
22                 close(virtual_data->pipe[0]);
23         if (virtual_data->pipe[1] >= 0)
24                 close(virtual_data->pipe[1]);
25
26         free(virtual_data);
27         virtual_data = NULL;
28 }
29
30 tdm_backend_data *
31 tdm_virtual_init(tdm_display *dpy, tdm_error *error)
32 {
33         tdm_func_display virtual_func_display;
34         tdm_func_output virtual_func_output;
35         tdm_func_voutput virtual_func_voutput;
36         tdm_func_hwc virtual_func_hwc;
37         tdm_func_hwc_window virtual_func_hwc_window;
38         tdm_func_layer virtual_func_layer;
39         tdm_error ret;
40
41         if (!dpy) {
42                 TDM_ERR("display is null");
43                 if (error)
44                         *error = TDM_ERROR_INVALID_PARAMETER;
45                 return NULL;
46         }
47
48         if (virtual_data) {
49                 TDM_ERR("failed: init twice");
50                 if (error)
51                         *error = TDM_ERROR_BAD_REQUEST;
52                 return NULL;
53         }
54
55         virtual_data = calloc(1, sizeof(tdm_virtual_data));
56         if (!virtual_data) {
57                 TDM_ERR("alloc failed");
58                 if (error)
59                         *error = TDM_ERROR_OUT_OF_MEMORY;
60                 return NULL;
61         }
62
63 #if TDM_HWC
64         virtual_data->hwc_mode = 1;
65 #endif
66
67         LIST_INITHEAD(&virtual_data->voutput_list);
68         LIST_INITHEAD(&virtual_data->output_list);
69         LIST_INITHEAD(&virtual_data->buffer_list);
70
71         memset(&virtual_func_display, 0, sizeof(virtual_func_display));
72         virtual_func_display.display_get_capability = virtual_display_get_capability;
73         virtual_func_display.display_get_outputs = virtual_display_get_outputs;
74         virtual_func_display.display_get_fd = virtual_display_get_fd;
75         virtual_func_display.display_handle_events = virtual_display_handle_events;
76         virtual_func_display.display_voutput_create = virtual_display_voutput_create;
77
78         memset(&virtual_func_output, 0, sizeof(virtual_func_output));
79         virtual_func_output.output_get_capability = virtual_output_get_capability;
80         virtual_func_output.output_get_layers = virtual_output_get_layers;
81         virtual_func_output.output_wait_vblank = virtual_output_wait_vblank;
82         virtual_func_output.output_set_vblank_handler = virtual_output_set_vblank_handler;
83         virtual_func_output.output_commit = virtual_output_commit;
84         virtual_func_output.output_set_commit_handler = virtual_output_set_commit_handler;
85         virtual_func_output.output_set_dpms = virtual_output_set_dpms;
86         virtual_func_output.output_get_dpms = virtual_output_get_dpms;
87         virtual_func_output.output_set_mode = virtual_output_set_mode;
88         virtual_func_output.output_get_mode = virtual_output_get_mode;
89         virtual_func_output.output_set_status_handler = virtual_output_set_status_handler;
90         if (virtual_data->hwc_mode) {
91                 virtual_func_output.output_get_hwc = virtual_output_get_hwc;
92
93                 memset(&virtual_func_hwc, 0, sizeof(virtual_func_hwc));
94                 virtual_func_hwc.hwc_create_window = virtual_hwc_create_window;
95                 virtual_func_hwc.hwc_get_video_supported_formats = virtual_hwc_get_video_supported_formats;
96                 virtual_func_hwc.hwc_get_video_available_properties = NULL;
97                 virtual_func_hwc.hwc_get_capabilities = virtual_hwc_get_capabilities;
98                 virtual_func_hwc.hwc_get_available_properties = virtual_hwc_get_available_properties;
99                 virtual_func_hwc.hwc_get_client_target_buffer_queue = virtual_hwc_get_client_target_buffer_queue;
100                 virtual_func_hwc.hwc_set_client_target_buffer = virtual_hwc_set_client_target_buffer;
101                 virtual_func_hwc.hwc_validate = virtual_hwc_validate;
102                 virtual_func_hwc.hwc_get_changed_composition_types = virtual_hwc_get_changed_composition_types;
103                 virtual_func_hwc.hwc_accept_validation  = virtual_hwc_accept_validation;
104                 virtual_func_hwc.hwc_commit = virtual_hwc_commit;
105                 virtual_func_hwc.hwc_set_commit_handler = virtual_hwc_set_commit_handler;
106
107                 memset(&virtual_func_hwc_window, 0, sizeof(virtual_func_hwc_window));
108                 virtual_func_hwc_window.hwc_window_destroy = virtual_hwc_window_destroy;
109                 virtual_func_hwc_window.hwc_window_acquire_buffer_queue = NULL; // no need
110                 virtual_func_hwc_window.hwc_window_release_buffer_queue = NULL; // no need
111                 virtual_func_hwc_window.hwc_window_set_composition_type = virtual_hwc_window_set_composition_type;
112                 virtual_func_hwc_window.hwc_window_set_buffer_damage = virtual_hwc_window_set_buffer_damage;
113                 virtual_func_hwc_window.hwc_window_set_info = virtual_hwc_window_set_info;
114                 virtual_func_hwc_window.hwc_window_set_buffer = virtual_hwc_window_set_buffer;
115                 virtual_func_hwc_window.hwc_window_set_property = virtual_hwc_window_set_property;
116                 virtual_func_hwc_window.hwc_window_get_property = virtual_hwc_window_get_property;
117                 virtual_func_hwc_window.hwc_window_get_constraints = virtual_hwc_window_get_constraints;
118                 virtual_func_hwc_window.hwc_window_set_name = virtual_hwc_window_set_name;
119                 virtual_func_hwc_window.hwc_window_set_cursor_image = NULL; // no need
120         }
121
122         memset(&virtual_func_voutput, 0, sizeof(virtual_func_voutput));
123         virtual_func_voutput.voutput_destroy = virtual_voutput_destroy;
124         virtual_func_voutput.voutput_set_available_mode = virtual_voutput_set_available_mode;
125         virtual_func_voutput.voutput_set_physical_size = virtual_voutput_set_physical_size;
126         virtual_func_voutput.voutput_connect = virtual_voutput_connect;
127         virtual_func_voutput.voutput_disconnect = virtual_voutput_disconnect;
128         virtual_func_voutput.voutput_get_output = virtual_voutput_get_output;
129         virtual_func_voutput.voutput_set_commit_func = virtual_voutput_set_commit_func;
130         virtual_func_voutput.voutput_commit_done = virtual_voutput_commit_done;
131
132         memset(&virtual_func_layer, 0, sizeof(virtual_func_layer));
133         virtual_func_layer.layer_get_capability = virtual_layer_get_capability;
134         virtual_func_layer.layer_set_info = virtual_layer_set_info;
135         virtual_func_layer.layer_get_info = virtual_layer_get_info;
136         virtual_func_layer.layer_set_buffer = virtual_layer_set_buffer;
137         virtual_func_layer.layer_unset_buffer = virtual_layer_unset_buffer;
138
139         ret = tdm_backend_register_func_display(dpy, &virtual_func_display);
140         if (ret != TDM_ERROR_NONE)
141                 goto failed;
142
143         ret = tdm_backend_register_func_output(dpy, &virtual_func_output);
144         if (ret != TDM_ERROR_NONE)
145                 goto failed;
146
147         if (virtual_data->hwc_mode) {
148                 ret = tdm_backend_register_func_hwc(dpy, &virtual_func_hwc);
149                 if (ret != TDM_ERROR_NONE)
150                         goto failed;
151
152                 ret = tdm_backend_register_func_hwc_window(dpy, &virtual_func_hwc_window);
153                 if (ret != TDM_ERROR_NONE)
154                         goto failed;
155         }
156
157         ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
158         if (ret != TDM_ERROR_NONE)
159                 goto failed;
160
161         ret = tdm_backend_register_func_layer(dpy, &virtual_func_layer);
162         if (ret != TDM_ERROR_NONE)
163                 goto failed;
164
165         virtual_data->dpy = dpy;
166
167         if (pipe(virtual_data->pipe) < 0) {
168                 TDM_ERR("failed get pipe: %m");
169                 ret = TDM_ERROR_OPERATION_FAILED;
170                 goto failed;
171         }
172
173         if (error)
174                 *error = TDM_ERROR_NONE;
175
176         TDM_INFO("init success!");
177
178         return (tdm_backend_data *)virtual_data;
179 failed:
180         if (error)
181                 *error = ret;
182
183         tdm_virtual_deinit(virtual_data);
184
185         TDM_ERR("init failed!");
186         return NULL;
187 }
188
189 tdm_backend_module tdm_backend_module_data = {
190         "Virtual",
191         "Samsung",
192         TDM_BACKEND_SET_ABI_VERSION(1, 1),
193         tdm_virtual_init,
194         tdm_virtual_deinit
195 };