summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Arne Vestbø <[email protected]>2018-07-18 20:36:26 +0200
committerTor Arne Vestbø <[email protected]>2018-07-20 06:40:04 +0000
commitcc27a50ef8d7de08df48ea25e89e6f1fb9f0dc2e (patch)
tree920513f4b030b24a5354f349a03d7ce95b114aac
parent8c91070606bffabb49d2d17fb78a78b459dd8bef (diff)
QGLWidget: Gracefully handle failed makeCurrent during resize and paint event
The underlying QOpenGLContext may fail to be made current, e.g. if the surface is not exposed, or the graphics hardware is not available. Instead of trying to initialize and resize the GL viewport with a non-current context, we return early and defer the init and resize until later. Change-Id: I278ca8f1ad4d3da2d5be18b44d775f8d6c8af726 Reviewed-by: Simon Hausmann <[email protected]> Reviewed-by: Tor Arne Vestbø <[email protected]>
-rw-r--r--src/opengl/qgl.cpp17
-rw-r--r--src/opengl/qgl_p.h2
2 files changed, 15 insertions, 4 deletions
diff --git a/src/opengl/qgl.cpp b/src/opengl/qgl.cpp
index 4eb7a194d91..1132411d420 100644
--- a/src/opengl/qgl.cpp
+++ b/src/opengl/qgl.cpp
@@ -4084,7 +4084,13 @@ bool QGLWidget::isSharing() const
void QGLWidget::makeCurrent()
{
Q_D(QGLWidget);
- d->glcx->makeCurrent();
+ d->makeCurrent();
+}
+
+bool QGLWidgetPrivate::makeCurrent()
+{
+ glcx->makeCurrent();
+ return QGLContext::currentContext() == glcx;
}
/*!
@@ -4422,7 +4428,8 @@ void QGLWidget::resizeEvent(QResizeEvent *e)
QWidget::resizeEvent(e);
if (!isValid())
return;
- makeCurrent();
+ if (!d->makeCurrent())
+ return;
if (!d->glcx->initialized())
glInit();
const qreal scaleFactor = (window() && window()->windowHandle()) ?
@@ -4537,7 +4544,8 @@ void QGLWidget::glInit()
Q_D(QGLWidget);
if (!isValid())
return;
- makeCurrent();
+ if (!d->makeCurrent())
+ return;
initializeGL();
d->glcx->setInitialized(true);
}
@@ -4555,7 +4563,8 @@ void QGLWidget::glDraw()
Q_D(QGLWidget);
if (!isValid())
return;
- makeCurrent();
+ if (!d->makeCurrent())
+ return;
#ifndef QT_OPENGL_ES
if (d->glcx->deviceIsPixmap() && !d->glcx->contextHandle()->isOpenGLES())
qgl1_functions()->glDrawBuffer(GL_FRONT);
diff --git a/src/opengl/qgl_p.h b/src/opengl/qgl_p.h
index 6b4d83888fe..ed364283ccd 100644
--- a/src/opengl/qgl_p.h
+++ b/src/opengl/qgl_p.h
@@ -145,6 +145,8 @@ public:
glcx->reset();
}
+ bool makeCurrent();
+
QGLContext *glcx;
QGLWidgetGLPaintDevice glDevice;
bool autoSwap;