From 99fb36e62d3d0e3bda3d2984f280f534a629f70c Mon Sep 17 00:00:00 2001 From: Wataru Mizuno Date: Thu, 12 Oct 2017 14:55:13 +0900 Subject: [PATCH 1/5] compositor: add output type to weston_output This enables weston to use multiple types of backend Each backends have own output structure for each functions To avoid invalid member access, type identifier is needed Signed-off-by: Wataru Mizuno --- libweston/compositor-drm.c | 100 +++++++++++++++++++++++----------------- libweston/compositor-fbdev.c | 1 + libweston/compositor-headless.c | 1 + libweston/compositor-rdp.c | 1 + libweston/compositor-wayland.c | 1 + libweston/compositor-x11.c | 1 + libweston/compositor.h | 12 +++++ 7 files changed, 74 insertions(+), 43 deletions(-) diff --git a/libweston/compositor-drm.c b/libweston/compositor-drm.c index 1d38f05..0b5b4c4 100644 --- a/libweston/compositor-drm.c +++ b/libweston/compositor-drm.c @@ -243,14 +243,16 @@ drm_output_find_by_crtc(struct drm_backend *b, uint32_t crtc_id) struct drm_output *output; wl_list_for_each(output, &b->compositor->output_list, base.link) { - if (output->crtc_id == crtc_id) - return output; + if(output->base.output_type == OUTPUT_DRM) + if (output->crtc_id == crtc_id) + return output; } wl_list_for_each(output, &b->compositor->pending_output_list, base.link) { - if (output->crtc_id == crtc_id) - return output; + if(output->base.output_type == OUTPUT_DRM) + if (output->crtc_id == crtc_id) + return output; } return NULL; @@ -262,14 +264,16 @@ drm_output_find_by_connector(struct drm_backend *b, uint32_t connector_id) struct drm_output *output; wl_list_for_each(output, &b->compositor->output_list, base.link) { - if (output->connector_id == connector_id) - return output; + if(output->base.output_type == OUTPUT_DRM) + if (output->connector_id == connector_id) + return output; } wl_list_for_each(output, &b->compositor->pending_output_list, base.link) { - if (output->connector_id == connector_id) - return output; + if(output->base.output_type == OUTPUT_DRM) + if (output->connector_id == connector_id) + return output; } return NULL; @@ -2433,6 +2437,7 @@ drm_output_enable(struct weston_output *base) struct weston_mode *m; output->dpms_prop = drm_get_prop(b->drm.fd, output->connector, "DPMS"); + output->base.output_type = OUTPUT_DRM; if (b->use_pixman) { if (drm_output_init_pixman(output, b) < 0) { @@ -2797,38 +2802,42 @@ update_outputs(struct drm_backend *b, struct udev_device *drm_device) wl_list_for_each_safe(output, next, &b->compositor->output_list, base.link) { - bool disconnected = true; - - for (i = 0; i < resources->count_connectors; i++) { - if (connected[i] == output->connector_id) { - disconnected = false; - break; + if (output->base.output_type == OUTPUT_DRM) { + bool disconnected = true; + + for (i = 0; i < resources->count_connectors; i++) { + if (connected[i] == output->connector_id) { + disconnected = false; + break; + } } - } - if (!disconnected) - continue; + if (!disconnected) + continue; - weston_log("connector %d disconnected\n", output->connector_id); - drm_output_destroy(&output->base); + weston_log("connector %d disconnected\n", output->connector_id); + drm_output_destroy(&output->base); + } } wl_list_for_each_safe(output, next, &b->compositor->pending_output_list, base.link) { - bool disconnected = true; - - for (i = 0; i < resources->count_connectors; i++) { - if (connected[i] == output->connector_id) { - disconnected = false; - break; + if (output->base.output_type == OUTPUT_DRM) { + bool disconnected = true; + + for (i = 0; i < resources->count_connectors; i++) { + if (connected[i] == output->connector_id) { + disconnected = false; + break; + } } - } - if (!disconnected) - continue; + if (!disconnected) + continue; - weston_log("connector %d disconnected\n", output->connector_id); - drm_output_destroy(&output->base); + weston_log("connector %d disconnected\n", output->connector_id); + drm_output_destroy(&output->base); + } } free(connected); @@ -2925,18 +2934,21 @@ session_notify(struct wl_listener *listener, void *data) * pending frame callbacks. */ wl_list_for_each(output, &compositor->output_list, base.link) { - output->base.repaint_needed = 0; - drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0); + if(output->base.output_type == OUTPUT_DRM) { + output->base.repaint_needed = 0; + drmModeSetCursor(b->drm.fd, output->crtc_id, 0, 0, 0); + } + } + if(output->base.output_type == OUTPUT_DRM) { + output = container_of(compositor->output_list.next, + struct drm_output, base.link); + + wl_list_for_each(sprite, &b->sprite_list, link) + drmModeSetPlane(b->drm.fd, + sprite->plane_id, + output->crtc_id, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0); } - - output = container_of(compositor->output_list.next, - struct drm_output, base.link); - - wl_list_for_each(sprite, &b->sprite_list, link) - drmModeSetPlane(b->drm.fd, - sprite->plane_id, - output->crtc_id, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0); }; } @@ -3148,7 +3160,8 @@ switch_to_gl_renderer(struct drm_backend *b) } wl_list_for_each(output, &b->compositor->output_list, base.link) - pixman_renderer_output_destroy(&output->base); + if(output->base.output_type == OUTPUT_DRM) + pixman_renderer_output_destroy(&output->base); b->compositor->renderer->destroy(b->compositor); @@ -3160,7 +3173,8 @@ switch_to_gl_renderer(struct drm_backend *b) } wl_list_for_each(output, &b->compositor->output_list, base.link) - drm_output_init_egl(output, b); + if(output->base.output_type == OUTPUT_DRM) + drm_output_init_egl(output, b); b->use_pixman = 0; diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c index 44f0cf5..9cb903e 100644 --- a/libweston/compositor-fbdev.c +++ b/libweston/compositor-fbdev.c @@ -433,6 +433,7 @@ fbdev_output_enable(struct weston_output *base) int fb_fd; struct wl_event_loop *loop; + output->base.output_type = OUTPUT_FBDEV; /* Create the frame buffer. */ fb_fd = fbdev_frame_buffer_open(output, output->device, &output->fb_info); if (fb_fd < 0) { diff --git a/libweston/compositor-headless.c b/libweston/compositor-headless.c index a1aec6d..b0d5afb 100644 --- a/libweston/compositor-headless.c +++ b/libweston/compositor-headless.c @@ -148,6 +148,7 @@ headless_output_enable(struct weston_output *base) loop = wl_display_get_event_loop(b->compositor->wl_display); output->finish_frame_timer = wl_event_loop_add_timer(loop, finish_frame_handler, output); + output->base.output_type = OUTPUT_HEADLESS; if (b->use_pixman) { output->image_buf = malloc(output->base.current_mode->width * diff --git a/libweston/compositor-rdp.c b/libweston/compositor-rdp.c index d9668e8..d525982 100644 --- a/libweston/compositor-rdp.c +++ b/libweston/compositor-rdp.c @@ -519,6 +519,7 @@ rdp_output_enable(struct weston_output *base) struct rdp_backend *b = to_rdp_backend(base->compositor); struct wl_event_loop *loop; + output->base.output_type = OUTPUT_RDP; output->shadow_surface = pixman_image_create_bits(PIXMAN_x8r8g8b8, output->base.current_mode->width, output->base.current_mode->height, diff --git a/libweston/compositor-wayland.c b/libweston/compositor-wayland.c index 9d35ef7..66a0dbf 100644 --- a/libweston/compositor-wayland.c +++ b/libweston/compositor-wayland.c @@ -1164,6 +1164,7 @@ wayland_output_enable(struct weston_output *base) struct wayland_backend *b = to_wayland_backend(base->compositor); int ret = 0; + output->base.output_type = OUTPUT_WAYLAND; weston_log("Creating %dx%d wayland output at (%d, %d)\n", output->base.current_mode->width, output->base.current_mode->height, diff --git a/libweston/compositor-x11.c b/libweston/compositor-x11.c index f9cb461..fcf39e1 100644 --- a/libweston/compositor-x11.c +++ b/libweston/compositor-x11.c @@ -825,6 +825,7 @@ x11_output_enable(struct weston_output *base) XCB_EVENT_MASK_STRUCTURE_NOTIFY, 0 }; + output->base.output_type = OUTPUT_X11; if (!b->no_input) values[0] |= diff --git a/libweston/compositor.h b/libweston/compositor.h index 08e728a..51157d0 100644 --- a/libweston/compositor.h +++ b/libweston/compositor.h @@ -146,9 +146,21 @@ enum dpms_enum { WESTON_DPMS_OFF }; +/* bit compatible with drm definitions. */ +enum output_type { + OUTPUT_DRM, + OUTPUT_FBDEV, + OUTPUT_HEADLESS, + OUTPUT_RDP, + OUTPUT_WAYLAND, + OUTPUT_X11, + OUTPUT_WALTHAM +}; + struct weston_output { uint32_t id; char *name; + enum output_type output_type; void *renderer_state; -- 2.7.4