From aee3dbc8b8f90b76d18ccc833b36dfb787c0bdc5 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 15 Oct 2019 16:42:19 +0200 Subject: Buffer: mark as dirty even if empty on firstTime We otherwise assert in the case we create an empty buffer that is empty but referenced by Attributes. This is still a valid case as buffer data can be set later on. Change-Id: Ida198f5815f6cbb488b6b27436c4238146c3ae39 Reviewed-by: Mike Krus --- src/render/geometry/buffer.cpp | 4 +++- src/render/geometry/qbuffer.cpp | 2 +- tests/auto/render/buffer/tst_buffer.cpp | 24 +++++++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/render/geometry/buffer.cpp b/src/render/geometry/buffer.cpp index 998db3640..0ce81efc1 100644 --- a/src/render/geometry/buffer.cpp +++ b/src/render/geometry/buffer.cpp @@ -130,8 +130,10 @@ void Buffer::syncFromFrontEnd(const QNode *frontEnd, bool firstTime) if (!node) return; - if (firstTime && m_manager != nullptr) + if (firstTime && m_manager != nullptr) { m_manager->addBufferReference(peerId()); + m_bufferDirty = true; + } m_syncData = node->isSyncData(); m_access = node->accessType(); diff --git a/src/render/geometry/qbuffer.cpp b/src/render/geometry/qbuffer.cpp index f27005f2b..d27da25c7 100644 --- a/src/render/geometry/qbuffer.cpp +++ b/src/render/geometry/qbuffer.cpp @@ -329,7 +329,7 @@ void QBuffer::setData(const QByteArray &bytes) Q_D(QBuffer); if (bytes != d->m_data) { d->m_data = bytes; - Qt3DCore::QNodePrivate::get(this)->update(); + d->update(); emit dataChanged(bytes); } } diff --git a/tests/auto/render/buffer/tst_buffer.cpp b/tests/auto/render/buffer/tst_buffer.cpp index 1487d3728..48215bea5 100644 --- a/tests/auto/render/buffer/tst_buffer.cpp +++ b/tests/auto/render/buffer/tst_buffer.cpp @@ -113,25 +113,39 @@ private Q_SLOTS: // GIVEN Qt3DRender::QBuffer frontendBuffer; - frontendBuffer.setUsage(Qt3DRender::QBuffer::DynamicCopy); - frontendBuffer.setData(QByteArrayLiteral("C7KR4")); - frontendBuffer.setDataGenerator(Qt3DRender::QBufferDataGeneratorPtr(new TestFunctor(73))); // WHEN backendBuffer.setManager(&bufferManager); backendBuffer.setRenderer(&renderer); simulateInitializationSync(&frontendBuffer, &backendBuffer); - frontendBuffer.updateData(2, QByteArrayLiteral("LS5")); + // THEN + QCOMPARE(backendBuffer.isDirty(), true); + QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::StaticDraw); + QVERIFY(backendBuffer.data().isEmpty()); + QVERIFY(backendBuffer.dataGenerator().isNull()); + QVERIFY(backendBuffer.pendingBufferUpdates().empty()); + + // WHEN + frontendBuffer.setUsage(Qt3DRender::QBuffer::DynamicCopy); + frontendBuffer.setData(QByteArrayLiteral("C7KR4")); + frontendBuffer.setDataGenerator(Qt3DRender::QBufferDataGeneratorPtr(new TestFunctor(73))); backendBuffer.syncFromFrontEnd(&frontendBuffer, false); // THEN QCOMPARE(backendBuffer.usage(), Qt3DRender::QBuffer::DynamicCopy); QCOMPARE(backendBuffer.isDirty(), true); - QCOMPARE(backendBuffer.data(), QByteArrayLiteral("C7LS5")); + QCOMPARE(backendBuffer.data(), QByteArrayLiteral("C7KR4")); QVERIFY(!backendBuffer.dataGenerator().isNull()); QVERIFY(!backendBuffer.pendingBufferUpdates().empty()); + // WHEN + frontendBuffer.updateData(2, QByteArrayLiteral("LS5")); + backendBuffer.syncFromFrontEnd(&frontendBuffer, false); + + // THEN + QCOMPARE(backendBuffer.isDirty(), true); + QCOMPARE(backendBuffer.data(), QByteArrayLiteral("C7LS5")); // WHEN backendBuffer.cleanup(); -- cgit v1.2.3 From 92f29f8592f4067a07e57f81f8cde44df55c0756 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Tue, 15 Oct 2019 17:01:06 +0200 Subject: FrameGraphNode: mark dirty on cleanup Otherwise the FG cache is not rebuilt and we might have dangling pointers around. Change-Id: Id97de41092617acbf067fcac4cf7805c2eb715da Reviewed-by: Mike Krus --- src/render/framegraph/framegraphnode.cpp | 1 + .../auto/render/framegraphnode/tst_framegraphnode.cpp | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/render/framegraph/framegraphnode.cpp b/src/render/framegraph/framegraphnode.cpp index 58ff05dc0..40d8fca3d 100644 --- a/src/render/framegraph/framegraphnode.cpp +++ b/src/render/framegraph/framegraphnode.cpp @@ -123,6 +123,7 @@ QVector FrameGraphNode::children() const void FrameGraphNode::cleanup() { setParentId({}); + markDirty(AbstractRenderer::FrameGraphDirty); } void FrameGraphNode::syncFromFrontEnd(const Qt3DCore::QNode *frontEnd, bool firstTime) diff --git a/tests/auto/render/framegraphnode/tst_framegraphnode.cpp b/tests/auto/render/framegraphnode/tst_framegraphnode.cpp index 770f7e72d..a7cea2ef2 100644 --- a/tests/auto/render/framegraphnode/tst_framegraphnode.cpp +++ b/tests/auto/render/framegraphnode/tst_framegraphnode.cpp @@ -266,6 +266,24 @@ private Q_SLOTS: } } + void checCleanupMarksDirty() + { + // GIVEN + TestRenderer renderer; + Qt3DRender::Render::FrameGraphNode *backendFGNode = new MyFrameGraphNode(); + + backendFGNode->setRenderer(&renderer); + + // THEN + QVERIFY(renderer.dirtyBits() == 0); + + // WHEN + backendFGNode->cleanup(); + + // THEN + QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::FrameGraphDirty); + } + }; QTEST_MAIN(tst_FrameGraphNode) -- cgit v1.2.3