From 91a9698b80bcb072a5ec3af69515249bac96aff5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Tue, 14 Oct 2014 14:35:03 +0300 Subject: Simplify context handling at cleanup. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If the context exists at renderer deletion, it is possible that it no longer has valid surface, which means it won't be possible to set it back to current if we change context for deletion cleanup. Since the current context will be one of our shared contexts anyway, there is no need to do a dummy context for cleanup unless the current context is null. Change-Id: Ibabe081742beb975ee848ccb3690703ef5b027a9 Reviewed-by: Mika Salmela Reviewed-by: Tomi Korpipää --- .../engine/abstract3drenderer.cpp | 22 +++++++++------------- .../engine/abstract3drenderer_p.h | 2 -- src/datavisualization/engine/axisrendercache.cpp | 10 ++++++++-- src/datavisualization/engine/axisrendercache_p.h | 1 + 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 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) } } -- cgit v1.2.3