From 96b1b9e3e198e751bb96eeb279106862ca38e7d7 Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Wed, 4 Dec 2019 08:14:29 +0100 Subject: Fix OnDemand rendering with Scene3D When using OnDemand rendering, Scene3D would lock if nothing in the scene were to change. By being blocked, it would also not process jobs for other aspects (input, logics). That would prevent things like a CameraController from running, which in turn would make it impossible to move the camera and trigger a change in the scene to request rendering. Additionally, Scene3D would ignore whether the Qt3D renderer actually needed rendering or not as it was watching on its own the changeArbiter for changes to decide whether rendering was required or not. This would ignore the case where Qt3D needs multiple frames to render a correct frame (e.g loading buffers, shaders at frame n, rebuilding commands at frame n+1) Scene3D now asks the Qt3D renderer by calling the shouldRender() function to decide whether rendering is needed or not, in addition to watching the changeArbiter. Regardless of whether rendering is needed, it now let each aspect process jobs. This ensures things like FrameAction/Input are processed. Then, Scene3D decides whether full rendering is required or whether it only has to be called to allow the Qt3D simulation loop to proceed for the next frame. If the latter, it does it so as not to have QtQuick trigger a redraw. Change-Id: I870f773c224286d6b7ec0f6045319e51e09cbf8e Task-number: QTBUG-80521 Reviewed-by: Mike Krus --- tests/auto/render/commons/testrenderer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tests') diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index 8d27998a0..e1ee329f4 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -55,7 +55,7 @@ public: void doRender(bool swapBuffers) override { Q_UNUSED(swapBuffers); } void cleanGraphicsResources() override {} bool isRunning() const override { return true; } - bool shouldRender() override { return true; } + bool shouldRender() const override { return true; } void skipNextFrame() override {} QVector preRenderingJobs() override { return QVector(); } QVector renderBinJobs() override { return QVector(); } -- cgit v1.2.3 From 69789d0184ffa54c1760ad5204bb4539c9399753 Mon Sep 17 00:00:00 2001 From: Mike Krus Date: Sat, 7 Dec 2019 13:03:58 +0000 Subject: Fix picking with primitive restart Task-number: QTBUG-71919 Change-Id: If7923fab6c43f5d7139d1bbdceb73c17bf489099 Reviewed-by: Paul Lemire --- .../render/trianglevisitor/tst_trianglevisitor.cpp | 26 +++++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'tests') diff --git a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp index 8dfda0eea..66f67e08a 100644 --- a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp +++ b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp @@ -454,7 +454,7 @@ private Q_SLOTS: simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; - indexData.resize(sizeof(uint) * 3 * 4); + indexData.resize(sizeof(uint) * 4 * 4); uint *iDataPtr = reinterpret_cast(indexData.data()); iDataPtr[0] = 0; iDataPtr[1] = 1; @@ -468,6 +468,10 @@ private Q_SLOTS: iDataPtr[9] = 4; iDataPtr[10] = 3; iDataPtr[11] = 2; + iDataPtr[12] = static_cast(-1); + iDataPtr[13] = 0; + iDataPtr[14] = 1; + iDataPtr[15] = 2; indexDataBuffer->setData(indexData); Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); @@ -486,7 +490,7 @@ private Q_SLOTS: indexAttribute->setBuffer(indexDataBuffer.data()); indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt); - indexAttribute->setCount(3*4); + indexAttribute->setCount(4*4); indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute); geometry->addAttribute(positionAttribute.data()); @@ -494,6 +498,8 @@ private Q_SLOTS: geometryRenderer->setGeometry(geometry); geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleStrip); + geometryRenderer->setPrimitiveRestartEnabled(true); + geometryRenderer->setRestartIndexValue(-1); Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); @@ -516,7 +522,7 @@ private Q_SLOTS: visitor.apply(backendRenderer, Qt3DCore::QNodeId()); // THEN - QVERIFY(visitor.triangleCount() == 8); + QCOMPARE(visitor.triangleCount(), 9U); QVERIFY(visitor.verifyTriangle(0, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1))); QVERIFY(visitor.verifyTriangle(1, 3,2,1, Vector3D(0,0,1), Vector3D(0,1,0), Vector3D(1,0,0))); QVERIFY(visitor.verifyTriangle(2, 4,3,2, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(0,1,0))); @@ -525,6 +531,7 @@ private Q_SLOTS: QVERIFY(visitor.verifyTriangle(5, 4,0,1, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(1,0,0))); QVERIFY(visitor.verifyTriangle(6, 3,4,0, Vector3D(0,0,1), Vector3D(1,0,0), Vector3D(0,0,1))); QVERIFY(visitor.verifyTriangle(7, 2,3,4, Vector3D(0,1,0), Vector3D(0,0,1), Vector3D(1,0,0))); + QVERIFY(visitor.verifyTriangle(8, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1))); } void testVisitTriangleFan() @@ -643,7 +650,7 @@ private Q_SLOTS: simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; - indexData.resize(sizeof(uint) * 3 * 2); + indexData.resize(sizeof(uint) * 10); uint *iDataPtr = reinterpret_cast(indexData.data()); iDataPtr[0] = 0; iDataPtr[1] = 1; @@ -651,6 +658,10 @@ private Q_SLOTS: iDataPtr[3] = 3; iDataPtr[4] = 4; iDataPtr[5] = 5; + iDataPtr[6] = static_cast(-1); + iDataPtr[7] = 0; + iDataPtr[8] = 1; + iDataPtr[9] = 2; indexDataBuffer->setData(indexData); Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); @@ -669,7 +680,7 @@ private Q_SLOTS: indexAttribute->setBuffer(indexDataBuffer.data()); indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt); - indexAttribute->setCount(3*2); + indexAttribute->setCount(10); indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute); geometry->addAttribute(positionAttribute.data()); @@ -677,6 +688,8 @@ private Q_SLOTS: geometryRenderer->setGeometry(geometry); geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleFan); + geometryRenderer->setPrimitiveRestartEnabled(true); + geometryRenderer->setRestartIndexValue(-1); Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); @@ -699,11 +712,12 @@ private Q_SLOTS: visitor.apply(backendRenderer, Qt3DCore::QNodeId()); // THEN - QVERIFY(visitor.triangleCount() == 4); + QCOMPARE(visitor.triangleCount(), 5U); QVERIFY(visitor.verifyTriangle(0, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1))); QVERIFY(visitor.verifyTriangle(1, 3,2,0, Vector3D(0,0,1), Vector3D(0,1,0), Vector3D(0,0,1))); QVERIFY(visitor.verifyTriangle(2, 4,3,0, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(0,0,1))); QVERIFY(visitor.verifyTriangle(3, 5,4,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1))); + QVERIFY(visitor.verifyTriangle(4, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1))); } void testVisitTrianglesAdjacency() -- cgit v1.2.3 From e5f41230d2fa1cdc126785f396e5a57cee728341 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 10 Dec 2019 14:44:08 +0100 Subject: Skip shouldNotCrashInNormalStartupShutdownSequence The test is flaky on macOS 10.12 and 10.13. As it usually times out, a blacklist entry won't help. Blacklisting merely ignores the result, but doesn't prevent the test watchdog from killing the process. Task-number: QTBUG-80660 Change-Id: I6aec979e7437700e4e6596241f135622d99fd3be Reviewed-by: Simon Hausmann --- tests/auto/core/qaspectengine/tst_qaspectengine.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tests') diff --git a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp index 244077d46..2f16bf7c6 100644 --- a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp +++ b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp @@ -146,6 +146,10 @@ private Q_SLOTS: void shouldNotCrashInNormalStartupShutdownSequence() { +#ifdef Q_OS_MACOS + QSKIP("Test frequently times out. See QTBUG-80660."); +#endif + // GIVEN // An initialized aspect engine... QAspectEngine engine; -- cgit v1.2.3 From ecd193d7b5788fca8b478a02068060a078dc5738 Mon Sep 17 00:00:00 2001 From: Mike Krus Date: Mon, 9 Dec 2019 15:10:53 +0000 Subject: Fix picking with primitive restart for line loops Previous fix was not closing the loop on every primitive, just the last one. Task-number: QTBUG-71919 Change-Id: I22d52258477b0c4777118ee36a0b3868da982885 Reviewed-by: Volker Enderlein Reviewed-by: Paul Lemire --- .../render/segmentvisitor/tst_segmentvisitor.cpp | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'tests') diff --git a/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp index 4db12136a..fc65d0854 100644 --- a/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp +++ b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp @@ -426,12 +426,15 @@ private Q_SLOTS: simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; - indexData.resize(sizeof(uint) * 2 * 4); + indexData.resize(sizeof(uint) * 7); uint *iDataPtr = reinterpret_cast(indexData.data()); iDataPtr[0] = 0; iDataPtr[1] = 1; iDataPtr[2] = 2; iDataPtr[3] = 3; + iDataPtr[4] = static_cast(-1); + iDataPtr[5] = 0; + iDataPtr[6] = 1; indexDataBuffer->setData(indexData); Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); @@ -450,7 +453,7 @@ private Q_SLOTS: indexAttribute->setBuffer(indexDataBuffer.data()); indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt); - indexAttribute->setCount(4); + indexAttribute->setCount(7); indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute); geometry->addAttribute(positionAttribute.data()); @@ -458,6 +461,8 @@ private Q_SLOTS: geometryRenderer->setGeometry(geometry); geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineStrip); + geometryRenderer->setPrimitiveRestartEnabled(true); + geometryRenderer->setRestartIndexValue(-1); Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); @@ -480,10 +485,11 @@ private Q_SLOTS: visitor.apply(backendRenderer, Qt3DCore::QNodeId()); // THEN - QCOMPARE(visitor.segmentCount(), uint(3)); + QCOMPARE(visitor.segmentCount(), uint(4)); QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0))); QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0))); QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0))); + QVERIFY(visitor.verifySegment(3, 0,1, Vector3D(0,0,0), Vector3D(1,0,0))); } void testVisitLineLoop() @@ -588,12 +594,16 @@ private Q_SLOTS: simulateInitializationSync(dataBuffer.data(), backendBuffer); QByteArray indexData; - indexData.resize(sizeof(uint) * 2 * 4); + indexData.resize(sizeof(uint) * 8); uint *iDataPtr = reinterpret_cast(indexData.data()); iDataPtr[0] = 0; iDataPtr[1] = 1; iDataPtr[2] = 2; iDataPtr[3] = 3; + iDataPtr[4] = static_cast(-1); + iDataPtr[5] = 0; + iDataPtr[6] = 1; + iDataPtr[7] = 2; indexDataBuffer->setData(indexData); Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id()); @@ -612,7 +622,7 @@ private Q_SLOTS: indexAttribute->setBuffer(indexDataBuffer.data()); indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt); - indexAttribute->setCount(4); + indexAttribute->setCount(8); indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute); geometry->addAttribute(positionAttribute.data()); @@ -620,6 +630,8 @@ private Q_SLOTS: geometryRenderer->setGeometry(geometry); geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop); + geometryRenderer->setPrimitiveRestartEnabled(true); + geometryRenderer->setRestartIndexValue(-1); Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id()); backendAttribute->setRenderer(&renderer); @@ -642,11 +654,14 @@ private Q_SLOTS: visitor.apply(backendRenderer, Qt3DCore::QNodeId()); // THEN - QCOMPARE(visitor.segmentCount(), uint(4)); + QCOMPARE(visitor.segmentCount(), uint(7)); QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0))); QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0))); QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0))); QVERIFY(visitor.verifySegment(3, 3,0, Vector3D(0,1,0), Vector3D(0,0,0))); + QVERIFY(visitor.verifySegment(4, 0,1, Vector3D(0,0,0), Vector3D(1,0,0))); + QVERIFY(visitor.verifySegment(5, 1,2, Vector3D(1,0,0), Vector3D(1,1,0))); + QVERIFY(visitor.verifySegment(6, 2,0, Vector3D(1,1,0), Vector3D(0,0,0))); } void testVisitLineAdjacency() -- cgit v1.2.3