virtual: add virtual backend module
[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 static tdm_virtual_data *virtual_data;
8
9 void
10 tdm_virtual_deinit(tdm_backend_data *bdata)
11 {
12         if (virtual_data != bdata)
13                 return;
14
15         TDM_INFO("deinit");
16
17         tdm_virtual_display_destroy_output_list(virtual_data);
18
19         if (virtual_data->pipe[0] >= 0)
20                 close(virtual_data->pipe[0]);
21         if (virtual_data->pipe[1] >= 0)
22                 close(virtual_data->pipe[1]);
23
24         free(virtual_data);
25         virtual_data = NULL;
26 }
27
28 tdm_backend_data *
29 tdm_virtual_init(tdm_display *dpy, tdm_error *error)
30 {
31         tdm_func_display virtual_func_display;
32         tdm_func_output virtual_func_output;
33         tdm_func_voutput virtual_func_voutput;
34         tdm_func_layer virtual_func_layer;
35         tdm_error ret;
36
37         if (!dpy) {
38                 TDM_ERR("display is null");
39                 if (error)
40                         *error = TDM_ERROR_INVALID_PARAMETER;
41                 return NULL;
42         }
43
44         if (virtual_data) {
45                 TDM_ERR("failed: init twice");
46                 if (error)
47                         *error = TDM_ERROR_BAD_REQUEST;
48                 return NULL;
49         }
50
51         virtual_data = calloc(1, sizeof(tdm_virtual_data));
52         if (!virtual_data) {
53                 TDM_ERR("alloc failed");
54                 if (error)
55                         *error = TDM_ERROR_OUT_OF_MEMORY;
56                 return NULL;
57         }
58
59         LIST_INITHEAD(&virtual_data->voutput_list);
60         LIST_INITHEAD(&virtual_data->output_list);
61         LIST_INITHEAD(&virtual_data->buffer_list);
62
63         memset(&virtual_func_display, 0, sizeof(virtual_func_display));
64         virtual_func_display.display_get_capability = virtual_display_get_capability;
65         virtual_func_display.display_get_outputs = virtual_display_get_outputs;
66         virtual_func_display.display_get_fd = virtual_display_get_fd;
67         virtual_func_display.display_handle_events = virtual_display_handle_events;
68         virtual_func_display.voutput_create = virtual_output_create;
69
70         memset(&virtual_func_output, 0, sizeof(virtual_func_output));
71         virtual_func_output.output_get_capability = virtual_output_get_capability;
72         virtual_func_output.output_get_layers = virtual_output_get_layers;
73         virtual_func_output.output_wait_vblank = virtual_output_wait_vblank;
74         virtual_func_output.output_set_vblank_handler = virtual_output_set_vblank_handler;
75         virtual_func_output.output_commit = virtual_output_commit;
76         virtual_func_output.output_set_commit_handler = virtual_output_set_commit_handler;
77
78         virtual_func_output.output_set_dpms = virtual_output_set_dpms;
79         virtual_func_output.output_get_dpms = virtual_output_get_dpms;
80
81         virtual_func_output.output_set_mode = virtual_output_set_mode;
82         virtual_func_output.output_get_mode = virtual_output_get_mode;
83         virtual_func_output.output_set_status_handler = virtual_output_set_status_handler;
84
85         memset(&virtual_func_voutput, 0, sizeof(virtual_func_voutput));
86         virtual_func_voutput.voutput_destroy = virtual_output_destroy;
87         virtual_func_voutput.voutput_set_available_mode = virtual_output_set_available_mode;
88         virtual_func_voutput.voutput_set_physical_size = virtual_output_set_physical_size;
89         virtual_func_voutput.voutput_connect = virtual_output_connect;
90         virtual_func_voutput.voutput_disconnect = virtual_output_disconnect;
91         virtual_func_voutput.voutput_get_output = virtual_output_get_output;
92         virtual_func_voutput.voutput_set_commit_func = virtual_output_set_commit_func;
93         virtual_func_voutput.voutput_commit_done = virtual_output_commit_done;
94
95         memset(&virtual_func_layer, 0, sizeof(virtual_func_layer));
96         virtual_func_layer.layer_get_capability = virtual_layer_get_capability;
97         virtual_func_layer.layer_set_info = virtual_layer_set_info;
98         virtual_func_layer.layer_get_info = virtual_layer_get_info;
99         virtual_func_layer.layer_set_buffer = virtual_layer_set_buffer;
100         virtual_func_layer.layer_unset_buffer = virtual_layer_unset_buffer;
101
102         ret = tdm_backend_register_func_display(dpy, &virtual_func_display);
103         if (ret != TDM_ERROR_NONE)
104                 goto failed;
105
106         ret = tdm_backend_register_func_output(dpy, &virtual_func_output);
107         if (ret != TDM_ERROR_NONE)
108                 goto failed;
109
110         ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
111         if (ret != TDM_ERROR_NONE)
112                 goto failed;
113
114         ret = tdm_backend_register_func_layer(dpy, &virtual_func_layer);
115         if (ret != TDM_ERROR_NONE)
116                 goto failed;
117
118         virtual_data->dpy = dpy;
119
120         if (pipe(virtual_data->pipe) < 0) {
121                 TDM_ERR("failed get pipe: %m");
122                 ret = TDM_ERROR_OPERATION_FAILED;
123                 goto failed;
124         }
125
126         if (error)
127                 *error = TDM_ERROR_NONE;
128
129         TDM_INFO("init success!");
130
131         return (tdm_backend_data *)virtual_data;
132 failed:
133         if (error)
134                 *error = ret;
135
136         tdm_virtual_deinit(virtual_data);
137
138         TDM_ERR("init failed!");
139         return NULL;
140 }
141
142 tdm_backend_module tdm_backend_module_data = {
143         "Virtual",
144         "Samsung",
145         TDM_BACKEND_SET_ABI_VERSION(1, 1),
146         tdm_virtual_init,
147         tdm_virtual_deinit
148 };