diff options
Diffstat (limited to 'src/hardwareintegration')
4 files changed, 17 insertions, 0 deletions
diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp index 8221d5d9..ca7d58f3 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow.cpp @@ -140,6 +140,12 @@ void QWaylandEglWindow::invalidateSurface() m_contentFBO = nullptr; } +void QWaylandEglWindow::reinit() +{ + QWaylandWindow::reinit(); + m_clientBufferIntegration = static_cast<QWaylandEglClientBufferIntegration *>(mDisplay->clientBufferIntegration()); +} + EGLSurface QWaylandEglWindow::eglSurface() const { return m_eglSurface; diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h index 5b9aa987..cfcdd577 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h +++ b/src/hardwareintegration/client/wayland-egl/qwaylandeglwindow_p.h @@ -50,6 +50,7 @@ public: void bindContentFBO(); void invalidateSurface() override; + void reinit() override; private: QWaylandEglClientBufferIntegration *m_clientBufferIntegration = nullptr; diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp index 0b64db5c..050b3eba 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext.cpp @@ -195,6 +195,10 @@ QWaylandGLContext::QWaylandGLContext(EGLDisplay eglDisplay, QWaylandDisplay *dis const QSurfaceFormat &fmt, QPlatformOpenGLContext *share) : QEGLPlatformContext(fmt, share, eglDisplay), m_display(display) { + m_reconnectionWatcher = QObject::connect(m_display, &QWaylandDisplay::reconnected, [this]() { + invalidateContext(); + }); + switch (format().renderableType()) { case QSurfaceFormat::OpenVG: m_api = EGL_OPENVG_API; @@ -260,6 +264,7 @@ void QWaylandGLContext::destroyTemporaryOffscreenSurface(EGLSurface eglSurface) QWaylandGLContext::~QWaylandGLContext() { + QObject::disconnect(m_reconnectionWatcher); delete m_blitter; m_blitter = nullptr; if (m_decorationsContext != EGL_NO_CONTEXT) @@ -280,6 +285,10 @@ void QWaylandGLContext::endFrame() bool QWaylandGLContext::makeCurrent(QPlatformSurface *surface) { + if (!isValid()) { + return false; + } + // in QWaylandGLContext() we called eglBindAPI with the correct value. However, // eglBindAPI's documentation says: // "eglBindAPI defines the current rendering API for EGL in the thread it is called from" diff --git a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h index 00ef99b1..b985c667 100644 --- a/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h +++ b/src/hardwareintegration/client/wayland-egl/qwaylandglcontext_p.h @@ -62,6 +62,7 @@ private: wl_surface *m_wlSurface = nullptr; wl_egl_window *m_eglWindow = nullptr; QWaylandEglWindow *m_currentWindow = nullptr; + QMetaObject::Connection m_reconnectionWatcher; }; } |