summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/datavisualization/engine/abstract3drenderer.cpp22
-rw-r--r--src/datavisualization/engine/abstract3drenderer_p.h2
-rw-r--r--src/datavisualization/engine/axisrendercache.cpp10
-rw-r--r--src/datavisualization/engine/axisrendercache_p.h1
-rw-r--r--tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml10
5 files changed, 26 insertions, 19 deletions
diff --git a/src/datavisualization/engine/abstract3drenderer.cpp b/src/datavisualization/engine/abstract3drenderer.cpp
index d7bad300..e4141f4c 100644
--- a/src/datavisualization/engine/abstract3drenderer.cpp
+++ b/src/datavisualization/engine/abstract3drenderer.cpp
@@ -105,8 +105,6 @@ Abstract3DRenderer::Abstract3DRenderer(Abstract3DController *controller)
m_reflectionEnabled(false),
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);
@@ -158,6 +156,10 @@ Abstract3DRenderer::~Abstract3DRenderer()
delete m_textureHelper;
}
+ m_axisCacheX.clearLabels();
+ m_axisCacheY.clearLabels();
+ m_axisCacheZ.clearLabels();
+
restoreContextAfterDelete();
}
@@ -1784,10 +1786,9 @@ void Abstract3DRenderer::queriedGraphPosition(const QMatrix4x4 &projectionViewMa
void Abstract3DRenderer::fixContextBeforeDelete()
{
- m_currentContextAtDelete = QOpenGLContext::currentContext();
- if (m_currentContextAtDelete)
- m_currentSurfaceAtDelete = m_currentContextAtDelete->surface();
- if (!m_context.isNull() && m_context.data() != m_currentContextAtDelete
+ // 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 QWindow();
m_dummySurfaceAtDelete->setSurfaceType(QWindow::OpenGLSurface);
@@ -1800,15 +1801,10 @@ void Abstract3DRenderer::fixContextBeforeDelete()
void Abstract3DRenderer::restoreContextAfterDelete()
{
- if (m_currentContextAtDelete && m_currentSurfaceAtDelete
- && m_context.data() != m_currentContextAtDelete) {
- m_currentContextAtDelete->makeCurrent(m_currentSurfaceAtDelete);
- } else if (m_dummySurfaceAtDelete) {
+ if (m_dummySurfaceAtDelete)
m_context->doneCurrent();
- }
+
delete m_dummySurfaceAtDelete;
- m_currentContextAtDelete = 0;
- m_currentSurfaceAtDelete = 0;
m_dummySurfaceAtDelete = 0;
}
diff --git a/src/datavisualization/engine/abstract3drenderer_p.h b/src/datavisualization/engine/abstract3drenderer_p.h
index 1857278c..38665c65 100644
--- a/src/datavisualization/engine/abstract3drenderer_p.h
+++ b/src/datavisualization/engine/abstract3drenderer_p.h
@@ -324,8 +324,6 @@ protected:
QLocale m_locale;
QPointer<QOpenGLContext> m_context; // Not owned
- QOpenGLContext *m_currentContextAtDelete; // Not owned
- QSurface *m_currentSurfaceAtDelete; // Not owned
QWindow *m_dummySurfaceAtDelete;
private:
diff --git a/src/datavisualization/engine/axisrendercache.cpp b/src/datavisualization/engine/axisrendercache.cpp
index 2448483e..f467cc76 100644
--- a/src/datavisualization/engine/axisrendercache.cpp
+++ b/src/datavisualization/engine/axisrendercache.cpp
@@ -44,8 +44,7 @@ AxisRenderCache::AxisRenderCache()
AxisRenderCache::~AxisRenderCache()
{
- foreach (LabelItem *label, m_labelItems)
- delete label;
+ clearLabels();
delete m_formatter;
}
@@ -175,6 +174,13 @@ void AxisRenderCache::updateTextures()
}
}
+void AxisRenderCache::clearLabels()
+{
+ m_titleItem.clear();
+ for (int i = 0; i < m_labels.size(); i++)
+ m_labelItems[i]->clear();
+}
+
int AxisRenderCache::maxLabelWidth(const QStringList &labels) const
{
int labelWidth = 0;
diff --git a/src/datavisualization/engine/axisrendercache_p.h b/src/datavisualization/engine/axisrendercache_p.h
index 9fb04837..e32c590e 100644
--- a/src/datavisualization/engine/axisrendercache_p.h
+++ b/src/datavisualization/engine/axisrendercache_p.h
@@ -108,6 +108,7 @@ public:
inline void setTitleFixed(bool fixed) { m_titleFixed = fixed; }
void updateTextures();
+ void clearLabels();
private:
int maxLabelWidth(const QStringList &labels) const;
diff --git a/tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml b/tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml
index 57d62019..da382e3d 100644
--- a/tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml
+++ b/tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml
@@ -91,6 +91,13 @@ Rectangle {
}
}
+ function destroyWindow() {
+ if (surfaceWindowObject != null)
+ surfaceWindowObject.destroy()
+ }
+
+ Component.onDestruction: destroyWindow()
+
//! [0]
GridLayout {
id: gridLayout
@@ -114,8 +121,7 @@ Rectangle {
running: false
repeat: false
onTriggered: {
- if (surfaceWindowObject != null)
- surfaceWindowObject.destroy()
+ destroyWindow()
surfaceWindowObject = Qt.createQmlObject(surfaceWindowStr, mainView)
}
}