diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2016-09-07 08:36:41 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2016-11-25 16:29:28 +0000 |
commit | d9615a73455069f77e1dcdee7cbc39413703f69f (patch) | |
tree | 56a92255beca70040ddaf15d5f48362f076e6144 | |
parent | d07496129a108a54345174b7651d1989cb9f157f (diff) |
Technique: add a flag to check for compatibility
Will allow to avoid doing the expensive GraphicsApiFilterData comparison every
frame but only when the Technique has actually changed.
Change-Id: Ife4b6a03b7da5d157df33c7fc2770fea2d7b76fc
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/materialsystem/technique.cpp | 15 | ||||
-rw-r--r-- | src/render/materialsystem/technique_p.h | 4 | ||||
-rw-r--r-- | tests/auto/render/technique/tst_technique.cpp | 21 |
3 files changed, 40 insertions, 0 deletions
diff --git a/src/render/materialsystem/technique.cpp b/src/render/materialsystem/technique.cpp index a3a650f7a..bf141ad28 100644 --- a/src/render/materialsystem/technique.cpp +++ b/src/render/materialsystem/technique.cpp @@ -63,6 +63,7 @@ namespace Render { Technique::Technique() : BackendNode() + , m_isCompatibleWithRenderer(false) { } @@ -77,6 +78,7 @@ void Technique::cleanup() m_parameterPack.clear(); m_renderPasses.clear(); m_filterKeyList.clear(); + m_isCompatibleWithRenderer = false; } void Technique::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) @@ -98,6 +100,9 @@ void Technique::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (change->propertyName() == QByteArrayLiteral("graphicsApiFilterData")) { GraphicsApiFilterData filterData = change->value().value<GraphicsApiFilterData>(); m_graphicsApiFilterData = filterData; + // Notify the manager that our graphicsApiFilterData has changed + // and that we therefore need to be check for compatibility again + m_isCompatibleWithRenderer = false; } break; } @@ -162,6 +167,16 @@ const GraphicsApiFilterData *Technique::graphicsApiFilter() const return &m_graphicsApiFilterData; } +bool Technique::isCompatibleWithRenderer() const +{ + return m_isCompatibleWithRenderer; +} + +void Technique::setCompatibleWithRenderer(bool compatible) +{ + m_isCompatibleWithRenderer = compatible; +} + void Technique::appendFilterKey(Qt3DCore::QNodeId criterionId) { if (!m_filterKeyList.contains(criterionId)) diff --git a/src/render/materialsystem/technique_p.h b/src/render/materialsystem/technique_p.h index 9686495b9..61e27550a 100644 --- a/src/render/materialsystem/technique_p.h +++ b/src/render/materialsystem/technique_p.h @@ -93,6 +93,9 @@ public: QVector<Qt3DCore::QNodeId> renderPasses() const; const GraphicsApiFilterData *graphicsApiFilter() const; + bool isCompatibleWithRenderer() const; + void setCompatibleWithRenderer(bool compatible); + private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; @@ -100,6 +103,7 @@ private: ParameterPack m_parameterPack; QVector<Qt3DCore::QNodeId> m_filterKeyList; QVector<Qt3DCore::QNodeId> m_renderPasses; + bool m_isCompatibleWithRenderer; }; } // namespace Render diff --git a/tests/auto/render/technique/tst_technique.cpp b/tests/auto/render/technique/tst_technique.cpp index 06d560ee9..c5b8802ed 100644 --- a/tests/auto/render/technique/tst_technique.cpp +++ b/tests/auto/render/technique/tst_technique.cpp @@ -65,6 +65,7 @@ private Q_SLOTS: QCOMPARE(backendTechnique.parameters().size(), 0); QCOMPARE(backendTechnique.filterKeys().size(), 0); QCOMPARE(backendTechnique.renderPasses().size(), 0); + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); } void checkCleanupState() @@ -74,6 +75,7 @@ private Q_SLOTS: // WHEN backendTechnique.setEnabled(true); + backendTechnique.setCompatibleWithRenderer(true); { Qt3DRender::QTechnique technique; @@ -95,6 +97,7 @@ private Q_SLOTS: QCOMPARE(backendTechnique.parameters().size(), 0); QCOMPARE(backendTechnique.filterKeys().size(), 0); QCOMPARE(backendTechnique.renderPasses().size(), 0); + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); } void checkInitializeFromPeer() @@ -125,6 +128,7 @@ private Q_SLOTS: QCOMPARE(backendTechnique.filterKeys().first(), filterKey.id()); QCOMPARE(backendTechnique.renderPasses().size(), 1); QCOMPARE(backendTechnique.renderPasses().first(), pass.id()); + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); } { // WHEN @@ -138,6 +142,21 @@ private Q_SLOTS: } } + void checkSetCompatibleWithRenderer() + { + // GIVEN + Qt3DRender::Render::Technique backendTechnique; + + // THEN + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); + + // WHEN + backendTechnique.setCompatibleWithRenderer(true); + + // THEN + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), true); + } + void checkSceneChangeEvents() { // GIVEN @@ -158,6 +177,7 @@ private Q_SLOTS: } { // WHEN + backendTechnique.setCompatibleWithRenderer(true); Qt3DRender::GraphicsApiFilterData newValue; newValue.m_major = 4; newValue.m_minor = 5; @@ -170,6 +190,7 @@ private Q_SLOTS: // THEN QCOMPARE(*backendTechnique.graphicsApiFilter(), newValue); + QCOMPARE(backendTechnique.isCompatibleWithRenderer(), false); } { Qt3DRender::QParameter parameter; |