summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAntti Määttä <antti.maatta@qt.io>2016-04-28 09:06:05 +0300
committerSean Harmer <sean.harmer@kdab.com>2016-05-26 07:25:53 +0000
commit36de2a78d2bea11ccca0810925495a6ce49affe2 (patch)
tree8c2463774f431cdc82177e94d7202316dd087c70
parentc451441e9142a54978f9177e503a946b86c6306e (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.h10
-rw-r--r--src/render/backend/managers.cpp5
-rw-r--r--src/render/backend/managers_p.h9
-rw-r--r--src/render/backend/nodemanagers.cpp35
-rw-r--r--src/render/backend/nodemanagers_p.h1
-rw-r--r--tests/auto/render/framegraphnode/tst_framegraphnode.cpp2
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()