diff options
author | Antti Määttä <antti.maatta@qt.io> | 2016-04-28 09:06:05 +0300 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2016-05-26 07:25:53 +0000 |
commit | 36de2a78d2bea11ccca0810925495a6ce49affe2 (patch) | |
tree | 8c2463774f431cdc82177e94d7202316dd087c70 | |
parent | c451441e9142a54978f9177e503a946b86c6306e (diff) |
Fix memory leaks in render node managers
Delete objects in node managers.
Task-number: QTBUG-47978
Task-number: QTBUG-51035
Change-Id: I55167dfa8c7b76ed6405bcb2b3bc775ca0152a5b
Reviewed-by: Tomi Korpipää <tomi.korpipaa@theqtcompany.com>
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/core/resources/qhandlemanager_p.h | 10 | ||||
-rw-r--r-- | src/render/backend/managers.cpp | 5 | ||||
-rw-r--r-- | src/render/backend/managers_p.h | 9 | ||||
-rw-r--r-- | src/render/backend/nodemanagers.cpp | 35 | ||||
-rw-r--r-- | src/render/backend/nodemanagers_p.h | 1 | ||||
-rw-r--r-- | tests/auto/render/framegraphnode/tst_framegraphnode.cpp | 2 |
6 files changed, 62 insertions, 0 deletions
diff --git a/src/core/resources/qhandlemanager_p.h b/src/core/resources/qhandlemanager_p.h index 61e87ba1e..53439e13c 100644 --- a/src/core/resources/qhandlemanager_p.h +++ b/src/core/resources/qhandlemanager_p.h @@ -89,6 +89,7 @@ public: void update(const QHandle<T, INDEXBITS> &, T *d); T *data(const QHandle<T, INDEXBITS> &handle, bool *ok = 0); const T *constData(const QHandle<T, INDEXBITS> &handle, bool *ok = 0) const; + QVector<T *> entries() const; private: Q_DISABLE_COPY(QHandleManager) @@ -243,6 +244,15 @@ QDebug operator<<(QDebug dbg, const QHandleManager<T, INDEXBITS> &manager) } #endif +template <typename T, uint INDEXBITS> +QVector<T *> QHandleManager<T, INDEXBITS>::entries() const +{ + QVector<T *> entries; + for (auto handle : qAsConst(m_entries)) + entries.append(handle.m_data); + return entries; +} + } // Qt3D QT_END_NAMESPACE diff --git a/src/render/backend/managers.cpp b/src/render/backend/managers.cpp index 7754c8682..844a44286 100644 --- a/src/render/backend/managers.cpp +++ b/src/render/backend/managers.cpp @@ -46,6 +46,11 @@ QT_BEGIN_NAMESPACE namespace Qt3DRender { namespace Render { +FrameGraphManager::~FrameGraphManager() +{ + qDeleteAll(m_nodes); +} + bool FrameGraphManager::containsNode(Qt3DCore::QNodeId id) const { return m_nodes.contains(id); diff --git a/src/render/backend/managers_p.h b/src/render/backend/managers_p.h index 386a552c6..f2c26fd00 100644 --- a/src/render/backend/managers_p.h +++ b/src/render/backend/managers_p.h @@ -136,6 +136,14 @@ class Q_AUTOTEST_EXPORT EntityManager : public Qt3DCore::QResourceManager< { public: EntityManager() {} + ~EntityManager() + { + const auto entries = m_handleManager.entries(); + for (Entity *e : entries) { + if (e) + e->setNodeManagers(nullptr); + } + } }; class FrameGraphNode; @@ -144,6 +152,7 @@ class Q_AUTOTEST_EXPORT FrameGraphManager { public: FrameGraphManager() {} + ~FrameGraphManager(); bool containsNode(Qt3DCore::QNodeId id) const; void appendNode(Qt3DCore::QNodeId id, FrameGraphNode *node); diff --git a/src/render/backend/nodemanagers.cpp b/src/render/backend/nodemanagers.cpp index c7a67a699..66e526d41 100644 --- a/src/render/backend/nodemanagers.cpp +++ b/src/render/backend/nodemanagers.cpp @@ -88,6 +88,41 @@ NodeManagers::NodeManagers() { } +NodeManagers::~NodeManagers() +{ + delete m_cameraManager; + delete m_materialManager; + delete m_worldMatrixManager; + delete m_vaoManager; + delete m_shaderManager; + delete m_techniqueManager; + delete m_effectManager; + delete m_renderPassManager; + delete m_textureManager; + delete m_textureDataManager; + delete m_layerManager; + delete m_filterKeyManager; + delete m_frameGraphManager; + delete m_transformManager; + delete m_renderTargetManager; + delete m_sceneManager; + delete m_attachmentManager; + delete m_parameterManager; + delete m_shaderDataManager; + delete m_glBufferManager; + delete m_textureImageManager; + delete m_bufferManager; + delete m_attributeManager; + delete m_geometryManager; + delete m_geometryRendererManager; + delete m_objectPickerManager; +// delete m_boundingVolumeDebugManager; + delete m_lightManager; + delete m_computeJobManager; + delete m_renderStateManager; + delete m_renderNodesManager; +} + template<> CameraManager *NodeManagers::manager<CameraLens>() const Q_DECL_NOTHROW { diff --git a/src/render/backend/nodemanagers_p.h b/src/render/backend/nodemanagers_p.h index e4e80ede3..0675df5d9 100644 --- a/src/render/backend/nodemanagers_p.h +++ b/src/render/backend/nodemanagers_p.h @@ -131,6 +131,7 @@ class QT3DRENDERSHARED_PRIVATE_EXPORT NodeManagers { public: NodeManagers(); + ~NodeManagers(); template<class Backend, typename Manager> Manager *manager() const Q_DECL_NOEXCEPT diff --git a/tests/auto/render/framegraphnode/tst_framegraphnode.cpp b/tests/auto/render/framegraphnode/tst_framegraphnode.cpp index d3a1a2e98..f3f3dbff1 100644 --- a/tests/auto/render/framegraphnode/tst_framegraphnode.cpp +++ b/tests/auto/render/framegraphnode/tst_framegraphnode.cpp @@ -113,6 +113,8 @@ private Q_SLOTS: n->appendChildId(childId); // THEN QCOMPARE(n->childrenIds().count(), 1); + + c.take(); } void checkParentChange() |