From c43b64cad0fdc55594434a68faa25447b50ca7c5 Mon Sep 17 00:00:00 2001 From: Georgi Vlaev Date: Wed, 27 Sep 2017 14:00:50 +0300 Subject: [PATCH 1/5] libweston: Restore EGL support for the fbdev backend In Weston 2.0, the EGL support was dropped from the fbdev-backend, as that was not the correct way to initialize the EGL in first place. However, the vendor support patches in Weston 1.11 still require that functionality. Teporary restore the EGL support in the fbdev-backend, until a separate vendor backend is available, or switch to using etnaviv. Signed-off-by: Georgi Vlaev --- compositor/main.c | 2 + libweston/compositor-fbdev.c | 99 +++++++++++++++++++++++++++++++++++++------- libweston/compositor-fbdev.h | 1 + 3 files changed, 87 insertions(+), 15 deletions(-) diff --git a/compositor/main.c b/compositor/main.c index 72c3cd10..6c45a018 100644 --- a/compositor/main.c +++ b/compositor/main.c @@ -574,6 +574,7 @@ usage(int error_code) "Options for fbdev-backend.so:\n\n" " --tty=TTY\t\tThe tty to use\n" " --device=DEVICE\tThe framebuffer device to use\n" + " --use-gl\t\tUse the GL renderer\n" "\n"); #endif @@ -1444,6 +1445,7 @@ load_fbdev_backend(struct weston_compositor *c, const struct weston_option fbdev_options[] = { { WESTON_OPTION_INTEGER, "tty", 0, &config.tty }, { WESTON_OPTION_STRING, "device", 0, &config.device }, + { WESTON_OPTION_BOOLEAN, "use-gl", 0, &config.use_gl }, }; parse_options(fbdev_options, ARRAY_LENGTH(fbdev_options), argc, argv); diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c index 44f0cf51..4ca53b67 100644 --- a/libweston/compositor-fbdev.c +++ b/libweston/compositor-fbdev.c @@ -49,6 +49,7 @@ #include "launcher-util.h" #include "pixman-renderer.h" #include "libinput-seat.h" +#include "gl-renderer.h" #include "presentation-time-server-protocol.h" struct fbdev_backend { @@ -58,6 +59,7 @@ struct fbdev_backend { struct udev *udev; struct udev_input input; + int use_pixman; uint32_t output_transform; struct wl_listener session_listener; }; @@ -94,6 +96,8 @@ struct fbdev_output { uint8_t depth; }; +struct gl_renderer_interface *gl_renderer; + static const char default_seat[] = "seat0"; static inline struct fbdev_output * @@ -117,8 +121,8 @@ fbdev_output_start_repaint_loop(struct weston_output *output) weston_output_finish_frame(output, &ts, WP_PRESENTATION_FEEDBACK_INVALID); } -static int -fbdev_output_repaint(struct weston_output *base, pixman_region32_t *damage) +static void +fbdev_output_repaint_pixman(struct weston_output *base, pixman_region32_t *damage) { struct fbdev_output *output = to_fbdev_output(base); struct weston_compositor *ec = output->base.compositor; @@ -140,6 +144,26 @@ fbdev_output_repaint(struct weston_output *base, pixman_region32_t *damage) * refresh rate is given in mHz and the interval in ms. */ wl_event_source_timer_update(output->finish_frame_timer, 1000000 / output->mode.refresh); +} + +static int +fbdev_output_repaint(struct weston_output *base, pixman_region32_t *damage) +{ + struct fbdev_output *output = to_fbdev_output(base); + struct fbdev_backend *backend = output->backend; + struct weston_compositor *ec = backend->compositor; + + if (backend->use_pixman) { + fbdev_output_repaint_pixman(base,damage); + } else { + ec->renderer->repaint_output(base, damage); + /* Update the damage region. */ + pixman_region32_subtract(&ec->primary_plane.damage, + &ec->primary_plane.damage, damage); + + wl_event_source_timer_update(output->finish_frame_timer, + 1000000 / output->mode.refresh); + } return 0; } @@ -440,16 +464,30 @@ fbdev_output_enable(struct weston_output *base) return -1; } - if (fbdev_frame_buffer_map(output, fb_fd) < 0) { - weston_log("Mapping frame buffer failed.\n"); - return -1; - } + if (backend->use_pixman) { + if (fbdev_frame_buffer_map(output, fb_fd) < 0) { + weston_log("Mapping frame buffer failed.\n"); + return -1; + } + } else + close(fb_fd); output->base.start_repaint_loop = fbdev_output_start_repaint_loop; output->base.repaint = fbdev_output_repaint; - if (pixman_renderer_output_create(&output->base) < 0) - goto out_hw_surface; + if (backend->use_pixman) { + if (pixman_renderer_output_create(&output->base) < 0) + goto out_hw_surface; + } else { + setenv("HYBRIS_EGLPLATFORM", "wayland", 1); + if (gl_renderer->output_window_create(&output->base, + (EGLNativeWindowType)NULL, NULL, + gl_renderer->opaque_attribs, + NULL, 0) < 0) { + weston_log("gl_renderer_output_create failed.\n"); + goto out_hw_surface; + } + } loop = wl_display_get_event_loop(backend->compositor->wl_display); output->finish_frame_timer = @@ -534,14 +572,19 @@ static void fbdev_output_destroy(struct weston_output *base) { struct fbdev_output *output = to_fbdev_output(base); + struct fbdev_backend *backend = output->backend; weston_log("Destroying fbdev output.\n"); /* Close the frame buffer. */ fbdev_output_disable(base); - if (base->renderer_state != NULL) - pixman_renderer_output_destroy(base); + if (backend->use_pixman) { + if (base->renderer_state != NULL) + pixman_renderer_output_destroy(base); + } else { + gl_renderer->output_destroy(base); + } /* Remove the output. */ weston_output_destroy(&output->base); @@ -610,9 +653,11 @@ fbdev_output_reenable(struct fbdev_backend *backend, } /* Map the device if it has the same details as before. */ - if (fbdev_frame_buffer_map(output, fb_fd) < 0) { - weston_log("Mapping frame buffer failed.\n"); - goto err; + if (backend->use_pixman) { + if (fbdev_frame_buffer_map(output, fb_fd) < 0) { + weston_log("Mapping frame buffer failed.\n"); + goto err; + } } return 0; @@ -628,9 +673,13 @@ static void fbdev_output_disable(struct weston_output *base) { struct fbdev_output *output = to_fbdev_output(base); + struct fbdev_backend *backend = output->backend; weston_log("Disabling fbdev output.\n"); + if (!backend->use_pixman) + return; + if (output->hw_surface != NULL) { pixman_image_unref(output->hw_surface); output->hw_surface = NULL; @@ -744,11 +793,30 @@ fbdev_backend_create(struct weston_compositor *compositor, backend->base.restore = fbdev_restore; backend->prev_state = WESTON_COMPOSITOR_ACTIVE; + backend->use_pixman = !param->use_gl; weston_setup_vt_switch_bindings(compositor); - if (pixman_renderer_init(compositor) < 0) - goto out_launcher; + if (backend->use_pixman) { + if (pixman_renderer_init(compositor) < 0) + goto out_launcher; + } else { + gl_renderer = weston_load_module("gl-renderer.so", + "gl_renderer_interface"); + if (!gl_renderer) { + weston_log("could not load gl renderer\n"); + goto out_launcher; + } + + if (gl_renderer->display_create(compositor, NO_EGL_PLATFORM, + EGL_DEFAULT_DISPLAY, + NULL, + gl_renderer->opaque_attribs, + NULL, 0) < 0) { + weston_log("gl_renderer_create failed.\n"); + goto out_launcher; + } + } if (fbdev_output_create(backend, param->device) < 0) goto out_launcher; @@ -779,6 +847,7 @@ config_init_to_defaults(struct weston_fbdev_backend_config *config) * udev, rather than passing a device node in as a parameter. */ config->tty = 0; /* default to current tty */ config->device = "/dev/fb0"; /* default frame buffer */ + config->use_gl = 0; } WL_EXPORT int diff --git a/libweston/compositor-fbdev.h b/libweston/compositor-fbdev.h index 8b7d900e..806712f9 100644 --- a/libweston/compositor-fbdev.h +++ b/libweston/compositor-fbdev.h @@ -43,6 +43,7 @@ struct weston_fbdev_backend_config { int tty; char *device; + int use_gl; /** Callback used to configure input devices. * -- 2.11.0