5 #include "tdm_virtual.h"
7 static tdm_virtual_data *virtual_data;
10 tdm_virtual_deinit(tdm_backend_data *bdata)
12 if (virtual_data != bdata)
17 tdm_virtual_display_destroy_output_list(virtual_data);
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]);
29 tdm_virtual_init(tdm_display *dpy, tdm_error *error)
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;
38 TDM_ERR("display is null");
40 *error = TDM_ERROR_INVALID_PARAMETER;
45 TDM_ERR("failed: init twice");
47 *error = TDM_ERROR_BAD_REQUEST;
51 virtual_data = calloc(1, sizeof(tdm_virtual_data));
53 TDM_ERR("alloc failed");
55 *error = TDM_ERROR_OUT_OF_MEMORY;
59 LIST_INITHEAD(&virtual_data->voutput_list);
60 LIST_INITHEAD(&virtual_data->output_list);
61 LIST_INITHEAD(&virtual_data->buffer_list);
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;
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;
78 virtual_func_output.output_set_dpms = virtual_output_set_dpms;
79 virtual_func_output.output_get_dpms = virtual_output_get_dpms;
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;
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;
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;
102 ret = tdm_backend_register_func_display(dpy, &virtual_func_display);
103 if (ret != TDM_ERROR_NONE)
106 ret = tdm_backend_register_func_output(dpy, &virtual_func_output);
107 if (ret != TDM_ERROR_NONE)
110 ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
111 if (ret != TDM_ERROR_NONE)
114 ret = tdm_backend_register_func_layer(dpy, &virtual_func_layer);
115 if (ret != TDM_ERROR_NONE)
118 virtual_data->dpy = dpy;
120 if (pipe(virtual_data->pipe) < 0) {
121 TDM_ERR("failed get pipe: %m");
122 ret = TDM_ERROR_OPERATION_FAILED;
127 *error = TDM_ERROR_NONE;
129 TDM_INFO("init success!");
131 return (tdm_backend_data *)virtual_data;
136 tdm_virtual_deinit(virtual_data);
138 TDM_ERR("init failed!");
142 tdm_backend_module tdm_backend_module_data = {
145 TDM_BACKEND_SET_ABI_VERSION(1, 1),