diff options
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer.cpp | 22 | ||||
-rw-r--r-- | src/datavisualization/engine/abstract3drenderer_p.h | 2 | ||||
-rw-r--r-- | src/datavisualization/engine/axisrendercache.cpp | 10 | ||||
-rw-r--r-- | src/datavisualization/engine/axisrendercache_p.h | 1 | ||||
-rw-r--r-- | tests/qmlmultiwindow/qml/qmlmultiwindow/main.qml | 10 |
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) } } |