diff --git a/backend/drm/drm.c b/backend/drm/drm.c index 8e70e528..1a656172 100644 --- a/backend/drm/drm.c +++ b/backend/drm/drm.c @@ -182,7 +182,8 @@ bool wlr_drm_renderer_init(struct wlr_drm_renderer *renderer, int fd) { return false; } - if (!wlr_egl_init(&renderer->egl, EGL_PLATFORM_GBM_MESA, renderer->gbm)) { + if (!wlr_egl_init(&renderer->egl, EGL_PLATFORM_GBM_MESA, + GBM_FORMAT_ARGB8888, renderer->gbm)) { gbm_device_destroy(renderer->gbm); return false; } diff --git a/backend/wayland/backend.c b/backend/wayland/backend.c index 264ce338..e57f3583 100644 --- a/backend/wayland/backend.c +++ b/backend/wayland/backend.c @@ -42,6 +42,7 @@ static bool wlr_wl_backend_start(struct wlr_backend *_backend) { } backend->started = true; + for (size_t i = 0; i < backend->requested_outputs; ++i) { wlr_wl_output_create(&backend->backend); } @@ -145,7 +146,7 @@ struct wlr_backend *wlr_wl_backend_create(struct wl_display *display) { return false; } - wlr_egl_init(&backend->egl, EGL_PLATFORM_WAYLAND_EXT, backend->remote_display); + wlr_egl_init(&backend->egl, EGL_PLATFORM_WAYLAND_EXT, WL_SHM_FORMAT_ARGB8888, backend->remote_display); wlr_egl_bind_display(&backend->egl, backend->local_display); return &backend->backend; diff --git a/include/wlr/egl.h b/include/wlr/egl.h index b37317a5..25329175 100644 --- a/include/wlr/egl.h +++ b/include/wlr/egl.h @@ -30,7 +30,7 @@ struct wlr_egl { * Initializes an egl context for the given platform and remote display. * Will attempt to load all possibly required api functions. */ -bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, void *display); +bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id, void *display); /** * Frees all related egl resources, makes the context not-current and diff --git a/render/egl.c b/render/egl.c index 048626ba..82dea50c 100644 --- a/render/egl.c +++ b/render/egl.c @@ -1,7 +1,6 @@ #include #include #include -#include // GBM_FORMAT_XRGB8888 #include #include #include @@ -68,7 +67,7 @@ static bool egl_exts(struct wlr_egl *egl) { return true; } -static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLenum platform) { +static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLint visual_id) { EGLint count = 0, matched = 0, ret; ret = eglGetConfigs(disp, NULL, 0, &count); @@ -86,21 +85,13 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLenum platform) { } for (int i = 0; i < matched; ++i) { - EGLint gbm_format; - - if (platform == EGL_PLATFORM_WAYLAND_EXT) { - *out = configs[i]; - return true; - } - - if (!eglGetConfigAttrib(disp, - configs[i], - EGL_NATIVE_VISUAL_ID, - &gbm_format)) { + EGLint visual; + if (!eglGetConfigAttrib(disp, configs[i], + EGL_NATIVE_VISUAL_ID, &visual)) { continue; } - if (gbm_format == GBM_FORMAT_ARGB8888) { + if (visual == visual_id) { *out = configs[i]; return true; } @@ -110,7 +101,7 @@ static bool egl_get_config(EGLDisplay disp, EGLConfig *out, EGLenum platform) { return false; } -bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, +bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, EGLint visual_id, void *remote_display) { if (!egl_exts(egl)) { return false; @@ -133,7 +124,7 @@ bool wlr_egl_init(struct wlr_egl *egl, EGLenum platform, goto error; } - if (!egl_get_config(egl->display, &egl->config, platform)) { + if (!egl_get_config(egl->display, &egl->config, visual_id)) { wlr_log(L_ERROR, "Failed to get EGL config"); goto error; }