summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-05-24 12:50:32 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-05-24 12:54:01 +0200
commit2cdd87235fd86d9f2c0e8500be8d429b4f85b64a (patch)
tree75a41cb4319e2ade03b4d773d76e9f0a4090bf28
parent6a8cfd6e52ad340c80b5a8b862b713192cecf791 (diff)
Fix Parameter priority sorting
Parameters defined on an effect have priority over those defined in a Technique. Change-Id: I49558a065b613d7ea9d1cbf0a64f6d5aad941cd3 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r--src/render/renderers/opengl/jobs/renderviewjobutils.cpp6
-rw-r--r--tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp321
2 files changed, 324 insertions, 3 deletions
diff --git a/src/render/renderers/opengl/jobs/renderviewjobutils.cpp b/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
index 629e7e935..acb38ffb9 100644
--- a/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
+++ b/src/render/renderers/opengl/jobs/renderviewjobutils.cpp
@@ -407,14 +407,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/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)