summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-03-13 18:47:59 +0000
committerSean Harmer <sean.harmer@kdab.com>2016-03-22 10:45:28 +0000
commitb9e4053715ee12137a13bfbeef99f0a7c5635913 (patch)
tree0b97b474c9c7c28df664849c75f829947011ec5c
parent525b7bcf045c22117fb2eed49c48fdbfb445d26d (diff)
Hook up some machinery ready for testing the no cloning approach
Task-number: QTBUG-51835 Change-Id: I4520bf38acc9b8a990d3f3bce3d96f2014c5637b Reviewed-by: Giuseppe D'Angelo <giuseppe.dangelo@kdab.com>
-rw-r--r--src/core/aspects/qabstractaspect.cpp51
-rw-r--r--src/core/aspects/qabstractaspect_p.h5
-rw-r--r--src/core/aspects/qaspectengine.cpp6
-rw-r--r--src/core/aspects/qaspectmanager.cpp4
-rw-r--r--src/core/aspects/qaspectmanager_p.h3
-rw-r--r--src/core/nodes/qbackendnode.cpp7
-rw-r--r--src/core/nodes/qbackendnode.h12
-rw-r--r--src/core/qbackendnodefactory_p.h3
-rw-r--r--tests/benchmarks/render/jobs/tst_bench_jobs.cpp15
9 files changed, 93 insertions, 13 deletions
diff --git a/src/core/aspects/qabstractaspect.cpp b/src/core/aspects/qabstractaspect.cpp
index 20a393738..19ec5a1dd 100644
--- a/src/core/aspects/qabstractaspect.cpp
+++ b/src/core/aspects/qabstractaspect.cpp
@@ -181,6 +181,44 @@ QBackendNode *QAbstractAspectPrivate::createBackendNode(QNode *frontend) const
return Q_NULLPTR;
}
+QBackendNode *QAbstractAspectPrivate::createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const
+{
+ const QMetaObject *metaObj = change->metaObject();
+ QBackendNodeMapperPtr backendNodeMapper;
+ while (metaObj != Q_NULLPTR && backendNodeMapper.isNull()) {
+ backendNodeMapper = m_backendCreatorFunctors.value(metaObj);
+ metaObj = metaObj->superClass();
+ }
+
+ if (!backendNodeMapper)
+ return nullptr;
+
+ QBackendNode *backend = backendNodeMapper->get(change->subjectId());
+ if (backend != Q_NULLPTR)
+ return backend;
+ backend = backendNodeMapper->create(change);
+
+ // TODO: Find some place else to do all of this function from the arbiter
+ if (backend)
+ backend->initializeFromPeer(change);
+
+ // Backend could be null if the user decides that his functor should only
+ // perform some action when encountering a given type of item but doesn't need to
+ // return a QBackendNode pointer.
+ if (!backend)
+ return nullptr;
+
+ QBackendNodePrivate *backendPriv = QBackendNodePrivate::get(backend);
+ // TO DO: Find a way to specify the changes to observe
+ // Register backendNode with QChangeArbiter
+ if (m_arbiter != Q_NULLPTR) { // Unit tests may not have the arbiter registered
+ m_arbiter->registerObserver(backendPriv, backend->peerId(), AllChanges);
+ if (backend->mode() == QBackendNode::ReadWrite)
+ m_arbiter->scene()->addObservable(backendPriv, backend->peerId());
+ }
+ return backend;
+}
+
void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const
{
const QMetaObject *metaObj = frontend->metaObject();
@@ -202,7 +240,7 @@ void QAbstractAspectPrivate::clearBackendNode(QNode *frontend) const
}
}
-void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject)
+void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject, const QVector<QNodeCreatedChangeBasePtr> &changes)
{
qCDebug(Aspects) << Q_FUNC_INFO << "rootObject =" << rootObject;
if (rootObject == m_root)
@@ -211,8 +249,15 @@ void QAbstractAspectPrivate::setRootAndCreateNodes(QEntity *rootObject)
m_root = rootObject;
m_rootId = rootObject->id();
- QNodeVisitor visitor;
- visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode);
+ // Use old method for now, unless user explicitly requests new method
+ const auto useNewMethod = qEnvironmentVariableIsSet("QT3D_NO_CLONE");
+ if (!useNewMethod) {
+ QNodeVisitor visitor;
+ visitor.traverse(rootObject, this, &QAbstractAspectPrivate::createBackendNode);
+ } else {
+ for (const auto &change : changes)
+ createBackendNodeNoClone(change);
+ }
}
QServiceLocator *QAbstractAspectPrivate::services() const
diff --git a/src/core/aspects/qabstractaspect_p.h b/src/core/aspects/qabstractaspect_p.h
index 5536f1e1d..28e1cac2f 100644
--- a/src/core/aspects/qabstractaspect_p.h
+++ b/src/core/aspects/qabstractaspect_p.h
@@ -80,7 +80,7 @@ class QT3DCORE_PRIVATE_EXPORT QAbstractAspectPrivate
public:
QAbstractAspectPrivate();
- void setRootAndCreateNodes(QEntity *rootObject);
+ void setRootAndCreateNodes(QEntity *rootObject, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes);
QServiceLocator *services() const;
QAbstractAspectJobManager *jobManager() const;
@@ -88,6 +88,9 @@ public:
QVector<QAspectJobPtr> jobsToExecute(qint64 time) Q_DECL_OVERRIDE;
QBackendNode *createBackendNode(QNode *frontend) const Q_DECL_OVERRIDE;
+ // TODO: Rename this to createBackendNode when new system is fully in place
+ QBackendNode *createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const Q_DECL_OVERRIDE;
+
void clearBackendNode(QNode *frontend) const;
void sceneNodeAdded(Qt3DCore::QSceneChangePtr &e) Q_DECL_OVERRIDE;
diff --git a/src/core/aspects/qaspectengine.cpp b/src/core/aspects/qaspectengine.cpp
index af6798407..b76aae603 100644
--- a/src/core/aspects/qaspectengine.cpp
+++ b/src/core/aspects/qaspectengine.cpp
@@ -331,11 +331,15 @@ void QAspectEngine::setRootEntity(QEntityPtr root)
// Finally, tell the aspects about the new scene object tree. This is done
// in a blocking manner to allow the aspects to get synchronized before the
// main thread starts triggering potentially more notifications
+
+ // TODO: Pass the creation changes via the arbiter rather than relying upon
+ // an invokeMethod call.
qCDebug(Aspects) << "Begin setting scene root on aspect manager";
QMetaObject::invokeMethod(d->m_aspectThread->aspectManager(),
"setRootEntity",
Qt::BlockingQueuedConnection,
- Q_ARG(Qt3DCore::QEntity *, root.data()));
+ Q_ARG(Qt3DCore::QEntity *, root.data()),
+ Q_ARG(QVector<Qt3DCore::QNodeCreatedChangeBasePtr>, d->m_creationChanges));
qCDebug(Aspects) << "Done setting scene root on aspect manager";
d->m_aspectThread->aspectManager()->enterSimulationLoop();
diff --git a/src/core/aspects/qaspectmanager.cpp b/src/core/aspects/qaspectmanager.cpp
index 6155fa995..74b33f866 100644
--- a/src/core/aspects/qaspectmanager.cpp
+++ b/src/core/aspects/qaspectmanager.cpp
@@ -148,7 +148,7 @@ void QAspectManager::shutdown()
// Aspects must be deleted in the Thread they were created in
}
-void QAspectManager::setRootEntity(Qt3DCore::QEntity *root)
+void QAspectManager::setRootEntity(Qt3DCore::QEntity *root, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes)
{
qCDebug(Aspects) << Q_FUNC_INFO;
@@ -164,7 +164,7 @@ void QAspectManager::setRootEntity(Qt3DCore::QEntity *root)
if (m_root) {
for (QAbstractAspect *aspect : qAsConst(m_aspects))
- aspect->d_func()->setRootAndCreateNodes(m_root);
+ aspect->d_func()->setRootAndCreateNodes(m_root, changes);
}
}
diff --git a/src/core/aspects/qaspectmanager_p.h b/src/core/aspects/qaspectmanager_p.h
index 643da2311..99d29320e 100644
--- a/src/core/aspects/qaspectmanager_p.h
+++ b/src/core/aspects/qaspectmanager_p.h
@@ -52,6 +52,7 @@
//
#include <QObject>
+#include <Qt3DCore/qnodecreatedchange.h>
#include <Qt3DCore/private/qt3dcore_global_p.h>
#include <QList>
#include <QScopedPointer>
@@ -89,7 +90,7 @@ public Q_SLOTS:
void initialize();
void shutdown();
- void setRootEntity(Qt3DCore::QEntity *root);
+ void setRootEntity(Qt3DCore::QEntity *root, const QVector<Qt3DCore::QNodeCreatedChangeBasePtr> &changes);
void registerAspect(Qt3DCore::QAbstractAspect *aspect);
void exec();
diff --git a/src/core/nodes/qbackendnode.cpp b/src/core/nodes/qbackendnode.cpp
index 8dfc646ce..430d12cff 100644
--- a/src/core/nodes/qbackendnode.cpp
+++ b/src/core/nodes/qbackendnode.cpp
@@ -125,6 +125,13 @@ void QBackendNode::notifyObservers(const QSceneChangePtr &e)
d->notifyObservers(e);
}
+void QBackendNode::initializeFromPeer(const QNodeCreatedChangeBasePtr &change)
+{
+ // TODO: Put a warning/assert in here?
+ // Uncomment to see any backend nodes that do not implement this function yet
+ //qDebug() << Q_FUNC_INFO << change->metaObject()->className();
+}
+
} // Qt3D
QT_END_NAMESPACE
diff --git a/src/core/nodes/qbackendnode.h b/src/core/nodes/qbackendnode.h
index e8001e85d..5055e7986 100644
--- a/src/core/nodes/qbackendnode.h
+++ b/src/core/nodes/qbackendnode.h
@@ -42,6 +42,7 @@
#include <Qt3DCore/qt3dcore_global.h>
#include <Qt3DCore/qscenechange.h>
+#include <Qt3DCore/qnodecreatedchange.h>
#include <Qt3DCore/qnodeid.h>
QT_BEGIN_NAMESPACE
@@ -57,6 +58,13 @@ class QT3DCORESHARED_EXPORT QBackendNodeMapper
public:
virtual ~QBackendNodeMapper() {}
virtual QBackendNode *create(QNode *frontend) const = 0;
+ // TODO: Make this pure virtual and remove QNode* overload
+ virtual QBackendNode *create(const QNodeCreatedChangeBasePtr &change) const
+ {
+ Q_UNUSED(change);
+ //qDebug() << "Functor with unimplemented create() function";
+ return nullptr;
+ }
virtual QBackendNode *get(QNodeId id) const = 0;
virtual void destroy(QNodeId id) const = 0;
};
@@ -80,6 +88,10 @@ public:
Mode mode() const Q_DECL_NOEXCEPT;
virtual void updateFromPeer(QNode *peer) = 0;
+ // TODO: Make pure virtual
+ // TODO: Make protected/private
+ virtual void initializeFromPeer(const QNodeCreatedChangeBasePtr &change);
+
protected:
void notifyObservers(const QSceneChangePtr &e);
virtual void sceneChangeEvent(const QSceneChangePtr &e) = 0;
diff --git a/src/core/qbackendnodefactory_p.h b/src/core/qbackendnodefactory_p.h
index 7cde150e5..732a2bacd 100644
--- a/src/core/qbackendnodefactory_p.h
+++ b/src/core/qbackendnodefactory_p.h
@@ -52,6 +52,7 @@
//
#include <Qt3DCore/private/qt3dcore_global_p.h>
+#include <Qt3DCore/qnodecreatedchange.h>
QT_BEGIN_NAMESPACE
@@ -65,6 +66,8 @@ class QT3DCORE_PRIVATE_EXPORT QBackendNodeFactory
public:
virtual ~QBackendNodeFactory();
virtual QBackendNode *createBackendNode(QNode *frontend) const = 0;
+ // TODO: Rename this to createBackendNode when new system is fully in place
+ virtual QBackendNode *createBackendNodeNoClone(const QNodeCreatedChangeBasePtr &change) const = 0;
};
} // namespace Qt3DCore
diff --git a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
index 608c9ff16..362a363a7 100644
--- a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
+++ b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
@@ -233,7 +233,8 @@ private Q_SLOTS:
QFETCH(Qt3DCore::QEntity*, rootEntity);
TestAspect aspect;
- Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity));
+ Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity),
+ QVector<Qt3DCore::QNodeCreatedChangeBasePtr>());
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = aspect.worldTransformJob();
@@ -256,7 +257,8 @@ private Q_SLOTS:
QFETCH(Qt3DCore::QEntity*, rootEntity);
TestAspect aspect;
- Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity));
+ Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity),
+ QVector<Qt3DCore::QNodeCreatedChangeBasePtr>());
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = aspect.updateBoundingJob();
@@ -279,7 +281,8 @@ private Q_SLOTS:
QFETCH(Qt3DCore::QEntity*, rootEntity);
TestAspect aspect;
- Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity));
+ Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity),
+ QVector<Qt3DCore::QNodeCreatedChangeBasePtr>());
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = aspect.calculateBoundingVolumeJob();
@@ -302,7 +305,8 @@ private Q_SLOTS:
QFETCH(Qt3DCore::QEntity*, rootEntity);
TestAspect aspect;
- Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity));
+ Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity),
+ QVector<Qt3DCore::QNodeCreatedChangeBasePtr>());
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = aspect.framePreparationJob();
@@ -325,7 +329,8 @@ private Q_SLOTS:
QFETCH(Qt3DCore::QEntity*, rootEntity);
TestAspect aspect;
- Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity));
+ Qt3DCore::QAbstractAspectPrivate::get(&aspect)->setRootAndCreateNodes(qobject_cast<Qt3DCore::QEntity *>(rootEntity),
+ QVector<Qt3DCore::QNodeCreatedChangeBasePtr>());
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = aspect.frameCleanupJob();