summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine/abstract3drenderer.cpp
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2014-10-13 10:21:20 +0300
committerMiikka Heikkinen <miikka.heikkinen@theqtcompany.com>2014-10-13 10:33:10 +0300
commit732c9f39f08d7867c8e127c84d319ae514d682fd (patch)
treeacb14a3dbe2cb98e154c28b6845b83c687abb752 /src/datavisualization/engine/abstract3drenderer.cpp
parent8ff6a5d6d89d80707dc07fc96e22160fa1f8e973 (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.cpp42
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