diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/gui/kernel/qopenglcontext.cpp | 13 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowseglcontext.cpp | 12 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.cpp | 8 | ||||
-rw-r--r-- | src/plugins/platforms/windows/qwindowswindow.h | 1 |
4 files changed, 31 insertions, 3 deletions
diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp index 3fccd6ba9a..90e9235353 100644 --- a/src/gui/kernel/qopenglcontext.cpp +++ b/src/gui/kernel/qopenglcontext.cpp @@ -590,10 +590,10 @@ QVariant QOpenGLContext::nativeHandle() const */ bool QOpenGLContext::create() { - if (isValid()) + Q_D(QOpenGLContext); + if (d->platformGLContext) destroy(); - Q_D(QOpenGLContext); d->platformGLContext = QGuiApplicationPrivate::platformIntegration()->createPlatformOpenGLContext(this); if (!d->platformGLContext) return false; @@ -676,6 +676,15 @@ QOpenGLContext::~QOpenGLContext() /*! Returns if this context is valid, i.e. has been successfully created. + On some platforms the return value of \c false for a context that was + successfully created previously indicates that the OpenGL context was lost. + + The typical way to handle context loss scenarios in applications is to + check via this function whenever makeCurrent() fails and returns \c false. + If this function then returns \c false, recreate the underlying native + OpenGL context by calling create(), call makeCurrent() again and then + reinitialize all OpenGL resources. + \sa create() */ bool QOpenGLContext::isValid() const diff --git a/src/plugins/platforms/windows/qwindowseglcontext.cpp b/src/plugins/platforms/windows/qwindowseglcontext.cpp index c0d0c1f77c..0872741e47 100644 --- a/src/plugins/platforms/windows/qwindowseglcontext.cpp +++ b/src/plugins/platforms/windows/qwindowseglcontext.cpp @@ -592,7 +592,17 @@ bool QWindowsEGLContext::makeCurrent(QPlatformSurface *surface) QWindowsEGLStaticContext::libEGL.eglSwapInterval(m_staticContext->display(), m_swapInterval); } } else { - qWarning("QWindowsEGLContext::makeCurrent: eglError: %x, this: %p \n", QWindowsEGLStaticContext::libEGL.eglGetError(), this); + int err = QWindowsEGLStaticContext::libEGL.eglGetError(); + // EGL_CONTEXT_LOST (loss of the D3D device) is not necessarily fatal. + // Qt Quick is able to recover for example. + if (err == EGL_CONTEXT_LOST) { + m_eglContext = EGL_NO_CONTEXT; + qCDebug(lcQpaGl) << "Got EGL context lost in makeCurrent() for context" << this; + // Drop the surface. Will recreate on the next makeCurrent. + window->invalidateSurface(); + } else { + qWarning("QWindowsEGLContext::makeCurrent: eglError: %x, this: %p \n", err, this); + } } return ok; diff --git a/src/plugins/platforms/windows/qwindowswindow.cpp b/src/plugins/platforms/windows/qwindowswindow.cpp index 5d94ec3c38..5dfc48df99 100644 --- a/src/plugins/platforms/windows/qwindowswindow.cpp +++ b/src/plugins/platforms/windows/qwindowswindow.cpp @@ -2294,6 +2294,14 @@ void *QWindowsWindow::surface(void *nativeConfig) #endif } +void QWindowsWindow::invalidateSurface() +{ + if (m_surface) { + m_data.staticOpenGLContext->destroyWindowSurface(m_surface); + m_surface = 0; + } +} + void QWindowsWindow::setTouchWindowTouchTypeStatic(QWindow *window, QWindowsWindowFunctions::TouchWindowTouchTypes touchTypes) { if (!window->handle()) diff --git a/src/plugins/platforms/windows/qwindowswindow.h b/src/plugins/platforms/windows/qwindowswindow.h index 66102511e0..3e2f488f46 100644 --- a/src/plugins/platforms/windows/qwindowswindow.h +++ b/src/plugins/platforms/windows/qwindowswindow.h @@ -254,6 +254,7 @@ public: void setWindowIcon(const QIcon &icon); void *surface(void *nativeConfig); + void invalidateSurface() Q_DECL_OVERRIDE; #ifndef Q_OS_WINCE void setAlertState(bool enabled); |