summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-09-18 12:28:25 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-09-25 11:40:16 +0200
commit6370b00fc647f4c064f5c83cda8f0a5fb82a7fbf (patch)
tree9e185130334cb9089cd16c74d5e76e7e6366da1d
parent26ae3af8b1bcadf608b24160601eb0d772bd20ce (diff)
Update QRenderTarget to use direct sync
Change-Id: Ie0261d21c63f2df798b1eb82aae05fb3440f71e5 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r--src/render/backend/rendertarget.cpp45
-rw-r--r--src/render/backend/rendertarget_p.h4
-rw-r--r--src/render/frontend/qrenderaspect.cpp2
-rw-r--r--src/render/frontend/qrendertarget.cpp12
-rw-r--r--tests/auto/render/qrendertarget/tst_qrendertarget.cpp20
-rw-r--r--tests/auto/render/rendertarget/tst_rendertarget.cpp30
6 files changed, 43 insertions, 70 deletions
diff --git a/src/render/backend/rendertarget.cpp b/src/render/backend/rendertarget.cpp
index b0565a26b..206f64e4e 100644
--- a/src/render/backend/rendertarget.cpp
+++ b/src/render/backend/rendertarget.cpp
@@ -58,11 +58,21 @@ RenderTarget::RenderTarget()
{
}
-void RenderTarget::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
+void RenderTarget::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime)
{
- const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QRenderTargetData>>(change);
- const auto &data = typedChange->data;
- m_renderOutputs = data.outputIds;
+ const QRenderTarget *node = qobject_cast<const QRenderTarget *>(frontEnd);
+ if (!node)
+ return;
+
+ BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+
+ auto outputIds = qIdsForNodes(node->outputs());
+ std::sort(std::begin(outputIds), std::end(outputIds));
+
+ if (m_renderOutputs != outputIds) {
+ m_renderOutputs = outputIds;
+ markDirty(AbstractRenderer::AllDirty);
+ }
}
void RenderTarget::cleanup()
@@ -87,33 +97,6 @@ QVector<Qt3DCore::QNodeId> RenderTarget::renderOutputs() const
return m_renderOutputs;
}
-void RenderTarget::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
-{
- switch (e->type()) {
- case Qt3DCore::PropertyValueAdded: {
- const auto change = qSharedPointerCast<QPropertyNodeAddedChange>(e);
- if (change->propertyName() == QByteArrayLiteral("output")) {
- appendRenderOutput(change->addedNodeId());
- markDirty(AbstractRenderer::AllDirty);
- }
- break;
- }
-
- case Qt3DCore::PropertyValueRemoved: {
- const auto change = qSharedPointerCast<QPropertyNodeRemovedChange>(e);
- if (change->propertyName() == QByteArrayLiteral("output")) {
- removeRenderOutput(change->removedNodeId());
- markDirty(AbstractRenderer::AllDirty);
- }
- break;
- }
-
- default:
- break;
- }
- BackendNode::sceneChangeEvent(e);
-}
-
} // namespace Render
} // namespace Qt3DRender
diff --git a/src/render/backend/rendertarget_p.h b/src/render/backend/rendertarget_p.h
index 5e3e63582..30769dcfc 100644
--- a/src/render/backend/rendertarget_p.h
+++ b/src/render/backend/rendertarget_p.h
@@ -76,11 +76,9 @@ public:
QVector<Qt3DCore::QNodeId> renderOutputs() const;
- 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_renderOutputs;
};
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp
index 256c88e3e..1aef960f3 100644
--- a/src/render/frontend/qrenderaspect.cpp
+++ b/src/render/frontend/qrenderaspect.cpp
@@ -260,7 +260,7 @@ void QRenderAspectPrivate::registerBackendTypes()
q->registerBackendType<QLevelOfDetail, true>(QSharedPointer<Render::NodeFunctor<Render::LevelOfDetail, Render::LevelOfDetailManager> >::create(m_renderer));
q->registerBackendType<QLevelOfDetailSwitch, true>(QSharedPointer<Render::NodeFunctor<Render::LevelOfDetail, Render::LevelOfDetailManager> >::create(m_renderer));
q->registerBackendType<QSceneLoader, true>(QSharedPointer<Render::RenderSceneFunctor>::create(m_renderer, m_nodeManagers->sceneManager()));
- q->registerBackendType<QRenderTarget>(QSharedPointer<Render::NodeFunctor<Render::RenderTarget, Render::RenderTargetManager> >::create(m_renderer));
+ q->registerBackendType<QRenderTarget, true>(QSharedPointer<Render::NodeFunctor<Render::RenderTarget, Render::RenderTargetManager> >::create(m_renderer));
q->registerBackendType<QRenderTargetOutput>(QSharedPointer<Render::NodeFunctor<Render::RenderTargetOutput, Render::AttachmentManager> >::create(m_renderer));
q->registerBackendType<QRenderSettings>(QSharedPointer<Render::RenderSettingsFunctor>::create(m_renderer));
q->registerBackendType<QRenderState>(QSharedPointer<Render::NodeFunctor<Render::RenderStateNode, Render::RenderStateManager> >::create(m_renderer));
diff --git a/src/render/frontend/qrendertarget.cpp b/src/render/frontend/qrendertarget.cpp
index 9aa9c8c41..2a74db775 100644
--- a/src/render/frontend/qrendertarget.cpp
+++ b/src/render/frontend/qrendertarget.cpp
@@ -126,11 +126,7 @@ void QRenderTarget::addOutput(QRenderTargetOutput *output)
if (!output->parent())
output->setParent(this);
- if (d->m_changeArbiter != nullptr) {
- const auto change = QPropertyNodeAddedChangePtr::create(id(), output);
- change->setPropertyName("output");
- d->notifyObservers(change);
- }
+ d->update();
}
}
@@ -141,11 +137,7 @@ void QRenderTarget::removeOutput(QRenderTargetOutput *output)
{
Q_D(QRenderTarget);
- if (output && d->m_changeArbiter != nullptr) {
- const auto change = QPropertyNodeRemovedChangePtr::create(id(), output);
- change->setPropertyName("output");
- d->notifyObservers(change);
- }
+ d->update();
d->m_outputs.removeOne(output);
// Remove bookkeeping connection
d->unregisterDestructionHelper(output);
diff --git a/tests/auto/render/qrendertarget/tst_qrendertarget.cpp b/tests/auto/render/qrendertarget/tst_qrendertarget.cpp
index 03a9e5f94..ffb17faea 100644
--- a/tests/auto/render/qrendertarget/tst_qrendertarget.cpp
+++ b/tests/auto/render/qrendertarget/tst_qrendertarget.cpp
@@ -167,13 +167,11 @@ private Q_SLOTS:
QCoreApplication::processEvents();
// THEN
- QCOMPARE(arbiter.events.size(), 1);
- auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>();
- QCOMPARE(change->propertyName(), "output");
- QCOMPARE(change->addedNodeId(), renderTargetOutput.id());
- QCOMPARE(change->type(), Qt3DCore::PropertyValueAdded);
+ QCOMPARE(arbiter.events.size(), 0);
+ QCOMPARE(arbiter.dirtyNodes.size(), 1);
+ QCOMPARE(arbiter.dirtyNodes.front(), &renderTarget);
- arbiter.events.clear();
+ arbiter.dirtyNodes.clear();
}
{
@@ -182,13 +180,11 @@ private Q_SLOTS:
QCoreApplication::processEvents();
// THEN
- QCOMPARE(arbiter.events.size(), 1);
- auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>();
- QCOMPARE(change->propertyName(), "output");
- QCOMPARE(change->removedNodeId(), renderTargetOutput.id());
- QCOMPARE(change->type(), Qt3DCore::PropertyValueRemoved);
+ QCOMPARE(arbiter.events.size(), 0);
+ QCOMPARE(arbiter.dirtyNodes.size(), 1);
+ QCOMPARE(arbiter.dirtyNodes.front(), &renderTarget);
- arbiter.events.clear();
+ arbiter.dirtyNodes.clear();
}
}
};
diff --git a/tests/auto/render/rendertarget/tst_rendertarget.cpp b/tests/auto/render/rendertarget/tst_rendertarget.cpp
index a5d8cad77..cd7b0978a 100644
--- a/tests/auto/render/rendertarget/tst_rendertarget.cpp
+++ b/tests/auto/render/rendertarget/tst_rendertarget.cpp
@@ -75,6 +75,7 @@ private Q_SLOTS:
void checkInitializeFromPeer()
{
// GIVEN
+ TestRenderer renderer;
Qt3DRender::QRenderTarget renderTarget;
Qt3DRender::QRenderTargetOutput renderTargetOuput;
renderTarget.addOutput(&renderTargetOuput);
@@ -82,8 +83,8 @@ private Q_SLOTS:
{
// WHEN
Qt3DRender::Render::RenderTarget backendRenderTarget;
- simulateInitialization(&renderTarget, &backendRenderTarget);
-
+ backendRenderTarget.setRenderer(&renderer);
+ simulateInitializationSync(&renderTarget, &backendRenderTarget);
// THEN
QCOMPARE(backendRenderTarget.isEnabled(), true);
QCOMPARE(backendRenderTarget.peerId(), renderTarget.id());
@@ -93,7 +94,8 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::RenderTarget backendRenderTarget;
renderTarget.setEnabled(false);
- simulateInitialization(&renderTarget, &backendRenderTarget);
+ backendRenderTarget.setRenderer(&renderer);
+ simulateInitializationSync(&renderTarget, &backendRenderTarget);
// THEN
QCOMPARE(backendRenderTarget.peerId(), renderTarget.id());
@@ -168,17 +170,17 @@ private Q_SLOTS:
void checkSceneChangeEvents()
{
// GIVEN
+ Qt3DRender::QRenderTarget renderTarget;
Qt3DRender::Render::RenderTarget backendRenderTarget;
TestRenderer renderer;
backendRenderTarget.setRenderer(&renderer);
+ simulateInitializationSync(&renderTarget, &backendRenderTarget);
{
// WHEN
const bool newValue = false;
- const auto change = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- change->setPropertyName("enabled");
- change->setValue(newValue);
- backendRenderTarget.sceneChangeEvent(change);
+ renderTarget.setEnabled(newValue);
+ backendRenderTarget.syncFromFrontEnd(&renderTarget, false);
// THEN
QCOMPARE(backendRenderTarget.isEnabled(), newValue);
@@ -186,21 +188,23 @@ private Q_SLOTS:
{
// WHEN
Qt3DRender::QRenderTargetOutput targetOutput;
- const auto addChange = Qt3DCore::QPropertyNodeAddedChangePtr::create(Qt3DCore::QNodeId(), &targetOutput);
- addChange->setPropertyName("output");
- backendRenderTarget.sceneChangeEvent(addChange);
+ renderTarget.addOutput(&targetOutput);
+ backendRenderTarget.syncFromFrontEnd(&renderTarget, false);
// THEN
QCOMPARE(backendRenderTarget.renderOutputs().size(), 1);
QCOMPARE(backendRenderTarget.renderOutputs().first(), targetOutput.id());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
// WHEN
- const auto removeChange = Qt3DCore::QPropertyNodeRemovedChangePtr::create(Qt3DCore::QNodeId(), &targetOutput);
- removeChange->setPropertyName("output");
- backendRenderTarget.sceneChangeEvent(removeChange);
+ renderTarget.removeOutput(&targetOutput);
+ backendRenderTarget.syncFromFrontEnd(&renderTarget, false);
// THEN
QCOMPARE(backendRenderTarget.renderOutputs().size(), 0);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
}
}