aboutsummaryrefslogtreecommitdiff
path: root/render/egl.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-12-17 20:48:01 -0500
committerGitHub <noreply@github.com>2017-12-17 20:48:01 -0500
commitf3769a4b1f552b7dc826418e78b88bffe277c2c4 (patch)
treefe07e6a1333f8f96a9075deb26e3ea96519e618b /render/egl.c
parent10c72f4bf6202bfce89e5a40b03475dd28cd68df (diff)
parentb99d1f4fcca0f8d7b1d2042f51fdefcc73304e6f (diff)
Merge pull request #496 from emersion/headless-backend
Headless backend
Diffstat (limited to 'render/egl.c')
-rw-r--r--render/egl.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/render/egl.c b/render/egl.c
index e895df8d..fe20973c 100644
--- a/render/egl.c
+++ b/render/egl.c
@@ -1,3 +1,4 @@
+#include <assert.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <GLES2/gl2.h>
@@ -47,7 +48,8 @@ const char *egl_error(void) {
}
}
-static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
+static bool egl_get_config(EGLDisplay disp, EGLint *attribs, EGLConfig *out,
+ EGLint visual_id) {
EGLint count = 0, matched = 0, ret;
ret = eglGetConfigs(disp, NULL, 0, &count);
@@ -58,7 +60,7 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
EGLConfig configs[count];
- ret = eglChooseConfig(disp, NULL, configs, count, &matched);
+ ret = eglChooseConfig(disp, attribs, configs, count, &matched);
if (ret == EGL_FALSE) {
wlr_log(L_ERROR, "eglChooseConfig failed");
return false;
@@ -71,7 +73,7 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
continue;
}
- if (visual == visual_id) {
+ if (!visual_id || visual == visual_id) {
*out = configs[i];
return true;
}
@@ -81,8 +83,8 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) {
return false;
}
-bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
- void *remote_display) {
+bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *remote_display,
+ EGLint *config_attribs, EGLint visual_id) {
if (!load_glapi()) {
return false;
}
@@ -92,7 +94,12 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
goto error;
}
- egl->display = eglGetPlatformDisplayEXT(platform, remote_display, NULL);
+ if (platform == EGL_PLATFORM_SURFACELESS_MESA) {
+ assert(remote_display == NULL);
+ egl->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
+ } else {
+ egl->display = eglGetPlatformDisplayEXT(platform, remote_display, NULL);
+ }
if (egl->display == EGL_NO_DISPLAY) {
wlr_log(L_ERROR, "Failed to create EGL display: %s", egl_error());
goto error;
@@ -104,7 +111,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id,
goto error;
}
- if (!egl_get_config(egl->display, &egl->config, visual_id)) {
+ if (!egl_get_config(egl->display, config_attribs, &egl->config, visual_id)) {
wlr_log(L_ERROR, "Failed to get EGL config");
goto error;
}