diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-10-15 16:42:19 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-10-17 12:04:16 +0200 |
commit | aee3dbc8b8f90b76d18ccc833b36dfb787c0bdc5 (patch) | |
tree | 2d481f39500573f55ddf82c98f0a9d12ccd59230 | |
parent | b71e3b7b5c29a3528e421bd680d126679e348221 (diff) |
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 <mike.krus@kdab.com>
-rw-r--r-- | src/render/geometry/buffer.cpp | 4 | ||||
-rw-r--r-- | src/render/geometry/qbuffer.cpp | 2 | ||||
-rw-r--r-- | 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,26 +113,40 @@ 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(); // THEN |