summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@qt.io>2017-12-10 16:20:08 +0100
committerLaszlo Agocs <laszlo.agocs@qt.io>2017-12-11 16:15:38 +0000
commit7aab0e3b850cc17735ac19ab7a6e7db2bac1cb83 (patch)
tree721c7dba20026f97571efd06cb758b8448244132
parent8470becd886d299c1be892d8113dfff216035611 (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.cpp28
-rw-r--r--tests/auto/render/blitframebuffer/tst_blitframebuffer.cpp12
-rw-r--r--tests/auto/render/qblitframebuffer/tst_qblitframebuffer.cpp29
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)