From 09550032b7e897755be30c6339f97489b07570ff Mon Sep 17 00:00:00 2001 From: emersion Date: Sun, 4 Nov 2018 09:23:57 +0100 Subject: [PATCH] render: correctly set EGL_RENDERABLE_TYPE This should be set to EGL_OPENGL_ES2_BIT. Also fixes EGL config attributes in the headless and X11 backends. --- backend/headless/backend.c | 7 +++---- backend/x11/backend.c | 11 ++++++++++- render/wlr_renderer.c | 25 ++++++++++++++++++++++++- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/backend/headless/backend.c b/backend/headless/backend.c index cbc158f3..c0fc6022 100644 --- a/backend/headless/backend.c +++ b/backend/headless/backend.c @@ -103,10 +103,9 @@ struct wlr_backend *wlr_headless_backend_create(struct wl_display *display, static const EGLint config_attribs[] = { EGL_SURFACE_TYPE, EGL_PBUFFER_BIT, EGL_ALPHA_SIZE, 0, - EGL_BLUE_SIZE, 8, - EGL_GREEN_SIZE, 8, - EGL_RED_SIZE, 8, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_BLUE_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_RED_SIZE, 1, EGL_NONE, }; diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 7053e2f0..c0a11fbb 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -282,8 +282,17 @@ struct wlr_backend *wlr_x11_backend_create(struct wl_display *display, create_renderer_func = wlr_renderer_autocreate; } + static EGLint config_attribs[] = { + EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_RED_SIZE, 1, + EGL_GREEN_SIZE, 1, + EGL_BLUE_SIZE, 1, + EGL_ALPHA_SIZE, 0, + EGL_NONE, + }; + x11->renderer = create_renderer_func(&x11->egl, EGL_PLATFORM_X11_KHR, - x11->xlib_conn, NULL, x11->screen->root_visual); + x11->xlib_conn, config_attribs, x11->screen->root_visual); if (x11->renderer == NULL) { wlr_log(WLR_ERROR, "Failed to create renderer"); diff --git a/render/wlr_renderer.c b/render/wlr_renderer.c index 10dc6db2..ca1a337d 100644 --- a/render/wlr_renderer.c +++ b/render/wlr_renderer.c @@ -198,7 +198,30 @@ void wlr_renderer_init_wl_display(struct wlr_renderer *r, struct wlr_renderer *wlr_renderer_autocreate(struct wlr_egl *egl, EGLenum platform, void *remote_display, EGLint *config_attribs, EGLint visual_id) { - if (!wlr_egl_init(egl, platform, remote_display, config_attribs, visual_id)) { + // Append GLES2-specific bits to the provided EGL config attributes + EGLint gles2_config_attribs[] = { + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE, + }; + + size_t config_attribs_len = 0; // not including terminating EGL_NONE + while (config_attribs != NULL && + config_attribs[config_attribs_len] != EGL_NONE) { + ++config_attribs_len; + } + + size_t all_config_attribs_len = config_attribs_len + + sizeof(gles2_config_attribs) / sizeof(gles2_config_attribs[0]); + EGLint all_config_attribs[all_config_attribs_len]; + if (config_attribs_len > 0) { + memcpy(all_config_attribs, config_attribs, + config_attribs_len * sizeof(EGLint)); + } + memcpy(&all_config_attribs[config_attribs_len], gles2_config_attribs, + sizeof(gles2_config_attribs)); + + if (!wlr_egl_init(egl, platform, remote_display, all_config_attribs, + visual_id)) { wlr_log(WLR_ERROR, "Could not initialize EGL"); return NULL; }