5 #include "tdm_virtual.h"
9 static tdm_virtual_data *virtual_data;
12 tdm_virtual_deinit(tdm_backend_data *bdata)
14 if (virtual_data != bdata)
19 tdm_virtual_display_destroy_output_list(virtual_data);
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]);
31 tdm_virtual_init(tdm_display *dpy, tdm_error *error)
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;
42 TDM_ERR("display is null");
44 *error = TDM_ERROR_INVALID_PARAMETER;
49 TDM_ERR("failed: init twice");
51 *error = TDM_ERROR_BAD_REQUEST;
55 virtual_data = calloc(1, sizeof(tdm_virtual_data));
57 TDM_ERR("alloc failed");
59 *error = TDM_ERROR_OUT_OF_MEMORY;
64 virtual_data->hwc_mode = 1;
67 LIST_INITHEAD(&virtual_data->voutput_list);
68 LIST_INITHEAD(&virtual_data->output_list);
69 LIST_INITHEAD(&virtual_data->buffer_list);
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;
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;
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;
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
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;
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;
139 ret = tdm_backend_register_func_display(dpy, &virtual_func_display);
140 if (ret != TDM_ERROR_NONE)
143 ret = tdm_backend_register_func_output(dpy, &virtual_func_output);
144 if (ret != TDM_ERROR_NONE)
147 if (virtual_data->hwc_mode) {
148 ret = tdm_backend_register_func_hwc(dpy, &virtual_func_hwc);
149 if (ret != TDM_ERROR_NONE)
152 ret = tdm_backend_register_func_hwc_window(dpy, &virtual_func_hwc_window);
153 if (ret != TDM_ERROR_NONE)
157 ret = tdm_backend_register_func_voutput(dpy, &virtual_func_voutput);
158 if (ret != TDM_ERROR_NONE)
161 ret = tdm_backend_register_func_layer(dpy, &virtual_func_layer);
162 if (ret != TDM_ERROR_NONE)
165 virtual_data->dpy = dpy;
167 if (pipe(virtual_data->pipe) < 0) {
168 TDM_ERR("failed get pipe: %m");
169 ret = TDM_ERROR_OPERATION_FAILED;
174 *error = TDM_ERROR_NONE;
176 TDM_INFO("init success!");
178 return (tdm_backend_data *)virtual_data;
183 tdm_virtual_deinit(virtual_data);
185 TDM_ERR("init failed!");
189 tdm_backend_module tdm_backend_module_data = {
192 TDM_BACKEND_SET_ABI_VERSION(1, 1),