summaryrefslogtreecommitdiffstats
path: root/src/gui/opengl
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@qt.io>2018-11-05 09:58:24 +0100
committerLiang Qi <liang.qi@qt.io>2018-11-05 09:59:59 +0100
commitb36c5bdc30040b5100da2a003056d3519972e178 (patch)
tree952e951bef0add6ee0ff0046c018d663568f9953 /src/gui/opengl
parent47869340b97686a4bf852f94edc3bae1e50d7053 (diff)
parentc9d18d4a9c9d1243a267316e2a702f9ba69de2fd (diff)
Merge remote-tracking branch 'origin/5.11' into 5.12.0
Conflicts: src/plugins/platforms/cocoa/qcocoaglcontext.mm src/plugins/platforms/xcb/qxcbscreen.h Change-Id: If9b4c67288396ff7346088ce591c7a3588b51979
Diffstat (limited to 'src/gui/opengl')
-rw-r--r--src/gui/opengl/qopenglvertexarrayobject.cpp33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/gui/opengl/qopenglvertexarrayobject.cpp b/src/gui/opengl/qopenglvertexarrayobject.cpp
index 0262538250..f0837aff96 100644
--- a/src/gui/opengl/qopenglvertexarrayobject.cpp
+++ b/src/gui/opengl/qopenglvertexarrayobject.cpp
@@ -40,8 +40,10 @@
#include "qopenglvertexarrayobject.h"
#include <QtCore/private/qobject_p.h>
+#include <QtCore/qthread.h>
#include <QtGui/qopenglcontext.h>
#include <QtGui/qoffscreensurface.h>
+#include <QtGui/qguiapplication.h>
#include <QtGui/qopenglfunctions_3_0.h>
#include <QtGui/qopenglfunctions_3_2_core.h>
@@ -204,18 +206,25 @@ void QOpenGLVertexArrayObjectPrivate::destroy()
if (context && context != ctx) {
oldContext = ctx;
oldContextSurface = ctx ? ctx->surface() : 0;
- // Cannot just make the current surface current again with another context.
- // The format may be incompatible and some platforms (iOS) may impose
- // restrictions on using a window with different contexts. Create an
- // offscreen surface (a pbuffer or a hidden window) instead to be safe.
- offscreenSurface.reset(new QOffscreenSurface);
- offscreenSurface->setFormat(context->format());
- offscreenSurface->create();
- if (context->makeCurrent(offscreenSurface.data())) {
- ctx = context;
- } else {
- qWarning("QOpenGLVertexArrayObject::destroy() failed to make VAO's context current");
+ // Before going through the effort of creating an offscreen surface
+ // check that we are on the GUI thread because otherwise many platforms
+ // will not able to create that offscreen surface.
+ if (QThread::currentThread() != qGuiApp->thread()) {
ctx = 0;
+ } else {
+ // Cannot just make the current surface current again with another context.
+ // The format may be incompatible and some platforms (iOS) may impose
+ // restrictions on using a window with different contexts. Create an
+ // offscreen surface (a pbuffer or a hidden window) instead to be safe.
+ offscreenSurface.reset(new QOffscreenSurface);
+ offscreenSurface->setFormat(context->format());
+ offscreenSurface->create();
+ if (context->makeCurrent(offscreenSurface.data())) {
+ ctx = context;
+ } else {
+ qWarning("QOpenGLVertexArrayObject::destroy() failed to make VAO's context current");
+ ctx = 0;
+ }
}
}
@@ -224,7 +233,7 @@ void QOpenGLVertexArrayObjectPrivate::destroy()
context = 0;
}
- if (vao) {
+ if (vao && ctx) {
switch (vaoFuncsType) {
#ifndef QT_OPENGL_ES_2
case Core_3_2: