From 09550032b7e897755be30c6339f97489b07570ff Mon Sep 17 00:00:00 2001
From: emersion <contact@emersion.fr>
Date: Sun, 4 Nov 2018 09:23:57 +0100
Subject: 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;
 	}
-- 
cgit v1.2.3