summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-15 03:02:52 +0200
committerQt Forward Merge Bot <qt_forward_merge_bot@qt-project.org>2019-06-15 03:02:52 +0200
commite0548a3d24bda6ddee02c38d3abee285ddf33a6d (patch)
tree06c9d30eab9d00657a8bee8510774433c5cb0c25
parent666a645d1edc98dfea92fdaf7eaeed10c86dbc56 (diff)
parent50d41e6f0e7dd97f3d4cbd68423d59cacd4b7700 (diff)
Merge remote-tracking branch 'origin/5.12' into 5.13
-rw-r--r--src/core/nodes/qcomponent.cpp5
-rw-r--r--src/core/nodes/qentity.cpp22
-rw-r--r--src/core/nodes/qentity_p.h1
-rw-r--r--src/core/nodes/qnode_p.h8
-rw-r--r--src/render/renderers/opengl/jobs/renderviewjobutils.cpp6
-rw-r--r--tests/auto/core/qentity/tst_qentity.cpp11
-rw-r--r--tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp321
7 files changed, 368 insertions, 6 deletions
diff --git a/src/core/nodes/qcomponent.cpp b/src/core/nodes/qcomponent.cpp
index 5ca49ff30..f67989b1e 100644
--- a/src/core/nodes/qcomponent.cpp
+++ b/src/core/nodes/qcomponent.cpp
@@ -134,10 +134,13 @@ QComponent::~QComponent()
{
Q_D(QComponent);
- for (QEntity *entity : qAsConst(d->m_entities)) {
+ // iterate on copy since removeEntity removes from the list, invalidating the iterator
+ const auto entities = std::move(d->m_entities);
+ for (QEntity *entity : entities) {
QEntityPrivate *entityPimpl = static_cast<QEntityPrivate *>(QEntityPrivate::get(entity));
if (entityPimpl)
entityPimpl->m_components.removeAll(this);
+ d->removeEntity(entity);
}
}
diff --git a/src/core/nodes/qentity.cpp b/src/core/nodes/qentity.cpp
index 164e0feff..1d16e828e 100644
--- a/src/core/nodes/qentity.cpp
+++ b/src/core/nodes/qentity.cpp
@@ -95,6 +95,26 @@ QEntityPrivate::~QEntityPrivate()
{
}
+/*! \internal */
+void QEntityPrivate::removeDestroyedComponent(QComponent *comp)
+{
+ // comp is actually no longer a QComponent, just a QObject
+
+ Q_CHECK_PTR(comp);
+ qCDebug(Nodes) << Q_FUNC_INFO << comp;
+ Q_Q(QEntity);
+
+ if (m_changeArbiter) {
+ const auto componentRemovedChange = QComponentRemovedChangePtr::create(q, comp);
+ notifyObservers(componentRemovedChange);
+ }
+
+ m_components.removeOne(comp);
+
+ // Remove bookkeeping connection
+ unregisterDestructionHelper(comp);
+}
+
/*!
Constructs a new Qt3DCore::QEntity instance with \a parent as parent.
*/
@@ -164,7 +184,7 @@ void QEntity::addComponent(QComponent *comp)
d->m_components.append(comp);
// Ensures proper bookkeeping
- d->registerDestructionHelper(comp, &QEntity::removeComponent, d->m_components);
+ d->registerPrivateDestructionHelper(comp, &QEntityPrivate::removeDestroyedComponent);
if (d->m_changeArbiter) {
const auto componentAddedChange = QComponentAddedChangePtr::create(this, comp);
diff --git a/src/core/nodes/qentity_p.h b/src/core/nodes/qentity_p.h
index ee6db75db..803754c87 100644
--- a/src/core/nodes/qentity_p.h
+++ b/src/core/nodes/qentity_p.h
@@ -82,6 +82,7 @@ public :
return typedComponents;
}
+ void removeDestroyedComponent(QComponent *comp);
QComponentVector m_components;
mutable QNodeId m_parentEntityId;
diff --git a/src/core/nodes/qnode_p.h b/src/core/nodes/qnode_p.h
index 506708762..511a0e562 100644
--- a/src/core/nodes/qnode_p.h
+++ b/src/core/nodes/qnode_p.h
@@ -145,6 +145,14 @@ public:
m_destructionConnections.insert(node, QObject::connect(node, &QNode::nodeDestroyed, f));
}
+ template<typename Caller, typename NodeType>
+ void registerPrivateDestructionHelper(NodeType *node, DestructionFunctionPointer<Caller, NodeType> func)
+ {
+ // If the node is destoyed, we make sure not to keep a dangling pointer to it
+ auto f = [this, func, node]() { (static_cast<Caller *>(this)->*func)(node); };
+ m_destructionConnections.insert(node, QObject::connect(node, &QNode::nodeDestroyed, f));
+ }
+
void unregisterDestructionHelper(QNode *node)
{
QObject::disconnect(m_destructionConnections.take(node));
diff --git a/src/render/renderers/opengl/jobs/renderviewjobutils.cpp b/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
index 9dd7faacc..13d850e71 100644
--- a/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
+++ b/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
@@ -419,14 +419,14 @@ void parametersFromMaterialEffectTechnique(ParameterInfoList *infoList,
// The parameters are taken in the following priority order:
//
// 1) Material
- // 2) Technique
- // 3) Effect
+ // 2) Effect
+ // 3) Technique
//
// That way a user can override defaults in Effect's and Techniques on a
// object manner and a Technique can override global defaults from the Effect.
parametersFromParametersProvider(infoList, manager, material);
- parametersFromParametersProvider(infoList, manager, technique);
parametersFromParametersProvider(infoList, manager, effect);
+ parametersFromParametersProvider(infoList, manager, technique);
}
void addToRenderStateSet(RenderStateSet *stateSet,
diff --git a/tests/auto/core/qentity/tst_qentity.cpp b/tests/auto/core/qentity/tst_qentity.cpp
index 04f695953..7770a2632 100644
--- a/tests/auto/core/qentity/tst_qentity.cpp
+++ b/tests/auto/core/qentity/tst_qentity.cpp
@@ -688,10 +688,19 @@ void tst_Entity::checkComponentBookkeeping()
QCOMPARE(rootEntity->components().size(), 1);
// WHEN
- rootEntity.reset();
+ int sigCount = 0;
+ QObject *sigSender = comp.data();
+ connect(comp.data(), &QComponent::removedFromEntity, [&sigCount, sigSender](QEntity *) {
+ QComponent *c = qobject_cast<QComponent *>(sigSender);
+ if (sigSender && c)
+ sigCount++; // test the sender is still a QComponent when signal is emitted
+ });
+
comp.reset();
+ rootEntity.reset();
// THEN (Should not crash when the comp is destroyed (tests for failed removal of destruction helper)
+ QCOMPARE(sigCount, 1);
}
}
diff --git a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp b/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp
index 20b0bf173..902a511d8 100644
--- a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp
+++ b/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp
@@ -459,6 +459,327 @@ private Q_SLOTS:
// THEN
QCOMPARE(gatherer->materialToPassAndParameter().size(), 0);
}
+
+ void checkParameterPriorityGathering()
+ {
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ techniqueFilterFG->addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::red))));
+
+ auto renderPassParameter = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::cyan)));
+
+ renderPassFG->addParameter(renderPassParameter);
+ material.addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::green))));
+ material.effect()->addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::blue))));
+
+ auto techniqueParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::white)));
+
+ material.gl3Technique()->addParameter(techniqueParam);
+ material.gl2Technique()->addParameter(techniqueParam);
+ material.es2Technique()->addParameter(techniqueParam);
+
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> RenderPassFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(renderPassParameter->id()));
+ }
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ auto techniqueFilterParameter = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::cyan)));
+ techniqueFilterFG->addParameter(techniqueFilterParameter);
+
+ material.addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::green))));
+ material.effect()->addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::blue))));
+
+ auto techniqueParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::white)));
+
+ material.gl3Technique()->addParameter(techniqueParam);
+ material.gl2Technique()->addParameter(techniqueParam);
+ material.es2Technique()->addParameter(techniqueParam);
+
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> TechniqueFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(techniqueFilterParameter->id()));
+ }
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ auto materialParameter = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::cyan)));
+
+ material.addParameter(materialParameter);
+ material.effect()->addParameter(new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::blue))));
+
+ auto techniqueParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::white)));
+
+ material.gl3Technique()->addParameter(techniqueParam);
+ material.gl2Technique()->addParameter(techniqueParam);
+ material.es2Technique()->addParameter(techniqueParam);
+
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> TechniqueFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(materialParameter->id()));
+ }
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ auto effectParameter = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::cyan)));
+
+ material.effect()->addParameter(effectParameter);
+
+ auto techniqueParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::white)));
+
+ material.gl3Technique()->addParameter(techniqueParam);
+ material.gl2Technique()->addParameter(techniqueParam);
+ material.es2Technique()->addParameter(techniqueParam);
+
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> TechniqueFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(effectParameter->id()));
+ }
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ auto techniqueParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::white)));
+
+ material.gl3Technique()->addParameter(techniqueParam);
+ material.gl2Technique()->addParameter(techniqueParam);
+ material.es2Technique()->addParameter(techniqueParam);
+
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> TechniqueFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(techniqueParam->id()));
+ }
+ {
+ // GIVEN
+ Qt3DRender::QTechniqueFilter *techniqueFilterFG = techniqueFilterFrameGraph();
+ Qt3DRender::QRenderPassFilter *renderPassFG = renderPassFilter();
+
+ renderPassFG->setParent(techniqueFilterFG);
+
+ TestMaterial material;
+
+ Qt3DCore::QEntity *sceneRoot = buildScene(techniqueFilterFG, &material);
+
+ // WHEN
+ auto passParam = new Qt3DRender::QParameter(QStringLiteral("color"), QVariant(QColor(Qt::gray)));
+
+ material.gl3Pass()->addParameter(passParam);
+ material.gl2Pass()->addParameter(passParam);
+ material.es2Pass()->addParameter(passParam);
+
+ Qt3DRender::TestAspect testAspect(sceneRoot);
+ Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ testAspect.initializeRenderer();
+
+ QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
+ Qt3DRender::Render::TechniqueFilter *backendTechniqueFilter = static_cast<Qt3DRender::Render::TechniqueFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(techniqueFilterFG->id()));
+ Qt3DRender::Render::RenderPassFilter *backendRenderPassFilter = static_cast<Qt3DRender::Render::RenderPassFilter *>(testAspect.nodeManagers()->frameGraphManager()->lookupNode(renderPassFG->id()));
+ QVERIFY(backendTechniqueFilter != nullptr);
+ QVERIFY(backendRenderPassFilter != nullptr);
+
+ gatherer->setHandles(testAspect.nodeManagers()->materialManager()->activeHandles());
+ gatherer->setRenderPassFilter(backendRenderPassFilter);
+ gatherer->setTechniqueFilter(backendTechniqueFilter);
+ gatherer->run();
+
+ // THEN -> TechniqueFilter wins
+ QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
+
+ const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ QCOMPARE(passParameterData.size(), 1);
+
+ const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+
+ QCOMPARE(data.parameterInfo.size(), 1);
+ QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(passParam->id()));
+ }
+ }
};
QTEST_MAIN(tst_MaterialParameterGatherer)