diff options
author | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2014-10-13 10:21:20 +0300 |
---|---|---|
committer | Miikka Heikkinen <miikka.heikkinen@theqtcompany.com> | 2014-10-13 10:33:10 +0300 |
commit | 732c9f39f08d7867c8e127c84d319ae514d682fd (patch) | |
tree | acb14a3dbe2cb98e154c28b6845b83c687abb752 /src/datavisualization/engine/abstract3drenderer.cpp | |
parent | 8ff6a5d6d89d80707dc07fc96e22160fa1f8e973 (diff) |
Fix context cleanup
Context was not getting properly cleaned up in cases where
render thread stopped before the cleanup took place.
Now we ensure that required cleanup is done before context
thread terminates.
Change-Id: I1489914dafec928eebb69bac737f6f858ff49432
Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>
Diffstat (limited to 'src/datavisualization/engine/abstract3drenderer.cpp')
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp index c47e2b29..d7bad300 100644 --- a/src/datavisualization/engine/abstract3drenderer.cpp +++ b/src/datavisualization/engine/abstract3drenderer.cpp @@ -28,6 +28,8 @@ #include "scatter3drenderer_p.h" #include <QtCore/qmath.h> +#include <QtGui/QWindow> +#include <QtCore/QThread> QT_BEGIN_NAMESPACE_DATAVISUALIZATION @@ -101,7 +103,11 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller) m_scaleZWithBackground(0.0f), m_oldCameraTarget(QVector3D(2000.0f, 2000.0f, 2000.0f)), // Just random invalid target m_reflectionEnabled(false), - m_reflectivity(0.5) + m_reflectivity(0.5), + m_context(0), + m_currentContextAtDelete(0), + m_currentSurfaceAtDelete(0), + m_dummySurfaceAtDelete(0) { QObject::connect(m_drawer, &Drawer::drawerChanged, this, &Abstract3DRenderer::updateTextures); QObject::connect(this, &Abstract3DRenderer::needRender, controller, @@ -151,10 +157,14 @@ Abstract3DRenderer::~Abstract3DRenderer() delete m_textureHelper; } + + restoreContextAfterDelete(); } void Abstract3DRenderer::initializeOpenGL() { + m_context = QOpenGLContext::currentContext(); + // Set OpenGL features glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); @@ -1772,6 +1782,36 @@ void Abstract3DRenderer::queriedGraphPosition(const QMatrix4x4 &projectionViewMa m_graphPositionQueryPending = false; } +void Abstract3DRenderer::fixContextBeforeDelete() +{ + m_currentContextAtDelete = QOpenGLContext::currentContext(); + if (m_currentContextAtDelete) + m_currentSurfaceAtDelete = m_currentContextAtDelete->surface(); + if (!m_context.isNull() && m_context.data() != m_currentContextAtDelete + && QThread::currentThread() == this->thread()) { + m_dummySurfaceAtDelete = new QWindow(); + m_dummySurfaceAtDelete->setSurfaceType(QWindow::OpenGLSurface); + m_dummySurfaceAtDelete->setFormat(m_context->format()); + m_dummySurfaceAtDelete->create(); + + m_context->makeCurrent(m_dummySurfaceAtDelete); + } +} + +void Abstract3DRenderer::restoreContextAfterDelete() +{ + if (m_currentContextAtDelete && m_currentSurfaceAtDelete + && m_context.data() != m_currentContextAtDelete) { + m_currentContextAtDelete->makeCurrent(m_currentSurfaceAtDelete); + } else if (m_dummySurfaceAtDelete) { + m_context->doneCurrent(); + } + delete m_dummySurfaceAtDelete; + m_currentContextAtDelete = 0; + m_currentSurfaceAtDelete = 0; + m_dummySurfaceAtDelete = 0; +} + void Abstract3DRenderer::calculatePolarXZ(const QVector3D &dataPos, float &x, float &z) const { // x is angular, z is radial |