From e4cd15e388f675a80a9c257655a580b1b53c240a Mon Sep 17 00:00:00 2001 From: Tomi Korpipaa Date: Mon, 29 Apr 2019 12:50:14 +0300 Subject: Fix hanging at application exit Task-number: QTBUG-75256 Task-number: QTBUG-69627 Change-Id: If4221c8fcf783daf4bf6a38dbf1b9633a20eafb0 Reviewed-by: Miikka Heikkinen --- .../engine/abstract3drenderer.cpp | 38 +++++----------------- .../engine/abstract3drenderer_p.h | 5 +-- src/datavisualization/engine/bars3drenderer.cpp | 16 +++++---- src/datavisualization/engine/bars3drenderer_p.h | 1 + src/datavisualization/engine/scatter3drenderer.cpp | 21 +++++++----- src/datavisualization/engine/scatter3drenderer_p.h | 1 + src/datavisualization/engine/surface3drenderer.cpp | 25 +++++++------- src/datavisualization/engine/surface3drenderer_p.h | 1 + 8 files changed, 48 insertions(+), 60 deletions(-) (limited to 'src') 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 diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h index c312b771..d6ffb03c 100644 --- a/src/datavisualization/engine/abstract3drenderer_p.h +++ b/src/datavisualization/engine/abstract3drenderer_p.h @@ -191,6 +191,7 @@ Q_SIGNALS: protected: Abstract3DRenderer(Abstract3DController *controller); + virtual void contextCleanup(); virtual void initializeOpenGL(); void reInitShaders(); @@ -242,9 +243,6 @@ protected: void queriedGraphPosition(const QMatrix4x4 &projectionViewMatrix, const QVector3D &scaling, GLuint defaultFboHandle); - void fixContextBeforeDelete(); - void restoreContextAfterDelete(); - bool m_hasNegativeValues; Q3DTheme *m_cachedTheme; Drawer *m_drawer; @@ -339,7 +337,6 @@ protected: QOpenGLFunctions_2_1 *m_funcs_2_1; // Not owned #endif QPointer m_context; // Not owned - QOffscreenSurface *m_dummySurfaceAtDelete; bool m_isOpenGLES; private: diff --git a/src/datavisualization/engine/bars3drenderer.cpp b/src/datavisualization/engine/bars3drenderer.cpp index e8f96c87..c57339db 100644 --- a/src/datavisualization/engine/bars3drenderer.cpp +++ b/src/datavisualization/engine/bars3drenderer.cpp @@ -100,8 +100,16 @@ Bars3DRenderer::Bars3DRenderer(Bars3DController *controller) Bars3DRenderer::~Bars3DRenderer() { - fixContextBeforeDelete(); + contextCleanup(); + delete m_barShader; + delete m_barGradientShader; + delete m_depthShader; + delete m_selectionShader; + delete m_backgroundShader; +} +void Bars3DRenderer::contextCleanup() +{ if (QOpenGLContext::currentContext()) { m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); @@ -109,12 +117,6 @@ Bars3DRenderer::~Bars3DRenderer() m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); m_textureHelper->deleteTexture(&m_bgrTexture); } - - delete m_barShader; - delete m_barGradientShader; - delete m_depthShader; - delete m_selectionShader; - delete m_backgroundShader; } void Bars3DRenderer::initializeOpenGL() diff --git a/src/datavisualization/engine/bars3drenderer_p.h b/src/datavisualization/engine/bars3drenderer_p.h index f48731fd..0dad7dc3 100644 --- a/src/datavisualization/engine/bars3drenderer_p.h +++ b/src/datavisualization/engine/bars3drenderer_p.h @@ -134,6 +134,7 @@ public: void updateMargin(float margin); protected: + void contextCleanup(); virtual void initializeOpenGL(); virtual void fixCameraTarget(QVector3D &target); virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds); diff --git a/src/datavisualization/engine/scatter3drenderer.cpp b/src/datavisualization/engine/scatter3drenderer.cpp index 8df8f4ea..fbf2b2cf 100644 --- a/src/datavisualization/engine/scatter3drenderer.cpp +++ b/src/datavisualization/engine/scatter3drenderer.cpp @@ -87,15 +87,7 @@ Scatter3DRenderer::Scatter3DRenderer(Scatter3DController *controller) Scatter3DRenderer::~Scatter3DRenderer() { - fixContextBeforeDelete(); - - if (QOpenGLContext::currentContext()) { - m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); - m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); - m_textureHelper->deleteTexture(&m_selectionTexture); - m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); - m_textureHelper->deleteTexture(&m_bgrTexture); - } + contextCleanup(); delete m_dotShader; delete m_staticSelectedItemGradientShader; delete m_staticSelectedItemShader; @@ -106,6 +98,17 @@ Scatter3DRenderer::~Scatter3DRenderer() delete m_staticGradientPointShader; } +void Scatter3DRenderer::contextCleanup() +{ + if (QOpenGLContext::currentContext()) { + m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); + m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); + m_textureHelper->deleteTexture(&m_selectionTexture); + m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); + m_textureHelper->deleteTexture(&m_bgrTexture); + } +} + void Scatter3DRenderer::initializeOpenGL() { Abstract3DRenderer::initializeOpenGL(); diff --git a/src/datavisualization/engine/scatter3drenderer_p.h b/src/datavisualization/engine/scatter3drenderer_p.h index 52a9b427..b54571db 100644 --- a/src/datavisualization/engine/scatter3drenderer_p.h +++ b/src/datavisualization/engine/scatter3drenderer_p.h @@ -120,6 +120,7 @@ public Q_SLOTS: void updateSelectedItem(int index, QScatter3DSeries *series); protected: + void contextCleanup(); virtual void initializeOpenGL(); virtual void fixCameraTarget(QVector3D &target); virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds); diff --git a/src/datavisualization/engine/surface3drenderer.cpp b/src/datavisualization/engine/surface3drenderer.cpp index b6125719..be7ccf66 100644 --- a/src/datavisualization/engine/surface3drenderer.cpp +++ b/src/datavisualization/engine/surface3drenderer.cpp @@ -95,17 +95,7 @@ Surface3DRenderer::Surface3DRenderer(Surface3DController *controller) Surface3DRenderer::~Surface3DRenderer() { - fixContextBeforeDelete(); - - if (QOpenGLContext::currentContext()) { - m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); - m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); - m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); - - m_textureHelper->deleteTexture(&m_noShadowTexture); - m_textureHelper->deleteTexture(&m_depthTexture); - m_textureHelper->deleteTexture(&m_selectionResultTexture); - } + contextCleanup(); delete m_depthShader; delete m_backgroundShader; delete m_selectionShader; @@ -118,6 +108,19 @@ Surface3DRenderer::~Surface3DRenderer() delete m_surfaceSliceSmoothShader; } +void Surface3DRenderer::contextCleanup() +{ + if (QOpenGLContext::currentContext()) { + m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); + m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); + m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); + + m_textureHelper->deleteTexture(&m_noShadowTexture); + m_textureHelper->deleteTexture(&m_depthTexture); + m_textureHelper->deleteTexture(&m_selectionResultTexture); + } +} + void Surface3DRenderer::initializeOpenGL() { Abstract3DRenderer::initializeOpenGL(); diff --git a/src/datavisualization/engine/surface3drenderer_p.h b/src/datavisualization/engine/surface3drenderer_p.h index 5a5398aa..5cda332f 100644 --- a/src/datavisualization/engine/surface3drenderer_p.h +++ b/src/datavisualization/engine/surface3drenderer_p.h @@ -116,6 +116,7 @@ public: void render(GLuint defaultFboHandle = 0); protected: + void contextCleanup(); void initializeOpenGL(); virtual void fixCameraTarget(QVector3D &target); virtual void getVisibleItemBounds(QVector3D &minBounds, QVector3D &maxBounds); -- cgit v1.2.3