summaryrefslogtreecommitdiffstats
path: root/src/datavisualization/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/datavisualization/engine')
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp38
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h5
-rw-r--r--src/datavisualization/engine/bars3drenderer.cpp16
-rw-r--r--src/datavisualization/engine/bars3drenderer_p.h1
-rw-r--r--src/datavisualization/engine/scatter3drenderer.cpp21
-rw-r--r--src/datavisualization/engine/scatter3drenderer_p.h1
-rw-r--r--src/datavisualization/engine/surface3drenderer.cpp25
-rw-r--r--src/datavisualization/engine/surface3drenderer_p.h1
8 files changed, 48 insertions, 60 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
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<QOpenGLContext> 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);