From e315b0f9fee61f7af2e870b3888233c0faba0433 Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Sun, 15 Aug 2021 12:32:06 +0300 Subject: [PATCH] Remove Platform::sceneEglConfig() With per-screen rendering, every output may have different EGLConfig. Having a single global EGLConfig doesn't work out well. This change removes Platform::sceneEglConfig(). It's used primarily to create the global share context. In hindsight, the global share context can be created without EGLConfig as it's never made current. EGL_NO_CONFIG_KHR is part of EGL_KHR_no_config_context extension, which is supported by both Mesa and NVIDIA driver so it should be safe to make it mandatory. --- src/platform.h | 15 --------------- .../scenes/opengl/abstract_egl_backend.cpp | 18 ++++++++++++------ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/src/platform.h b/src/platform.h index 413572bb28..1b89708727 100644 --- a/src/platform.h +++ b/src/platform.h @@ -119,20 +119,6 @@ public: */ void setSceneEglGlobalShareContext(EGLContext context); - /** - * The EglConfig used by the compositing scene. - */ - EGLConfig sceneEglConfig() const { - return m_eglConfig; - } - /** - * Sets the @p config used by the compositing scene. - * @see sceneEglConfig - */ - void setSceneEglConfig(EGLConfig config) { - m_eglConfig = config; - } - /** * Implementing subclasses should provide a size in case the backend represents * a basic screen and uses the BasicScreens. @@ -547,7 +533,6 @@ private: int m_initialOutputCount = 1; qreal m_initialOutputScale = 1; EGLDisplay m_eglDisplay; - EGLConfig m_eglConfig = nullptr; EGLContext m_context = EGL_NO_CONTEXT; EGLContext m_globalShareContext = EGL_NO_CONTEXT; int m_hideCursorCounter = 0; diff --git a/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp b/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp index eb8f44f430..307abb2855 100644 --- a/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp +++ b/src/platformsupport/scenes/opengl/abstract_egl_backend.cpp @@ -40,7 +40,6 @@ static bool isOpenGLES_helper() static EGLContext ensureGlobalShareContext() { const EGLDisplay eglDisplay = kwinApp()->platform()->sceneEglDisplay(); - const EGLConfig eglConfig = kwinApp()->platform()->sceneEglConfig(); if (kwinApp()->platform()->sceneEglGlobalShareContext() != EGL_NO_CONTEXT) { return kwinApp()->platform()->sceneEglGlobalShareContext(); @@ -56,7 +55,7 @@ static EGLContext ensureGlobalShareContext() attribs = builder.build(); } - s_globalShareContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, attribs.data()); + s_globalShareContext = eglCreateContext(eglDisplay, EGL_NO_CONFIG_KHR, EGL_NO_CONTEXT, attribs.data()); if (s_globalShareContext == EGL_NO_CONTEXT) { qCWarning(KWIN_OPENGL, "Failed to create global share context: 0x%x", eglGetError()); } @@ -108,7 +107,6 @@ void AbstractEglBackend::cleanup() eglDestroyContext(m_display, m_context); eglReleaseThread(); kwinApp()->platform()->setSceneEglContext(EGL_NO_CONTEXT); - kwinApp()->platform()->setSceneEglConfig(nullptr); } } @@ -144,6 +142,17 @@ bool AbstractEglBackend::initEglAPI() qCDebug(KWIN_OPENGL) << "EGL version: " << major << "." << minor; const QByteArray eglExtensions = eglQueryString(m_display, EGL_EXTENSIONS); setExtensions(eglExtensions.split(' ')); + + const QByteArray requiredExtensions[] = { + QByteArrayLiteral("EGL_KHR_no_config_context"), + }; + for (const QByteArray &extensionName : requiredExtensions) { + if (!hasExtension(extensionName)) { + qCWarning(KWIN_OPENGL) << extensionName << "extension is unsupported"; + return false; + } + } + setSupportsSurfacelessContext(hasExtension(QByteArrayLiteral("EGL_KHR_surfaceless_context"))); setSupportsNativeFence(hasExtension(QByteArrayLiteral("EGL_ANDROID_native_fence_sync"))); return true; @@ -355,9 +364,6 @@ void AbstractEglBackend::setEglDisplay(const EGLDisplay &display) { void AbstractEglBackend::setConfig(const EGLConfig &config) { m_config = config; - if (isPrimary()) { - kwinApp()->platform()->setSceneEglConfig(config); - } } void AbstractEglBackend::setSurface(const EGLSurface &surface)