diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-17 12:19:07 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-20 14:25:21 +0200 |
commit | 74ac5ba62fedc3cd44a602e981f72ffc7276cf0f (patch) | |
tree | 29aca6d9f0df5f50bc0911edd041042cbc95e434 | |
parent | 722425eccd099936a15b850698c5fc3047f162a2 (diff) |
Update QRenderPassFilter to use direct sync
Change-Id: I50272611d13a5f24722bd5b717d2265a3ebf0b62
Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r-- | src/render/framegraph/qrenderpassfilter.cpp | 24 | ||||
-rw-r--r-- | src/render/framegraph/renderpassfilternode.cpp | 65 | ||||
-rw-r--r-- | src/render/framegraph/renderpassfilternode_p.h | 4 | ||||
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 2 | ||||
-rw-r--r-- | tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp | 48 |
5 files changed, 49 insertions, 94 deletions
diff --git a/src/render/framegraph/qrenderpassfilter.cpp b/src/render/framegraph/qrenderpassfilter.cpp index 56c229d9c..4ef7e6d2d 100644 --- a/src/render/framegraph/qrenderpassfilter.cpp +++ b/src/render/framegraph/qrenderpassfilter.cpp @@ -142,11 +142,7 @@ void QRenderPassFilter::addMatch(QFilterKey *filterKey) if (!filterKey->parent()) filterKey->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), filterKey); - change->setPropertyName("match"); - d->notifyObservers(change); - } + d->update(); } } @@ -158,11 +154,7 @@ void QRenderPassFilter::removeMatch(QFilterKey *filterKey) Q_ASSERT(filterKey); Q_D(QRenderPassFilter); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), filterKey); - change->setPropertyName("match"); - d->notifyObservers(change); - } + d->update(); d->m_matchList.removeOne(filterKey); // Remove bookkeeping connection d->unregisterDestructionHelper(filterKey); @@ -188,11 +180,7 @@ void QRenderPassFilter::addParameter(QParameter *parameter) if (!parameter->parent()) parameter->setParent(this); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeAddedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); } } @@ -204,11 +192,7 @@ void QRenderPassFilter::removeParameter(QParameter *parameter) Q_ASSERT(parameter); Q_D(QRenderPassFilter); - if (d->m_changeArbiter != nullptr) { - const auto change = QPropertyNodeRemovedChangePtr::create(id(), parameter); - change->setPropertyName("parameter"); - d->notifyObservers(change); - } + d->update(); d->m_parameters.removeOne(parameter); // Remove bookkeeping connection d->unregisterDestructionHelper(parameter); diff --git a/src/render/framegraph/renderpassfilternode.cpp b/src/render/framegraph/renderpassfilternode.cpp index e3da1e36d..afc49a563 100644 --- a/src/render/framegraph/renderpassfilternode.cpp +++ b/src/render/framegraph/renderpassfilternode.cpp @@ -58,16 +58,33 @@ RenderPassFilter::RenderPassFilter() { } -void RenderPassFilter::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) +void RenderPassFilter::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) { - FrameGraphNode::initializeFromPeer(change); - const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QRenderPassFilterData>>(change); - const auto &data = typedChange->data; - m_filters = data.matchIds; - m_parameterPack.clear(); - m_parameterPack.setParameters(data.parameterIds); + const QRenderPassFilter *node = qobject_cast<const QRenderPassFilter *>(frontEnd); + if (!node) + return; + + FrameGraphNode::syncFromFrontEnd(frontEnd, firstTime); + + if (firstTime) + m_parameterPack.clear(); + + auto parameters = qIdsForNodes(node->parameters()); + std::sort(std::begin(parameters), std::end(parameters)); + if (m_parameterPack.parameters() != parameters) { + m_parameterPack.setParameters(parameters); + markDirty(AbstractRenderer::FrameGraphDirty); + } + + auto filterIds = qIdsForNodes(node->matchAny()); + std::sort(std::begin(filterIds), std::end(filterIds)); + if (m_filters != filterIds) { + m_filters = filterIds; + markDirty(AbstractRenderer::FrameGraphDirty); + } } + QVector<Qt3DCore::QNodeId> RenderPassFilter::filters() const { return m_filters; @@ -89,40 +106,6 @@ QVector<Qt3DCore::QNodeId> RenderPassFilter::parameters() const return m_parameterPack.parameters(); } -void RenderPassFilter::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - - switch (e->type()) { - case PropertyValueAdded: { - const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e); - if (change->propertyName() == QByteArrayLiteral("match")) { - appendFilter(change->addedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.appendParameter(change->addedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } - break; - } - - case PropertyValueRemoved: { - const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e); - if (change->propertyName() == QByteArrayLiteral("match")) { - removeFilter(change->removedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } else if (change->propertyName() == QByteArrayLiteral("parameter")) { - m_parameterPack.removeParameter(change->removedNodeId()); - markDirty(AbstractRenderer::FrameGraphDirty); - } - break; - } - - default: - break; - } - FrameGraphNode::sceneChangeEvent(e); -} - } // namespace Render } // namespace Qt3DRender diff --git a/src/render/framegraph/renderpassfilternode_p.h b/src/render/framegraph/renderpassfilternode_p.h index 398d42049..157a162bb 100644 --- a/src/render/framegraph/renderpassfilternode_p.h +++ b/src/render/framegraph/renderpassfilternode_p.h @@ -76,11 +76,9 @@ public: QVector<Qt3DCore::QNodeId> parameters() const; void appendFilter(Qt3DCore::QNodeId criterionId); void removeFilter(Qt3DCore::QNodeId criterionId); - void sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) override; + void syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) override; private: - void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; - QVector<Qt3DCore::QNodeId> m_filters; ParameterPack m_parameterPack; }; diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 62f0c34c1..ef0593835 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -302,7 +302,7 @@ void QRenderAspectPrivate::registerBackendTypes() q->registerBackendType<QFrustumCulling, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::FrustumCulling, QFrustumCulling> >::create(m_renderer)); q->registerBackendType<QLayerFilter, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::LayerFilterNode, QLayerFilter> >::create(m_renderer)); q->registerBackendType<QNoDraw, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::NoDraw, QNoDraw> >::create(m_renderer)); - q->registerBackendType<QRenderPassFilter>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderPassFilter, QRenderPassFilter> >::create(m_renderer)); + q->registerBackendType<QRenderPassFilter, true>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderPassFilter, QRenderPassFilter> >::create(m_renderer)); q->registerBackendType<QRenderStateSet>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::StateSetNode, QRenderStateSet> >::create(m_renderer)); q->registerBackendType<QRenderSurfaceSelector>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderSurfaceSelector, QRenderSurfaceSelector> >::create(m_renderer)); q->registerBackendType<QRenderTargetSelector>(QSharedPointer<Render::FrameGraphNodeFunctor<Render::RenderTargetSelector, QRenderTargetSelector> >::create(m_renderer)); diff --git a/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp b/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp index 23544c0c6..f08846ba3 100644 --- a/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp +++ b/tests/auto/render/qrenderpassfilter/tst_qrenderpassfilter.cpp @@ -154,14 +154,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeAddedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "parameter"); - QCOMPARE(change->subjectId(),renderPassFilter->id()); - QCOMPARE(change->addedNodeId(), param1->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(renderPassFilter.data())); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN renderPassFilter->addParameter(param1); @@ -169,20 +166,18 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); // WHEN renderPassFilter->removeParameter(param1); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - Qt3DCore::QPropertyNodeRemovedChangePtr nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(nodeRemovedChange->propertyName(), "parameter"); - QCOMPARE(nodeRemovedChange->subjectId(), renderPassFilter->id()); - QCOMPARE(nodeRemovedChange->removedNodeId(), param1->id()); - QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(renderPassFilter.data())); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN Qt3DRender::QFilterKey *filterKey1 = new Qt3DRender::QFilterKey(); @@ -190,14 +185,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(change->propertyName(), "match"); - QCOMPARE(change->subjectId(),renderPassFilter->id()); - QCOMPARE(change->addedNodeId(), filterKey1->id()); - QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(renderPassFilter.data())); - arbiter.events.clear(); + arbiter.dirtyNodes.clear(); // WHEN renderPassFilter->addMatch(filterKey1); @@ -205,20 +197,18 @@ private Q_SLOTS: // THEN QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 0); // WHEN renderPassFilter->removeMatch(filterKey1); QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - nodeRemovedChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(nodeRemovedChange->propertyName(), "match"); - QCOMPARE(nodeRemovedChange->subjectId(), renderPassFilter->id()); - QCOMPARE(nodeRemovedChange->removedNodeId(), filterKey1->id()); - QCOMPARE(nodeRemovedChange->type(), Qt3DCore::PropertyValueRemoved); - - arbiter.events.clear(); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QVERIFY(arbiter.dirtyNodes.contains(renderPassFilter.data())); + + arbiter.dirtyNodes.clear(); } void checkParameterBookkeeping() |