1 From 99fb36e62d3d0e3bda3d2984f280f534a629f70c Mon Sep 17 00:00:00 2001
2 From: Wataru Mizuno <wmizuno@jp.adit-jv.com>
3 Date: Thu, 12 Oct 2017 14:55:13 +0900
4 Subject: [PATCH 1/5] compositor: add output type to weston_output
6 This enables weston to use multiple types of backend
7 Each backends have own output structure for each functions
8 To avoid invalid member access, type identifier is needed
10 Signed-off-by: Wataru Mizuno <wmizuno@jp.adit-jv.com>
12 libweston/compositor-drm.c | 100 +++++++++++++++++++++++-----------------
13 libweston/compositor-fbdev.c | 1 +
14 libweston/compositor-headless.c | 1 +
15 libweston/compositor-rdp.c | 1 +
16 libweston/compositor-wayland.c | 1 +
17 libweston/compositor-x11.c | 1 +
18 libweston/compositor.h | 12 +++++
19 7 files changed, 74 insertions(+), 43 deletions(-)
21 diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c
22 index 1d38f05..0b5b4c4 100644
23 --- a/libweston/compositor-drm.c
24 +++ b/libweston/compositor-drm.c
25 @@ -243,14 +243,16 @@ drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id)
26 struct drm_output *output;
28 wl_list_for_each(output, &b->compositor->output_list, base.link) {
29 - if (output->crtc_id == crtc_id)
31 + if(output->base.output_type == OUTPUT_DRM)
32 + if (output->crtc_id == crtc_id)
36 wl_list_for_each(output, &b->compositor->pending_output_list,
38 - if (output->crtc_id == crtc_id)
40 + if(output->base.output_type == OUTPUT_DRM)
41 + if (output->crtc_id == crtc_id)
46 @@ -262,14 +264,16 @@ drm_output_find_by_connector(struct drm_backend *b, uint32_t connector_id)
47 struct drm_output *output;
49 wl_list_for_each(output, &b->compositor->output_list, base.link) {
50 - if (output->connector_id == connector_id)
52 + if(output->base.output_type == OUTPUT_DRM)
53 + if (output->connector_id == connector_id)
57 wl_list_for_each(output, &b->compositor->pending_output_list,
59 - if (output->connector_id == connector_id)
61 + if(output->base.output_type == OUTPUT_DRM)
62 + if (output->connector_id == connector_id)
67 @@ -2433,6 +2437,7 @@ drm_output_enable(struct weston_output *base)
68 struct weston_mode *m;
70 output->dpms_prop = drm_get_prop(b->drm.fd, output->connector, "DPMS");
71 + output->base.output_type = OUTPUT_DRM;
74 if (drm_output_init_pixman(output, b) < 0) {
75 @@ -2797,38 +2802,42 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device)
77 wl_list_for_each_safe(output, next, &b->compositor->output_list,
79 - bool disconnected = true;
81 - for (i = 0; i < resources->count_connectors; i++) {
82 - if (connected[i] == output->connector_id) {
83 - disconnected = false;
85 + if (output->base.output_type == OUTPUT_DRM) {
86 + bool disconnected = true;
88 + for (i = 0; i < resources->count_connectors; i++) {
89 + if (connected[i] == output->connector_id) {
90 + disconnected = false;
101 - weston_log("connector %d disconnected\n", output->connector_id);
102 - drm_output_destroy(&output->base);
103 + weston_log("connector %d disconnected\n", output->connector_id);
104 + drm_output_destroy(&output->base);
108 wl_list_for_each_safe(output, next, &b->compositor->pending_output_list,
110 - bool disconnected = true;
112 - for (i = 0; i < resources->count_connectors; i++) {
113 - if (connected[i] == output->connector_id) {
114 - disconnected = false;
116 + if (output->base.output_type == OUTPUT_DRM) {
117 + bool disconnected = true;
119 + for (i = 0; i < resources->count_connectors; i++) {
120 + if (connected[i] == output->connector_id) {
121 + disconnected = false;
132 - weston_log("connector %d disconnected\n", output->connector_id);
133 - drm_output_destroy(&output->base);
134 + weston_log("connector %d disconnected\n", output->connector_id);
135 + drm_output_destroy(&output->base);
140 @@ -2925,18 +2934,21 @@ session_notify(struct wl_listener *listener, void *data)
141 * pending frame callbacks. */
143 wl_list_for_each(output, &compositor->output_list, base.link) {
144 - output->base.repaint_needed = 0;
145 - drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
146 + if(output->base.output_type == OUTPUT_DRM) {
147 + output->base.repaint_needed = 0;
148 + drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0);
151 + if(output->base.output_type == OUTPUT_DRM) {
152 + output = container_of(compositor->output_list.next,
153 + struct drm_output, base.link);
155 + wl_list_for_each(sprite, &b->sprite_list, link)
156 + drmModeSetPlane(b->drm.fd,
158 + output->crtc_id, 0, 0,
159 + 0, 0, 0, 0, 0, 0, 0, 0);
162 - output = container_of(compositor->output_list.next,
163 - struct drm_output, base.link);
165 - wl_list_for_each(sprite, &b->sprite_list, link)
166 - drmModeSetPlane(b->drm.fd,
168 - output->crtc_id, 0, 0,
169 - 0, 0, 0, 0, 0, 0, 0, 0);
173 @@ -3148,7 +3160,8 @@ switch_to_gl_renderer(struct drm_backend *b)
176 wl_list_for_each(output, &b->compositor->output_list, base.link)
177 - pixman_renderer_output_destroy(&output->base);
178 + if(output->base.output_type == OUTPUT_DRM)
179 + pixman_renderer_output_destroy(&output->base);
181 b->compositor->renderer->destroy(b->compositor);
183 @@ -3160,7 +3173,8 @@ switch_to_gl_renderer(struct drm_backend *b)
186 wl_list_for_each(output, &b->compositor->output_list, base.link)
187 - drm_output_init_egl(output, b);
188 + if(output->base.output_type == OUTPUT_DRM)
189 + drm_output_init_egl(output, b);
193 diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c
194 index 44f0cf5..9cb903e 100644
195 --- a/libweston/compositor-fbdev.c
196 +++ b/libweston/compositor-fbdev.c
197 @@ -433,6 +433,7 @@ fbdev_output_enable(struct weston_output *base)
199 struct wl_event_loop *loop;
201 + output->base.output_type = OUTPUT_FBDEV;
202 /* Create the frame buffer. */
203 fb_fd = fbdev_frame_buffer_open(output, output->device, &output->fb_info);
205 diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c
206 index a1aec6d..b0d5afb 100644
207 --- a/libweston/compositor-headless.c
208 +++ b/libweston/compositor-headless.c
209 @@ -148,6 +148,7 @@ headless_output_enable(struct weston_output *base)
210 loop = wl_display_get_event_loop(b->compositor->wl_display);
211 output->finish_frame_timer =
212 wl_event_loop_add_timer(loop, finish_frame_handler, output);
213 + output->base.output_type = OUTPUT_HEADLESS;
216 output->image_buf = malloc(output->base.current_mode->width *
217 diff --git a/libweston/compositor-rdp.c b/libweston/compositor-rdp.c
218 index d9668e8..d525982 100644
219 --- a/libweston/compositor-rdp.c
220 +++ b/libweston/compositor-rdp.c
221 @@ -519,6 +519,7 @@ rdp_output_enable(struct weston_output *base)
222 struct rdp_backend *b = to_rdp_backend(base->compositor);
223 struct wl_event_loop *loop;
225 + output->base.output_type = OUTPUT_RDP;
226 output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8,
227 output->base.current_mode->width,
228 output->base.current_mode->height,
229 diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c
230 index 9d35ef7..66a0dbf 100644
231 --- a/libweston/compositor-wayland.c
232 +++ b/libweston/compositor-wayland.c
233 @@ -1164,6 +1164,7 @@ wayland_output_enable(struct weston_output *base)
234 struct wayland_backend *b = to_wayland_backend(base->compositor);
237 + output->base.output_type = OUTPUT_WAYLAND;
238 weston_log("Creating %dx%d wayland output at (%d, %d)\n",
239 output->base.current_mode->width,
240 output->base.current_mode->height,
241 diff --git a/libweston/compositor-x11.c b/libweston/compositor-x11.c
242 index f9cb461..fcf39e1 100644
243 --- a/libweston/compositor-x11.c
244 +++ b/libweston/compositor-x11.c
245 @@ -825,6 +825,7 @@ x11_output_enable(struct weston_output *base)
246 XCB_EVENT_MASK_STRUCTURE_NOTIFY,
249 + output->base.output_type = OUTPUT_X11;
253 diff --git a/libweston/compositor.h b/libweston/compositor.h
254 index 08e728a..51157d0 100644
255 --- a/libweston/compositor.h
256 +++ b/libweston/compositor.h
257 @@ -146,9 +146,21 @@ enum dpms_enum {
261 +/* bit compatible with drm definitions. */
272 struct weston_output {
275 + enum output_type output_type;
277 void *renderer_state;