summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTor Arne Vestbø <tor.arne.vestbo@qt.io>2018-07-18 20:36:26 +0200
committerTor Arne Vestbø <tor.arne.vestbo@qt.io>2018-07-20 06:40:04 +0000
commitcc27a50ef8d7de08df48ea25e89e6f1fb9f0dc2e (patch)
tree920513f4b030b24a5354f349a03d7ce95b114aac /src
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 <simon.hausmann@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Diffstat (limited to 'src')
-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 4eb7a194d9..1132411d42 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 6b4d83888f..ed364283cc 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;