From 6370b00fc647f4c064f5c83cda8f0a5fb82a7fbf Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 18 Sep 2019 12:28:25 +0200 Subject: Update QRenderTarget to use direct sync Change-Id: Ie0261d21c63f2df798b1eb82aae05fb3440f71e5 Reviewed-by: Paul Lemire --- src/render/backend/rendertarget.cpp | 45 +++++++--------------- src/render/backend/rendertarget_p.h | 4 +- src/render/frontend/qrenderaspect.cpp | 2 +- src/render/frontend/qrendertarget.cpp | 12 +----- .../render/qrendertarget/tst_qrendertarget.cpp | 20 ++++------ .../auto/render/rendertarget/tst_rendertarget.cpp | 30 ++++++++------- 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>(change); - const auto &data = typedChange->data; - m_renderOutputs = data.outputIds; + const QRenderTarget *node = qobject_cast(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 RenderTarget::renderOutputs() const return m_renderOutputs; } -void RenderTarget::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) -{ - switch (e->type()) { - case Qt3DCore::PropertyValueAdded: { - const auto change = qSharedPointerCast(e); - if (change->propertyName() == QByteArrayLiteral("output")) { - appendRenderOutput(change->addedNodeId()); - markDirty(AbstractRenderer::AllDirty); - } - break; - } - - case Qt3DCore::PropertyValueRemoved: { - const auto change = qSharedPointerCast(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 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 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(QSharedPointer >::create(m_renderer)); q->registerBackendType(QSharedPointer >::create(m_renderer)); q->registerBackendType(QSharedPointer::create(m_renderer, m_nodeManagers->sceneManager())); - q->registerBackendType(QSharedPointer >::create(m_renderer)); + q->registerBackendType(QSharedPointer >::create(m_renderer)); q->registerBackendType(QSharedPointer >::create(m_renderer)); q->registerBackendType(QSharedPointer::create(m_renderer)); q->registerBackendType(QSharedPointer >::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(); - 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(); - 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); } } -- cgit v1.2.3