diff options
author | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-12-10 16:20:08 +0100 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2017-12-11 16:15:38 +0000 |
commit | 7aab0e3b850cc17735ac19ab7a6e7db2bac1cb83 (patch) | |
tree | 721c7dba20026f97571efd06cb758b8448244132 | |
parent | 8470becd886d299c1be892d8113dfff216035611 (diff) |
Add QBlitFramebuffer auto-parenting behavior
As is common with other nodes.
Task-number: QTBUG-65081
Change-Id: I12ccd2fb5344e116f2f5333b73edb4562799543d
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/framegraph/qblitframebuffer.cpp | 28 | ||||
-rw-r--r-- | tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp | 12 | ||||
-rw-r--r-- | tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp | 29 |
3 files changed, 62 insertions, 7 deletions
diff --git a/src/render/framegraph/qblitframebuffer.cpp b/src/render/framegraph/qblitframebuffer.cpp index 505bab96c..629ae04f6 100644 --- a/src/render/framegraph/qblitframebuffer.cpp +++ b/src/render/framegraph/qblitframebuffer.cpp @@ -121,7 +121,21 @@ void QBlitFramebuffer::setSource(QRenderTarget *source) { Q_D(QBlitFramebuffer); if (d->m_source != source) { + if (d->m_source) { + // Remove bookkeeping connection + d->unregisterDestructionHelper(d->m_source); + } + d->m_source = source; + + if (d->m_source) { + // Ensures proper bookkeeping. Calls us back with nullptr in case the rt gets destroyed. + d->registerDestructionHelper(d->m_source, &QBlitFramebuffer::setSource, d->m_source); + + if (!d->m_source->parent()) + d->m_source->setParent(this); + } + emit sourceChanged(); } } @@ -130,7 +144,21 @@ void QBlitFramebuffer::setDestination(QRenderTarget *destination) { Q_D(QBlitFramebuffer); if (d->m_destination != destination) { + if (d->m_destination) { + // Remove bookkeeping connection + d->unregisterDestructionHelper(d->m_destination); + } + d->m_destination = destination; + + if (d->m_destination) { + // Ensures proper bookkeeping. Calls us back with nullptr in case the rt gets destroyed. + d->registerDestructionHelper(d->m_destination, &QBlitFramebuffer::setDestination, d->m_destination); + + if (!d->m_destination->parent()) + d->m_destination->setParent(this); + } + emit destinationChanged(); } } diff --git a/tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp b/tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp index 6c70b0e95..26c43b5c2 100644 --- a/tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp +++ b/tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp @@ -62,11 +62,11 @@ private Q_SLOTS: void checkInitializeFromPeer() { // GIVEN - Qt3DRender::QRenderTarget sourceTarget; - Qt3DRender::QRenderTarget destinationTarget; + Qt3DRender::QRenderTarget *sourceTarget = new Qt3DRender::QRenderTarget; + Qt3DRender::QRenderTarget *destinationTarget = new Qt3DRender::QRenderTarget; Qt3DRender::QBlitFramebuffer blitFramebuffer; - blitFramebuffer.setSource(&sourceTarget); - blitFramebuffer.setDestination(&destinationTarget); + blitFramebuffer.setSource(sourceTarget); + blitFramebuffer.setDestination(destinationTarget); blitFramebuffer.setSourceRect(QRect(0,0,1,1)); blitFramebuffer.setDestinationRect(QRect(0,0,1,1)); blitFramebuffer.setSourceAttachmentPoint(Qt3DRender::QRenderTargetOutput::Color1); @@ -81,8 +81,8 @@ private Q_SLOTS: // THEN QCOMPARE(backendBlitFramebuffer.isEnabled(), true); QCOMPARE(backendBlitFramebuffer.peerId(), blitFramebuffer.id()); - QCOMPARE(backendBlitFramebuffer.sourceRenderTargetId(), sourceTarget.id()); - QCOMPARE(backendBlitFramebuffer.destinationRenderTargetId(), destinationTarget.id()); + QCOMPARE(backendBlitFramebuffer.sourceRenderTargetId(), sourceTarget->id()); + QCOMPARE(backendBlitFramebuffer.destinationRenderTargetId(), destinationTarget->id()); QCOMPARE(backendBlitFramebuffer.sourceRect(), QRect(0,0,1,1)); QCOMPARE(backendBlitFramebuffer.destinationRect(), QRect(0,0,1,1)); QCOMPARE(backendBlitFramebuffer.sourceAttachmentPoint(), Qt3DRender::QRenderTargetOutput::Color1); diff --git a/tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp b/tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp index 26ef936f6..f6c7e1a8a 100644 --- a/tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp +++ b/tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp @@ -85,7 +85,7 @@ private Q_SLOTS: QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges = creationChangeGenerator.creationChanges(); // THEN - QCOMPARE(creationChanges.size(), 1); + QCOMPARE(creationChanges.size(), 3); // 3 due to automatic parenting const Qt3DCore::QNodeCreatedChangePtr<Qt3DRender::QBlitFramebufferData> creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QBlitFramebufferData>>(creationChanges.first()); @@ -331,6 +331,33 @@ private Q_SLOTS: arbiter.events.clear(); } + + void checkSourceDestReset() + { + // GIVEN + TestArbiter arbiter; + QScopedPointer<Qt3DRender::QBlitFramebuffer> blitFramebuffer(new Qt3DRender::QBlitFramebuffer()); + arbiter.setArbiterOnNode(blitFramebuffer.data()); + + Qt3DRender::QRenderTarget *sourceRenderTarget = new Qt3DRender::QRenderTarget; // no parent + Qt3DRender::QRenderTarget *destinationRenderTarget = new Qt3DRender::QRenderTarget(sourceRenderTarget); // have a parent + + // WHEN + blitFramebuffer->setSource(sourceRenderTarget); + blitFramebuffer->setDestination(destinationRenderTarget); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(sourceRenderTarget->parent(), blitFramebuffer.data()); + QCOMPARE(destinationRenderTarget->parent(), sourceRenderTarget); // already set parent must not change + + // WHEN + delete sourceRenderTarget; + + // THEN + QVERIFY(!blitFramebuffer->source()); + QVERIFY(!blitFramebuffer->destination()); // gone too since destinationRenderTarget was parented to sourceRenderTarget + } }; QTEST_MAIN(tst_QBlitFrameBuffer) |