summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/abstract3drenderer.cpp
diff options
context:
space:
mode:
authorTomi Korpipaa <tomi.korpipaa@qt.io>2019-04-29 12:50:14 +0300
committerTomi Korpipää <tomi.korpipaa@qt.io>2019-04-29 12:58:36 +0000
commite4cd15e388f675a80a9c257655a580b1b53c240a (patch)
tree07840b4acf5790a88dfe56740e5a4cab9ec8bf03 /src/datavisualization/engine/abstract3drenderer.cpp
parentfd902c04b912deb81f41da0cd216d2cb1c86289b (diff)
Fix hanging at application exit
Task-number: QTBUG-75256 Task-number: QTBUG-69627 Change-Id: If4221c8fcf783daf4bf6a38dbf1b9633a20eafb0 Reviewed-by: Miikka Heikkinen <miikka.heikkinen@qt.io>
Diffstat (limited to 'src/datavisualization/engine/abstract3drenderer.cpp')
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp38
1 files changed, 9 insertions, 29 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index 417be0e8..3a6a524f 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -122,7 +122,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
m_funcs_2_1(0),
#endif
m_context(0),
- m_dummySurfaceAtDelete(0),
m_isOpenGLES(true)
{
@@ -153,6 +152,7 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
Abstract3DRenderer::~Abstract3DRenderer()
{
+ contextCleanup();
delete m_drawer;
delete m_cachedScene;
delete m_cachedTheme;
@@ -186,18 +186,18 @@ Abstract3DRenderer::~Abstract3DRenderer()
if (m_textureHelper) {
m_textureHelper->deleteTexture(&m_depthTexture);
m_textureHelper->deleteTexture(&m_cursorPositionTexture);
-
- if (QOpenGLContext::currentContext())
- m_textureHelper->glDeleteFramebuffers(1, &m_cursorPositionFrameBuffer);
-
delete m_textureHelper;
}
m_axisCacheX.clearLabels();
m_axisCacheY.clearLabels();
m_axisCacheZ.clearLabels();
+}
- restoreContextAfterDelete();
+void Abstract3DRenderer::contextCleanup()
+{
+ if (QOpenGLContext::currentContext())
+ m_textureHelper->glDeleteFramebuffers(1, &m_cursorPositionFrameBuffer);
}
void Abstract3DRenderer::initializeOpenGL()
@@ -233,6 +233,9 @@ void Abstract3DRenderer::initializeOpenGL()
loadLabelMesh();
loadPositionMapperMesh();
+
+ QObject::connect(m_context, &QOpenGLContext::aboutToBeDestroyed,
+ this, &Abstract3DRenderer::contextCleanup);
}
void Abstract3DRenderer::render(const GLuint defaultFboHandle)
@@ -1814,29 +1817,6 @@ void Abstract3DRenderer::queriedGraphPosition(const QMatrix4x4 &projectionViewMa
m_graphPositionQueryPending = false;
}
-void Abstract3DRenderer::fixContextBeforeDelete()
-{
- // Only need to fix context if the current context is null.
- // Otherwise we expect it to be our shared context, so we can use it for cleanup.
- if (!QOpenGLContext::currentContext() && !m_context.isNull()
- && QThread::currentThread() == this->thread()) {
- m_dummySurfaceAtDelete = new QOffscreenSurface();
- m_dummySurfaceAtDelete->setFormat(m_context->format());
- m_dummySurfaceAtDelete->create();
-
- m_context->makeCurrent(m_dummySurfaceAtDelete);
- }
-}
-
-void Abstract3DRenderer::restoreContextAfterDelete()
-{
- if (m_dummySurfaceAtDelete)
- m_context->doneCurrent();
-
- delete m_dummySurfaceAtDelete;
- m_dummySurfaceAtDelete = 0;
-}
-
void Abstract3DRenderer::calculatePolarXZ(const QVector3D &dataPos, float &x, float &z) const
{
// x is angular, z is radial