From 732c9f39f08d7867c8e127c84d319ae514d682fd Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 13 Oct 2014 10:21:20 +0300 Subject: Fix context cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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ää --- .../engine/abstract3drenderer.cpp | 42 +++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) (limited to 'src/datavisualization/engine/abstract3drenderer.cpp') 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 +#include +#include 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 -- cgit v1.2.3