From f1d3961d6c86983fab125897c2db8892100d2c12 Mon Sep 17 00:00:00 2001 From: Mihail Grigorov Date: Fri, 13 Oct 2017 11:24:56 +0300 Subject: meta-agl-bsp: imx6: Add EGL support for iMX6 in Weston 2.0 In Weston 2.0, the EGL support was dropped from the fbdev-backend, as that was not the correct way to initialize EGL. However, the vendor support patches in Weston 1.11 still require that functionality. Restore the EGL support in the fbdev-backend, until the issue is resolved, by either adding a standalone backend, or switching to etnaviv. Bug-AGL: SPEC-905 Change-Id: I9fc00e35c2eefee07998053e1fccec6265ac3b9e Signed-off-by: Mihail Grigorov Signed-off-by: Georgi Vlaev Reviewed-on: https://gerrit.automotivelinux.org/gerrit/11305 Reviewed-by: Leon Anavi Reviewed-by: Thomas Rini Reviewed-by: Matt Porter Tested-by: Jenkins Job builder account ci-image-build: Jenkins Job builder account ci-image-boot-test: Jenkins Job builder account Reviewed-by: Jan-Simon Moeller --- ...Restore-EGL-support-for-the-fbdev-backend.patch | 250 +++++++++++++++++++++ ...52-ccc-Add-GPU-VIV-support-for-weston-2.0.patch | 87 +++++++ .../weston-2.0.0/0006-Link-compositor-to-egl.patch | 12 + .../recipes-graphics/wayland/weston-init.bbappend | 1 + .../recipes-graphics/wayland/weston_2.0.0.bbappend | 38 ++++ 5 files changed, 388 insertions(+) create mode 100644 meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0001-libweston-Restore-EGL-support-for-the-fbdev-backend.patch create mode 100644 meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0002-MGS-2352-ccc-Add-GPU-VIV-support-for-weston-2.0.patch create mode 100644 meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0006-Link-compositor-to-egl.patch create mode 100644 meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-init.bbappend create mode 100644 meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_2.0.0.bbappend diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0001-libweston-Restore-EGL-support-for-the-fbdev-backend.patch b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0001-libweston-Restore-EGL-support-for-the-fbdev-backend.patch new file mode 100644 index 000000000..77bf2c5cb --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0001-libweston-Restore-EGL-support-for-the-fbdev-backend.patch @@ -0,0 +1,250 @@ +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 + diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0002-MGS-2352-ccc-Add-GPU-VIV-support-for-weston-2.0.patch b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0002-MGS-2352-ccc-Add-GPU-VIV-support-for-weston-2.0.patch new file mode 100644 index 000000000..2eca746a9 --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0002-MGS-2352-ccc-Add-GPU-VIV-support-for-weston-2.0.patch @@ -0,0 +1,87 @@ +From ca6720b1c19f1581112e6ee371dff6d06aeae569 Mon Sep 17 00:00:00 2001 +From: Meng Mingming +Date: Mon, 9 Jan 2017 15:04:27 +0800 +Subject: [PATCH 2/5] MGS-2352 [#ccc] Add GPU-VIV support for weston 2.0 + +Add GPU-VIV support for weston 2.0 + +Upstream Status: Inappropriate [i.MX specific] + +Date: Jan 09, 2017 + +* Weston 2.0 +This requires re-enabling the EGL initialization support +in the fbdev-backend. + +Signed-off-by: Meng Mingming +Signed-off-by: Georgi Vlaev +--- + libweston/compositor-fbdev.c | 22 ++++++++++++++++++++-- + 1 file changed, 20 insertions(+), 2 deletions(-) + +diff --git a/libweston/compositor-fbdev.c b/libweston/compositor-fbdev.c +index 4ca53b67..f87fccac 100644 +--- a/libweston/compositor-fbdev.c ++++ b/libweston/compositor-fbdev.c +@@ -62,6 +62,7 @@ struct fbdev_backend { + int use_pixman; + uint32_t output_transform; + struct wl_listener session_listener; ++ NativeDisplayType display; + }; + + struct fbdev_screeninfo { +@@ -94,6 +95,9 @@ struct fbdev_output { + /* pixman details. */ + pixman_image_t *hw_surface; + uint8_t depth; ++ ++ NativeDisplayType display; ++ NativeWindowType window; + }; + + struct gl_renderer_interface *gl_renderer; +@@ -444,6 +448,10 @@ fbdev_frame_buffer_destroy(struct fbdev_output *output) + strerror(errno)); + + output->fb = NULL; ++ if(output->window) ++ fbDestroyWindow(output->window); ++ if(output->display) ++ fbDestroyDisplay(output->display); + } + + static void fbdev_output_destroy(struct weston_output *base); +@@ -480,8 +488,13 @@ fbdev_output_enable(struct weston_output *base) + goto out_hw_surface; + } else { + setenv("HYBRIS_EGLPLATFORM", "wayland", 1); ++ output->window = fbCreateWindow(backend->display, -1, -1, 0, 0); ++ if (output->window == NULL) { ++ fprintf(stderr, "failed to create window\n"); ++ return 0; ++ } + if (gl_renderer->output_window_create(&output->base, +- (EGLNativeWindowType)NULL, NULL, ++ (EGLNativeWindowType)output->window, NULL, + gl_renderer->opaque_attribs, + NULL, 0) < 0) { + weston_log("gl_renderer_output_create failed.\n"); +@@ -808,8 +821,13 @@ fbdev_backend_create(struct weston_compositor *compositor, + goto out_launcher; + } + ++ backend->display = fbGetDisplay(backend->compositor->wl_display); ++ if (backend->display == NULL) { ++ weston_log("fbGetDisplay failed.\n"); ++ goto out_launcher; ++ } + if (gl_renderer->display_create(compositor, NO_EGL_PLATFORM, +- EGL_DEFAULT_DISPLAY, ++ backend->display, + NULL, + gl_renderer->opaque_attribs, + NULL, 0) < 0) { +-- +2.11.0 + diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0006-Link-compositor-to-egl.patch b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0006-Link-compositor-to-egl.patch new file mode 100644 index 000000000..3cad74fd4 --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-2.0.0/0006-Link-compositor-to-egl.patch @@ -0,0 +1,12 @@ +Index: weston-1.11.1/configure.ac +=================================================================== +--- weston-1.11.1.orig/configure.ac 2016-11-08 17:26:14.266564760 -0600 ++++ weston-1.11.1/configure.ac 2016-11-09 19:38:58.000000000 -0600 +@@ -93,6 +93,7 @@ + PKG_CHECK_MODULES(EGL, [egl glesv2]) + PKG_CHECK_MODULES([EGL_TESTS], [egl glesv2 wayland-client wayland-egl]) + PKG_CHECK_MODULES([GL_RENDERER], [libdrm]) ++ COMPOSITOR_MODULES="$COMPOSITOR_MODULES egl" + fi + + AC_ARG_ENABLE(xkbcommon, diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-init.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-init.bbappend new file mode 100644 index 000000000..2e1c950ec --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston-init.bbappend @@ -0,0 +1 @@ +WESTONARGS_append_imxgpu3d = " --use-gl" diff --git a/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_2.0.0.bbappend b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_2.0.0.bbappend new file mode 100644 index 000000000..683219968 --- /dev/null +++ b/meta-agl-bsp/meta-freescale-layer/recipes-graphics/wayland/weston_2.0.0.bbappend @@ -0,0 +1,38 @@ +FILESEXTRAPATHS_prepend := "${THISDIR}/weston-2.0.0:" + +SRC_URI_append_imxgpu3d = " \ + file://0001-libweston-Restore-EGL-support-for-the-fbdev-backend.patch \ + file://0002-MGS-2352-ccc-Add-GPU-VIV-support-for-weston-2.0.patch \ + file://0006-Link-compositor-to-egl.patch \ +" + +# The 'egl' configuration of weston requires gles support, and consideration +# must be taken for the different SoC capabilities: +# - For SoCs with 3d support, imx-gpu-viv provides hardware-accelerated +# egl and gles, so weston egl configuration is enabled. +# - For SoCs with VG2D, like i.MX 6SoloLite, imx-gpu-viv provides +# hardware-accelerated egl but does not provide a compatible software +# version of gles, so weston egl configuration is disabled. +# - For SoCs with no GPU, mesa provides software implementations of egl +# and gles, so weston egl configuration is enabled. +PACKAGECONFIG_IMX_TO_APPEND = "" +PACKAGECONFIG_IMX_TO_APPEND_imxgpu3d = "cairo-glesv2" +PACKAGECONFIG_IMX_TO_REMOVE = "" +PACKAGECONFIG_IMX_TO_REMOVE_imxgpu2d = "egl" +PACKAGECONFIG_IMX_TO_REMOVE_imxgpu3d = "" + +PACKAGECONFIG_append = " ${PACKAGECONFIG_IMX_TO_APPEND}" +PACKAGECONFIG_remove = " ${PACKAGECONFIG_IMX_TO_REMOVE}" + +EXTRA_OECONF_IMX_COMMON = " \ + --disable-libunwind \ + --disable-xwayland-test \ + WESTON_NATIVE_BACKEND=fbdev-backend.so \ +" +EXTRA_OECONF_IMX = "" +EXTRA_OECONF_IMX_imxpxp = "${EXTRA_OECONF_IMX_COMMON}" +EXTRA_OECONF_IMX_imxgpu2d = "${EXTRA_OECONF_IMX_COMMON}" + +EXTRA_OECONF_append = " ${EXTRA_OECONF_IMX}" + +PACKAGE_ARCH = "${MACHINE_SOCARCH}" -- cgit 1.2.3-korg