diff --git a/abstract_egl_backend.h b/abstract_egl_backend.h --- a/abstract_egl_backend.h +++ b/abstract_egl_backend.h @@ -39,17 +39,17 @@ EGLContext context() const { return m_context; } - - static void unbindWaylandDisplay(); - -protected: - AbstractEglBackend(); EGLSurface surface() const { return m_surface; } EGLConfig config() const { return m_config; } + + static void unbindWaylandDisplay(); + +protected: + AbstractEglBackend(); void setEglDisplay(const EGLDisplay &display); void setSurface(const EGLSurface &surface) { m_surface = surface; diff --git a/platform.h b/platform.h --- a/platform.h +++ b/platform.h @@ -71,6 +71,15 @@ * The EGLContext used by the compositing scene. **/ virtual EGLContext sceneEglContext() const; + /** + * The first (in case of multiple) EGLSurface used by the compositing scene. + **/ + EGLSurface sceneEglSurface() const; + + /** + * The EglConfig used by the compositing scene. + **/ + EGLConfig sceneEglConfig() const; /** * Implementing subclasses should provide a size in case the backend represents diff --git a/platform.cpp b/platform.cpp --- a/platform.cpp +++ b/platform.cpp @@ -274,6 +274,26 @@ return EGL_NO_CONTEXT; } +EGLSurface Platform::sceneEglSurface() const +{ + if (Compositor *c = Compositor::self()) { + if (SceneOpenGL *s = dynamic_cast(c->scene())) { + return static_cast(s->backend())->surface(); + } + } + return EGL_NO_SURFACE; +} + +EGLConfig Platform::sceneEglConfig() const +{ + if (Compositor *c = Compositor::self()) { + if (SceneOpenGL *s = dynamic_cast(c->scene())) { + return static_cast(s->backend())->config(); + } + } + return nullptr; +} + QSize Platform::screenSize() const { return QSize(); diff --git a/plugins/qpa/abstractplatformcontext.h b/plugins/qpa/abstractplatformcontext.h --- a/plugins/qpa/abstractplatformcontext.h +++ b/plugins/qpa/abstractplatformcontext.h @@ -33,7 +33,7 @@ class AbstractPlatformContext : public QPlatformOpenGLContext { public: - explicit AbstractPlatformContext(QOpenGLContext *context, Integration *integration, EGLDisplay display); + explicit AbstractPlatformContext(QOpenGLContext *context, Integration *integration, EGLDisplay display, EGLConfig config = nullptr); virtual ~AbstractPlatformContext(); void doneCurrent() override; diff --git a/plugins/qpa/abstractplatformcontext.cpp b/plugins/qpa/abstractplatformcontext.cpp --- a/plugins/qpa/abstractplatformcontext.cpp +++ b/plugins/qpa/abstractplatformcontext.cpp @@ -93,11 +93,11 @@ return format; } -AbstractPlatformContext::AbstractPlatformContext(QOpenGLContext *context, Integration *integration, EGLDisplay display) +AbstractPlatformContext::AbstractPlatformContext(QOpenGLContext *context, Integration *integration, EGLDisplay display, EGLConfig config) : QPlatformOpenGLContext() , m_integration(integration) , m_eglDisplay(display) - , m_config(configFromGLFormat(m_eglDisplay, context->format())) + , m_config(config ? config :configFromGLFormat(m_eglDisplay, context->format())) , m_format(formatFromConfig(m_eglDisplay, m_config)) { } diff --git a/plugins/qpa/integration.cpp b/plugins/qpa/integration.cpp --- a/plugins/qpa/integration.cpp +++ b/plugins/qpa/integration.cpp @@ -180,6 +180,13 @@ if (kwinApp()->platform()->supportsQpaContext()) { return new SharingPlatformContext(context, const_cast(this)); } + if (kwinApp()->platform()->sceneEglDisplay() != EGL_NO_DISPLAY) { + auto s = kwinApp()->platform()->sceneEglSurface(); + if (s != EGL_NO_SURFACE) { + // try a SharingPlatformContext with a created surface + return new SharingPlatformContext(context, const_cast(this), s, kwinApp()->platform()->sceneEglConfig()); + } + } if (m_eglDisplay == EGL_NO_DISPLAY) { const_cast(this)->initEgl(); } diff --git a/plugins/qpa/sharingplatformcontext.h b/plugins/qpa/sharingplatformcontext.h --- a/plugins/qpa/sharingplatformcontext.h +++ b/plugins/qpa/sharingplatformcontext.h @@ -32,6 +32,7 @@ { public: explicit SharingPlatformContext(QOpenGLContext *context, Integration *integration); + explicit SharingPlatformContext(QOpenGLContext *context, Integration *integration, const EGLSurface &surface, EGLConfig config = nullptr); void swapBuffers(QPlatformSurface *surface) override; @@ -43,6 +44,8 @@ private: void create(); + + EGLSurface m_surface; }; } diff --git a/plugins/qpa/sharingplatformcontext.cpp b/plugins/qpa/sharingplatformcontext.cpp --- a/plugins/qpa/sharingplatformcontext.cpp +++ b/plugins/qpa/sharingplatformcontext.cpp @@ -34,15 +34,21 @@ { SharingPlatformContext::SharingPlatformContext(QOpenGLContext *context, Integration *integration) - : AbstractPlatformContext(context, integration, kwinApp()->platform()->sceneEglDisplay()) + : SharingPlatformContext(context, integration, EGL_NO_SURFACE) +{ +} + +SharingPlatformContext::SharingPlatformContext(QOpenGLContext *context, Integration *integration, const EGLSurface &surface, EGLConfig config) + : AbstractPlatformContext(context, integration, kwinApp()->platform()->sceneEglDisplay(), config) + , m_surface(surface) { create(); } bool SharingPlatformContext::makeCurrent(QPlatformSurface *surface) { Window *window = static_cast(surface); - if (eglMakeCurrent(eglDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, context())) { + if (eglMakeCurrent(eglDisplay(), m_surface, m_surface, context())) { window->bindContentFBO(); return true; }