diff options
Diffstat (limited to 'tests')
66 files changed, 973 insertions, 844 deletions
diff --git a/tests/auto/animation/animationutils/tst_animationutils.cpp b/tests/auto/animation/animationutils/tst_animationutils.cpp index 385398bd1..05558192d 100644 --- a/tests/auto/animation/animationutils/tst_animationutils.cpp +++ b/tests/auto/animation/animationutils/tst_animationutils.cpp @@ -38,7 +38,6 @@ #include <Qt3DAnimation/private/additiveclipblend_p.h> #include <Qt3DAnimation/private/lerpclipblend_p.h> #include <Qt3DAnimation/private/managers_p.h> -#include <Qt3DCore/qpropertyupdatedchange.h> #include <QtGui/qvector2d.h> #include <QtGui/qvector3d.h> #include <QtGui/qvector4d.h> @@ -57,7 +56,6 @@ Q_DECLARE_METATYPE(Clock *) Q_DECLARE_METATYPE(ChannelMapper *) Q_DECLARE_METATYPE(AnimationClip *) Q_DECLARE_METATYPE(QVector<MappingData>) -Q_DECLARE_METATYPE(QVector<Qt3DCore::QPropertyUpdatedChangePtr>) Q_DECLARE_METATYPE(Channel) Q_DECLARE_METATYPE(AnimatorEvaluationData) Q_DECLARE_METATYPE(ClipEvaluationData) @@ -1047,7 +1045,7 @@ private Q_SLOTS: mapping.type = static_cast<int>(QVariant::Vector3D); mapping.channelIndices = QVector<int>() << 0 << 1 << 2; mapping.callback = &callback; - mapping.callbackFlags = 0; + mapping.callbackFlags = {}; mappingData.push_back(mapping); channelResults = QVector<float>() << 1.0f << 2.0f << 3.0f; @@ -1073,7 +1071,7 @@ private Q_SLOTS: mapping.type = static_cast<int>(QVariant::Double); mapping.channelIndices = QVector<int>() << 0; mapping.callback = &callback; - mapping.callbackFlags = 0; + mapping.callbackFlags = {}; mappingData.push_back(mapping); channelResults = QVector<float>() << 1.0f; diff --git a/tests/auto/core/common/qbackendnodetester.cpp b/tests/auto/core/common/qbackendnodetester.cpp index a2685f556..13f4683d9 100644 --- a/tests/auto/core/common/qbackendnodetester.cpp +++ b/tests/auto/core/common/qbackendnodetester.cpp @@ -56,20 +56,29 @@ void QBackendNodeTester::simulateInitialization(QNode *frontend, QBackendNode *b { Q_ASSERT(frontend); Q_ASSERT(backend); + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED const auto change = frontend->createNodeCreationChange(); backend->setPeerId(change->subjectId()); backend->setEnabled(change->isNodeEnabled()); backend->initializeFromPeer(change); + QT_WARNING_POP } void QBackendNodeTester::sceneChangeEvent(QBackendNode *backend, const Qt3DCore::QSceneChangePtr &e) { + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED backend->sceneChangeEvent(e); + QT_WARNING_POP } QNodeCreatedChangeBasePtr QBackendNodeTester::creationChange(QNode *frontend) const { + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED return frontend->createNodeCreationChange(); + QT_WARNING_POP } } // namespace Qt3DCore diff --git a/tests/auto/core/common/testpostmanarbiter.cpp b/tests/auto/core/common/testpostmanarbiter.cpp index 5869cbad3..f0c362744 100644 --- a/tests/auto/core/common/testpostmanarbiter.cpp +++ b/tests/auto/core/common/testpostmanarbiter.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include "testpostmanarbiter.h" #include <Qt3DCore/private/qnode_p.h> diff --git a/tests/auto/core/common/testpostmanarbiter.h b/tests/auto/core/common/testpostmanarbiter.h index 6649c7bbe..e927c2489 100644 --- a/tests/auto/core/common/testpostmanarbiter.h +++ b/tests/auto/core/common/testpostmanarbiter.h @@ -28,7 +28,6 @@ #include <Qt3DCore/private/qpostman_p.h> #include <Qt3DCore/private/qchangearbiter_p.h> -#include <Qt3DCore/private/qscenechange_p.h> QT_BEGIN_NAMESPACE @@ -71,7 +70,10 @@ public: void setArbiterOnNode(Qt3DCore::QNode *node); void addDirtyFrontEndNode(Qt3DCore::QNode *node) final; + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED void addDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QNode *subNode, const char *property, Qt3DCore::ChangeFlag change) final; + QT_WARNING_POP void removeDirtyFrontEndNode(Qt3DCore::QNode *node) final; private: diff --git a/tests/auto/core/core.pro b/tests/auto/core/core.pro index 001b947d5..994c6206c 100644 --- a/tests/auto/core/core.pro +++ b/tests/auto/core/core.pro @@ -25,10 +25,11 @@ qtConfig(private_tests) { threadpooler \ qpostman \ vector4d_base \ - vector3d_base + vector3d_base \ + aspectcommanddebugger \ + qscheduler QT_FOR_CONFIG += 3dcore-private - qtConfig(qt3d-profile-jobs): SUBDIRS += aspectcommanddebugger qtConfig(qt3d-simd-sse2) { SUBDIRS += \ vector4d_sse \ diff --git a/tests/auto/core/nodes/tst_nodes.cpp b/tests/auto/core/nodes/tst_nodes.cpp index 43d9f7778..aac8638c1 100644 --- a/tests/auto/core/nodes/tst_nodes.cpp +++ b/tests/auto/core/nodes/tst_nodes.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/qnode.h> #include <Qt3DCore/qentity.h> @@ -40,7 +44,6 @@ #include <Qt3DCore/qpropertynoderemovedchange.h> #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> #include <Qt3DCore/private/qaspectengine_p.h> -#include <Qt3DCore/private/qscenechange_p.h> #include <Qt3DCore/private/qaspectengine_p.h> #include <private/qabstractaspect_p.h> #include <private/qpostman_p.h> @@ -531,7 +534,7 @@ public: void syncDirtyFrontEndNode(Qt3DCore::QNode *node, Qt3DCore::QBackendNode *backend, bool firstTime) const override { - Q_UNUSED(backend) + Q_UNUSED(backend); auto q = q_func(); if (firstTime) q->allNodes.insert(node->id(), node); @@ -542,11 +545,10 @@ public: TestAspect::TestAspect(QObject *parent) : TestAspect(*new TestAspectPrivate, parent) { - Q_D(TestAspect); - d->registerBackendType<Qt3DCore::QEntity, true>(QSharedPointer<TestFunctor>::create(this)); - d->registerBackendType<MyQEntity, true>(QSharedPointer<TestFunctor>::create(this)); - d->registerBackendType<MyQNode, true>(QSharedPointer<TestFunctor>::create(this)); - d->registerBackendType<Qt3DCore::QNode, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<Qt3DCore::QEntity, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQEntity, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<MyQNode, true>(QSharedPointer<TestFunctor>::create(this)); + registerBackendType<Qt3DCore::QNode, true>(QSharedPointer<TestFunctor>::create(this)); } TestAspect::TestAspect(TestAspectPrivate &dd, QObject *parent) diff --git a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp index 2f16bf7c6..48443a66f 100644 --- a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp +++ b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp @@ -183,7 +183,7 @@ private Q_SLOTS: // WHEN // we set an empty/null scene root... engine.setRootEntity(QEntityPtr()); - QTimer::singleShot(1000, &eventLoop, SLOT(quit())); + QTimer::singleShot(600, &eventLoop, SLOT(quit())); // ...and allow events to process... eventLoop.exec(); @@ -247,21 +247,21 @@ private Q_SLOTS: // THEN QCOMPARE(engine.executeCommand("list aspects").toString(), - QString("Loaded aspects:\n * fake")); + QString("fake")); // WHEN engine.registerAspect("otherfake"); // THEN QCOMPARE(engine.executeCommand("list aspects").toString(), - QString("Loaded aspects:\n * fake\n * otherfake")); + QString("fake\notherfake")); // WHEN engine.registerAspect(new FakeAspect3); // THEN QCOMPARE(engine.executeCommand("list aspects").toString(), - QString("Loaded aspects:\n * fake\n * otherfake\n * <unnamed>")); + QString("fake\notherfake\n<unnamed>")); } void shouldDelegateCommandsToAspects() diff --git a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp index e54193398..3e9b24408 100644 --- a/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp +++ b/tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/private/qobserverinterface_p.h> #include <Qt3DCore/private/qobservableinterface_p.h> diff --git a/tests/auto/core/qcircularbuffer/tst_qcircularbuffer.cpp b/tests/auto/core/qcircularbuffer/tst_qcircularbuffer.cpp index 4bc04fafa..7d8f6eed6 100644 --- a/tests/auto/core/qcircularbuffer/tst_qcircularbuffer.cpp +++ b/tests/auto/core/qcircularbuffer/tst_qcircularbuffer.cpp @@ -166,13 +166,13 @@ void tst_QCircularBuffer::construction() QVERIFY(circ4.size() == 2); QVERIFY(circ4.at(0) == 10); QVERIFY(circ4.at(1) == 10); - QVERIFY(circ4.refCount().load() == 1); + QVERIFY(circ4.refCount().loadRelaxed() == 1); // Copy construct from circ4. Both circ4 and circ5 should now have a // refCount() of 2 since we are using implicit sharing. QCircularBuffer<int> circ5(circ4); - QVERIFY(circ4.refCount().load() == 2); - QVERIFY(circ5.refCount().load() == 2); + QVERIFY(circ4.refCount().loadRelaxed() == 2); + QVERIFY(circ5.refCount().loadRelaxed() == 2); QVERIFY(circ5.capacity() == 5); QVERIFY(circ5.size() == 2); QVERIFY(circ5.at(0) == 10); @@ -199,7 +199,7 @@ void tst_QCircularBuffer::destruction() cir->append(MyComplexType(2)); cir->append(MyComplexType(3)); cir->remove(0); - Q_UNUSED(cir); + Q_UNUSED(cir) // Check that the dtor was called 2 times fewer than the constructor. // At this stage will still have 2 items in the circular buffer. @@ -208,7 +208,7 @@ void tst_QCircularBuffer::destruction() // Destroy the circular buffer and check that the active count // is 0. (Same number of calls to dtor as have been made to the constructors) delete cir; - cir = 0; + cir = nullptr; QVERIFY(MyComplexType::ms_activeCount == 0); } @@ -273,7 +273,7 @@ void tst_QCircularBuffer::clear() circ.clear(); QVERIFY(circ.size() == 0); QVERIFY(circ.capacity() == 3); - QVERIFY(circ.refCount().load() == 1); + QVERIFY(circ.refCount().loadRelaxed() == 1); } void tst_QCircularBuffer::contains() diff --git a/tests/auto/core/qentity/tst_qentity.cpp b/tests/auto/core/qentity/tst_qentity.cpp index 7770a2632..7b41c9783 100644 --- a/tests/auto/core/qentity/tst_qentity.cpp +++ b/tests/auto/core/qentity/tst_qentity.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QtTest> #include <Qt3DCore/qentity.h> #include <Qt3DCore/private/qentity_p.h> diff --git a/tests/auto/core/qpostman/tst_qpostman.cpp b/tests/auto/core/qpostman/tst_qpostman.cpp index f548d38fa..d0dfa0f49 100644 --- a/tests/auto/core/qpostman/tst_qpostman.cpp +++ b/tests/auto/core/qpostman/tst_qpostman.cpp @@ -86,227 +86,6 @@ private Q_SLOTS: QCOMPARE(QPostmanPrivate::get(&postman)->m_scene, &scene); } - void checkSceneChangeEvent() - { - // GIVEN - QScopedPointer<QScene> scene(new QScene); - QPostman postman; - TestArbiter arbiter; - QNode rootNode; - NodeChangeReceiver *receiverNode = new NodeChangeReceiver(); - - QNodePrivate::get(&rootNode)->m_scene = scene.data(); - scene->setArbiter(&arbiter); - postman.setScene(scene.data()); - // Setting the parent (which has a scene) adds the node into the observable lookup - // table of the scene which is needed by the postman to distribute changes - static_cast<QNode *>(receiverNode)->setParent(&rootNode); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(receiverNode->hasReceivedChange(), false); - QCOMPARE(QNodePrivate::get(receiverNode)->m_scene, scene.data()); - - // WHEN - QPropertyUpdatedChangePtr updateChange(new QPropertyUpdatedChange(receiverNode->id())); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - postman.sceneChangeEvent(updateChange); - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(receiverNode->hasReceivedChange(), true); - } - - void checkNotifyBackend() - { - // GIVEN - QScopedPointer<QScene> scene(new QScene); - QPostman postman; - TestArbiter arbiter; - - scene->setArbiter(&arbiter); - postman.setScene(scene.data()); - - // THEN - QCOMPARE(arbiter.events.size(), 0); - - // WHEN - QPropertyUpdatedChangePtr updateChange(new QPropertyUpdatedChange(QNodeId())); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - postman.notifyBackend(updateChange); - - QCoreApplication::processEvents(); - - // THEN - QCOMPARE(arbiter.events.size(), 1); - } - - void checkShouldNotifyFrontend() - { - // GIVEN - QScopedPointer<QScene> scene(new QScene); - QPostman postman; - TestArbiter arbiter; - QNode rootNode; - NodeChangeReceiver *receiverNode = new NodeChangeReceiver(); - - QNodePrivate::get(&rootNode)->m_scene = scene.data(); - scene->setArbiter(&arbiter); - postman.setScene(scene.data()); - // Setting the parent (which has a scene) adds the node into the observable lookup - // table of the scene which is needed by the postman to distribute changes - static_cast<QNode *>(receiverNode)->setParent(&rootNode); - QCoreApplication::processEvents(); - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - - - // THEN -> we do track properties by default QNode::DefaultTrackMode - // (unless marked as an intermediate change) - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - - { - // WHEN - receiverNode->setDefaultPropertyTrackingMode(QNode::TrackAllValues); - - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - QPropertyUpdatedChangeBasePrivate::get(updateChange.data())->m_isIntermediate - = true; - - // THEN -> we do track properties marked as intermediate when - // using TrackAllPropertiesMode - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - - { - // GIVEN - receiverNode->setDefaultPropertyTrackingMode(QNode::DontTrackValues); - receiverNode->setPropertyTracking(QStringLiteral("vette"), Qt3DCore::QNode::TrackAllValues); - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - QPropertyUpdatedChangeBasePrivate::get(updateChange.data())->m_isIntermediate - = true; - - // THEN -> we don't track properties by default, unless named when - // using TrackNamedPropertiesMode - QCOMPARE(postman.shouldNotifyFrontend(updateChange), false); - } - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("vette"); - QPropertyUpdatedChangeBasePrivate::get(updateChange.data())->m_isIntermediate - = true; - - // THEN - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - } - - { - // GIVEN - receiverNode->setPropertyTracking(QStringLiteral("vette"), Qt3DCore::QNode::TrackAllValues); - receiverNode->setDefaultPropertyTrackingMode(QNode::TrackAllValues); - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - - // THEN -> we don't track properties by default - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("vette"); - - // THEN -> we don't track properties by default - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - } - - { - // GIVEN - receiverNode->clearPropertyTrackings(); - receiverNode->setDefaultPropertyTrackingMode(QNode::TrackFinalValues); - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - - // THEN -> we do track properties by default, unless marked as intermediate - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - - { - // WHEN - auto addedChange - = QPropertyNodeAddedChangePtr::create(receiverNode->id(), receiverNode); - - // THEN -> only QPropertyUpdatedChangePtr are filtered - QCOMPARE(postman.shouldNotifyFrontend(addedChange), true); - } - { - // WHEN - auto removedChange - = QPropertyNodeRemovedChangePtr::create(receiverNode->id(), receiverNode); - - // THEN -> only QPropertyUpdatedChangePtr are filtered - QCOMPARE(postman.shouldNotifyFrontend(removedChange), true); - } - } - - { - // GIVEN - receiverNode->clearPropertyTrackings(); - receiverNode->setDefaultPropertyTrackingMode(QNode::TrackFinalValues); - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - QPropertyUpdatedChangeBasePrivate::get(updateChange.data())->m_isIntermediate - = true; - - // THEN -> we don't track intermediate properties by default - QCOMPARE(postman.shouldNotifyFrontend(updateChange), false); - } - - { - // WHEN - auto updateChange = QPropertyUpdatedChangePtr::create(receiverNode->id()); - updateChange->setValue(1584); - updateChange->setPropertyName("someName"); - - // THEN - QCOMPARE(postman.shouldNotifyFrontend(updateChange), true); - } - - } - } - }; QTEST_MAIN(tst_QPostman) diff --git a/tests/auto/core/qscene/tst_qscene.cpp b/tests/auto/core/qscene/tst_qscene.cpp index ecc72e992..eb6a8c5ec 100644 --- a/tests/auto/core/qscene/tst_qscene.cpp +++ b/tests/auto/core/qscene/tst_qscene.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QtTest> #include <Qt3DCore/private/qscene_p.h> #include <Qt3DCore/qnode.h> diff --git a/tests/auto/core/qscheduler/qscheduler.pro b/tests/auto/core/qscheduler/qscheduler.pro new file mode 100644 index 000000000..078716116 --- /dev/null +++ b/tests/auto/core/qscheduler/qscheduler.pro @@ -0,0 +1,7 @@ +TARGET = tst_qscheduler +CONFIG += testcase +TEMPLATE = app + +SOURCES += tst_qscheduler.cpp + +QT += testlib 3dcore 3dcore-private diff --git a/tests/auto/core/qscheduler/tst_qscheduler.cpp b/tests/auto/core/qscheduler/tst_qscheduler.cpp new file mode 100644 index 000000000..d1afb5aac --- /dev/null +++ b/tests/auto/core/qscheduler/tst_qscheduler.cpp @@ -0,0 +1,201 @@ +/**************************************************************************** +** +** Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QtTest> +#include <Qt3DCore/qaspectjob.h> +#include <Qt3DCore/qabstractaspect.h> +#include <Qt3DCore/private/qaspectmanager_p.h> +#include <Qt3DCore/private/qscheduler_p.h> +#include <private/qabstractaspect_p.h> +#include <private/qaspectjob_p.h> + +using namespace Qt3DCore; + +class JobPrivate : public QAspectJobPrivate +{ + bool m_postFrameCalled = false; + + +public: + // QAspectJobPrivate interface + void postFrame(QAspectManager *aspectManager) + { + Q_ASSERT(aspectManager); + m_postFrameCalled = true; + } + + bool postFrameCalled() const + { + return m_postFrameCalled; + } +}; + +class Job : public QAspectJob +{ + bool m_wasExecuted = false; + +public: + Job() + : QAspectJob(*new JobPrivate) + {} + + bool wasExecuted() const + { + return m_wasExecuted; + } + + bool postFrameCalled() const + { + Q_D(const Job); + return d->postFrameCalled(); + } + + void run() override + { + m_wasExecuted = true; + } + +private: + Q_DECLARE_PRIVATE(Job) +}; +using JobPtr = QSharedPointer<Job>; + +class AspectPrivate : public QAbstractAspectPrivate +{ + bool m_jobsDoneCalled = false; + bool m_frameDoneCalled = false; + +public: + + bool jobsDoneCalled() const + { + return m_jobsDoneCalled; + } + + bool frameDoneCalled() const + { + return m_frameDoneCalled; + } + + // QAspectJobProviderInterface interface + void jobsDone() override + { + m_jobsDoneCalled = true; + } + + void frameDone() override + { + m_frameDoneCalled = true; + } +}; + +class Aspect : public QAbstractAspect +{ + Q_OBJECT + +public: + Aspect() + : QAbstractAspect(*new AspectPrivate) + {} + + JobPtr firstJob() const { return m_first; } + JobPtr secondJob() const { return m_second; } + +private: + // QAbstractAspect interface + QVector<QAspectJobPtr> jobsToExecute(qint64) + { + return { m_first, m_second }; + } + + JobPtr m_first = JobPtr::create(); + JobPtr m_second = JobPtr::create(); + Q_DECLARE_PRIVATE(Aspect) +}; + +class tst_QScheduler : public QObject +{ + Q_OBJECT +private Q_SLOTS: + + void checkInitialState() + { + // GIVEN + QScheduler scheduler; + + // THEN + QVERIFY(scheduler.aspectManager() == nullptr); + + // WHEN + QAspectManager m; + scheduler.setAspectManager(&m); + + // THEN + QCOMPARE(scheduler.aspectManager(), &m); + } + + void checkScheduleAndWaitForFrameAspectJobs() + { + // GIVEN + QScheduler scheduler; + QAspectManager manager; + Aspect aspect; + AspectPrivate *aspectPriv = static_cast<AspectPrivate *>(QObjectPrivate::get(&aspect)); + + manager.registerAspect(&aspect); + scheduler.setAspectManager(&manager); + + // THEN + const JobPtr first = aspect.firstJob(); + const JobPtr second = aspect.secondJob(); + QVERIFY(!aspectPriv->jobsDoneCalled()); + QVERIFY(!aspectPriv->frameDoneCalled()); + QVERIFY(!first->wasExecuted()); + QVERIFY(!second->wasExecuted()); + QVERIFY(!first->postFrameCalled()); + QVERIFY(!second->postFrameCalled()); + + // WHEN + const int count = scheduler.scheduleAndWaitForFrameAspectJobs(0); + + // THEN + QCOMPARE(count, 2); + QVERIFY(first->wasExecuted()); + QVERIFY(second->wasExecuted()); + QVERIFY(first->postFrameCalled()); + QVERIFY(second->postFrameCalled()); + QVERIFY(aspectPriv->jobsDoneCalled()); + QVERIFY(!aspectPriv->frameDoneCalled()); + + manager.unregisterAspect(&aspect); + } +}; + +QTEST_MAIN(tst_QScheduler) + +#include "tst_qscheduler.moc" diff --git a/tests/auto/core/qservicelocator/tst_qservicelocator.cpp b/tests/auto/core/qservicelocator/tst_qservicelocator.cpp index cde9834b4..40f0610df 100644 --- a/tests/auto/core/qservicelocator/tst_qservicelocator.cpp +++ b/tests/auto/core/qservicelocator/tst_qservicelocator.cpp @@ -52,11 +52,8 @@ class DummySystemInfoService : public QSystemInformationService { public: DummySystemInfoService() - : QSystemInformationService(QStringLiteral("Dummy System Information Service")) + : QSystemInformationService(nullptr, QStringLiteral("Dummy System Information Service")) {} - - QStringList aspectNames() const final { return QStringList(); } - int threadPoolThreadCount() const final { return 4; } }; @@ -90,8 +87,8 @@ void tst_QServiceLocator::defaultServices() QSystemInformationService *sysInfo = locator.systemInformation(); QVERIFY(sysInfo != nullptr); - QVERIFY(sysInfo->description() == QStringLiteral("Null System Information Service")); - QVERIFY(sysInfo->threadPoolThreadCount() == 0); + QVERIFY(sysInfo->description() == QStringLiteral("Default System Information Service")); + QVERIFY(sysInfo->threadPoolThreadCount() != 0); } void tst_QServiceLocator::addRemoveDefaultService() @@ -105,7 +102,6 @@ void tst_QServiceLocator::addRemoveDefaultService() // Get the service from the locator and check it works as expected QSystemInformationService *service = locator.systemInformation(); QVERIFY(service == dummy.data()); - QVERIFY(service->threadPoolThreadCount() == 4); // Ensure the other default services work QOpenGLInformationService *glInfo = locator.openGLInformation(); @@ -118,7 +114,7 @@ void tst_QServiceLocator::addRemoveDefaultService() QVERIFY(locator.serviceCount() == QServiceLocator::DefaultServiceCount); // Check the dummy service still exists - QVERIFY(dummy->threadPoolThreadCount() == 4); + QVERIFY(!dummy.isNull()); } void tst_QServiceLocator::addRemoveUserService() @@ -138,8 +134,8 @@ void tst_QServiceLocator::addRemoveUserService() // Ensure the default services work QSystemInformationService *sysInfo = locator.systemInformation(); QVERIFY(sysInfo != nullptr); - QVERIFY(sysInfo->description() == QStringLiteral("Null System Information Service")); - QVERIFY(sysInfo->threadPoolThreadCount() == 0); + QVERIFY(sysInfo->description() == QStringLiteral("Default System Information Service")); + QVERIFY(sysInfo->threadPoolThreadCount() != 0); // Remove custom service locator.unregisterServiceProvider(dummy->type()); diff --git a/tests/auto/core/qtransform/tst_qtransform.cpp b/tests/auto/core/qtransform/tst_qtransform.cpp index 37848ffd6..18a906e4c 100644 --- a/tests/auto/core/qtransform/tst_qtransform.cpp +++ b/tests/auto/core/qtransform/tst_qtransform.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QtTest> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/qtransform.h> diff --git a/tests/auto/core/threadpooler/tst_threadpooler.cpp b/tests/auto/core/threadpooler/tst_threadpooler.cpp index a656c25c1..289f0b103 100644 --- a/tests/auto/core/threadpooler/tst_threadpooler.cpp +++ b/tests/auto/core/threadpooler/tst_threadpooler.cpp @@ -182,7 +182,7 @@ void massTestFunction(QVector3D *data) void tst_ThreadPooler::initTestCase() { - m_jobManager = new JobManager(this); + m_jobManager = new JobManager(nullptr); } void tst_ThreadPooler::cleanupTestCase() @@ -195,13 +195,13 @@ void tst_ThreadPooler::defaultPerThread() // GIVEN QAtomicInt callCounter; int maxThreadCount = QThread::idealThreadCount(); - callCounter.store(0); + callCounter.storeRelaxed(0); // WHEN m_jobManager->waitForPerThreadFunction(perThreadFunction, &callCounter); // THEN - QVERIFY(maxThreadCount == callCounter.load()); + QVERIFY(maxThreadCount == callCounter.loadRelaxed()); } void tst_ThreadPooler::defaultAspectQueue() @@ -210,7 +210,7 @@ void tst_ThreadPooler::defaultAspectQueue() QAtomicInt callCounter; int value = 0; // Not used in this test QVector<QSharedPointer<Qt3DCore::QAspectJob> > jobList; - callCounter.store(0); + callCounter.storeRelaxed(0); const int jobCount = 5; // WHEN @@ -223,7 +223,7 @@ void tst_ThreadPooler::defaultAspectQueue() m_jobManager->waitForAllJobs(); // THEN - QVERIFY(jobCount == callCounter.load()); + QVERIFY(jobCount == callCounter.loadRelaxed()); } /* @@ -236,7 +236,7 @@ void tst_ThreadPooler::doubleAspectQueue() QAtomicInt callCounter; int value = 0; // Not used in this test QVector<QSharedPointer<Qt3DCore::QAspectJob> > jobList; - callCounter.store(0); + callCounter.storeRelaxed(0); const int jobCount = 3; // WHEN @@ -258,7 +258,7 @@ void tst_ThreadPooler::doubleAspectQueue() m_jobManager->waitForAllJobs(); // THEN - QVERIFY(jobCount * 2 == callCounter.load()); + QVERIFY(jobCount * 2 == callCounter.loadRelaxed()); } /* @@ -335,7 +335,7 @@ public: quint64 globalAtomicValue() const { - return m_globalAtomic.load(); + return m_globalAtomic.loadRelaxed(); } private: diff --git a/tests/auto/coretest/qbackendnodetester.cpp b/tests/auto/coretest/qbackendnodetester.cpp index be9767828..bd5fb85d1 100644 --- a/tests/auto/coretest/qbackendnodetester.cpp +++ b/tests/auto/coretest/qbackendnodetester.cpp @@ -57,15 +57,21 @@ void QBackendNodeTester::simulateInitialization(QNode *frontend, QBackendNode *b { Q_ASSERT(frontend); Q_ASSERT(backend); + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED const auto change = frontend->createNodeCreationChange(); backend->setPeerId(change->subjectId()); backend->setEnabled(change->isNodeEnabled()); backend->initializeFromPeer(change); + QT_WARNING_POP } void QBackendNodeTester::sceneChangeEvent(QBackendNode *backend, const Qt3DCore::QSceneChangePtr &e) { + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED backend->sceneChangeEvent(e); + QT_WARNING_POP } } // namespace Qt3DCore diff --git a/tests/auto/coretest/testpostmanarbiter.cpp b/tests/auto/coretest/testpostmanarbiter.cpp index d1263b8f7..d2e404809 100644 --- a/tests/auto/coretest/testpostmanarbiter.cpp +++ b/tests/auto/coretest/testpostmanarbiter.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include "testpostmanarbiter_p.h" #include <Qt3DCore/private/qnode_p.h> diff --git a/tests/auto/extras/common/geometrytesthelper.h b/tests/auto/extras/common/geometrytesthelper.h index 48e674cd9..5b04a078b 100644 --- a/tests/auto/extras/common/geometrytesthelper.h +++ b/tests/auto/extras/common/geometrytesthelper.h @@ -42,9 +42,12 @@ inline void generateGeometry(Qt3DRender::QGeometry &geometry) // Get all unique data generators from the buffers referenced by the attributes QHash<Qt3DRender::QBufferDataGeneratorPtr, Qt3DRender::QBuffer *> dataGenerators; for (const auto attribute : attributes) { + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED const auto dataGenerator = attribute->buffer()->dataGenerator(); if (!dataGenerators.contains(dataGenerator)) dataGenerators.insert(dataGenerator, attribute->buffer()); + QT_WARNING_POP } // Generate data for each buffer diff --git a/tests/auto/input/mousedevice/tst_mousedevice.cpp b/tests/auto/input/mousedevice/tst_mousedevice.cpp index f245e399d..95ae8de56 100644 --- a/tests/auto/input/mousedevice/tst_mousedevice.cpp +++ b/tests/auto/input/mousedevice/tst_mousedevice.cpp @@ -58,6 +58,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF()); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); } void checkInitializeFromPeer() @@ -85,6 +86,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF()); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.8f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); } { // WHEN @@ -125,6 +127,7 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF(400.0f, 400.0f)); QCOMPARE(backendMouseDevice.wasPressed(), true); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); // WHEN eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, @@ -147,12 +150,13 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.previousPos(), QPointF(600.0f, 600.0f)); QCOMPARE(backendMouseDevice.wasPressed(), true); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); // WHEN eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseButtonRelease, - QPointF(600.0f, 600.0f), - QPointF(600.0f, 600.0f), - QPointF(600.0f, 600.0f), + QPointF(800.0f, 800.0f), + QPointF(800.0f, 800.0f), + QPointF(800.0f, 800.0f), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); @@ -166,9 +170,61 @@ private Q_SLOTS: QCOMPARE(backendMouseDevice.mouseState().leftPressed, false); QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); - QCOMPARE(backendMouseDevice.previousPos(), QPointF(600.0f, 600.0f)); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(800.0f, 800.0f)); QCOMPARE(backendMouseDevice.wasPressed(), false); QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); + + // WHEN + eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, + QPointF(900.0f, 900.0f), + QPointF(900.0f, 900.0f), + QPointF(900.0f, 900.0f), + Qt::NoButton, + Qt::NoButton, + Qt::NoModifier); + + // THEN -> no axes update + backendMouseDevice.updateMouseEvents(eventList); + QCOMPARE(backendMouseDevice.mouseState().xAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().yAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wXAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wYAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().leftPressed, false); + QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); + QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(900.0f, 900.0f)); + QCOMPARE(backendMouseDevice.wasPressed(), false); + QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), false); + + + // WHEN + eventList = QList<QT_PREPEND_NAMESPACE(QMouseEvent)>() << QT_PREPEND_NAMESPACE(QMouseEvent)(QMouseEvent::MouseMove, + QPointF(1000.0f, 1000.0f), + QPointF(1000.0f, 1000.0f), + QPointF(1000.0f, 1000.0f), + Qt::NoButton, + Qt::NoButton, + Qt::NoModifier); + + Qt3DInput::QMouseDevice mouseDevice; + mouseDevice.setUpdateAxesContinuously(true); + backendMouseDevice.syncFromFrontEnd(&mouseDevice, false); + backendMouseDevice.updateMouseEvents(eventList); + + // THEN + QCOMPARE(backendMouseDevice.mouseState().xAxis, (1000.0f - 900.0f) * 0.1f); + QCOMPARE(backendMouseDevice.mouseState().yAxis, (900.0f - 1000.0f) * 0.1f); + QCOMPARE(backendMouseDevice.mouseState().wXAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().wYAxis, 0.0f); + QCOMPARE(backendMouseDevice.mouseState().leftPressed,false); + QCOMPARE(backendMouseDevice.mouseState().rightPressed, false); + QCOMPARE(backendMouseDevice.mouseState().centerPressed, false); + QCOMPARE(backendMouseDevice.previousPos(), QPointF(1000.0f, 1000.0f)); + QCOMPARE(backendMouseDevice.wasPressed(), false); + QCOMPARE(backendMouseDevice.sensitivity(), 0.1f); + QCOMPARE(backendMouseDevice.updateAxesContinuously(), true); } void checkMouseWheelState() @@ -241,6 +297,15 @@ private Q_SLOTS: // THEN QCOMPARE(backendMouseDevice.sensitivity(), newValue); } + { + // WHEN + const bool newValue = true; + mouseDevice.setUpdateAxesContinuously(newValue); + backendMouseDevice.syncFromFrontEnd(&mouseDevice, false); + + // THEN + QCOMPARE(backendMouseDevice.updateAxesContinuously(), newValue); + } } }; diff --git a/tests/auto/input/qmousedevice/tst_qmousedevice.cpp b/tests/auto/input/qmousedevice/tst_qmousedevice.cpp index fd2c8e603..6a8f39c71 100644 --- a/tests/auto/input/qmousedevice/tst_qmousedevice.cpp +++ b/tests/auto/input/qmousedevice/tst_qmousedevice.cpp @@ -50,6 +50,7 @@ private Q_SLOTS: // THEN QCOMPARE(mouseDevice.sensitivity(), 0.1f); + QCOMPARE(mouseDevice.updateAxesContinuously(), false); QCOMPARE(mouseDevice.axisCount(), 4); QCOMPARE(mouseDevice.buttonCount(), 3); QCOMPARE(mouseDevice.axisNames(), QStringList() @@ -96,6 +97,25 @@ private Q_SLOTS: QCOMPARE(mouseDevice.sensitivity(), newValue); QCOMPARE(spy.count(), 0); } + { + // WHEN + QSignalSpy spy(&mouseDevice, SIGNAL(updateAxesContinuouslyChanged(bool))); + const bool newValue = true; + mouseDevice.setUpdateAxesContinuously(newValue); + + // THEN + QVERIFY(spy.isValid()); + QCOMPARE(mouseDevice.updateAxesContinuously(), newValue); + QCOMPARE(spy.count(), 1); + + // WHEN + spy.clear(); + mouseDevice.setUpdateAxesContinuously(newValue); + + // THEN + QCOMPARE(mouseDevice.updateAxesContinuously(), newValue); + QCOMPARE(spy.count(), 0); + } } void checkCreationData() @@ -175,6 +195,31 @@ private Q_SLOTS: } + void checkUpdateAxesContinuouslyUpdate() + { + // GIVEN + TestArbiter arbiter; + Qt3DInput::QMouseDevice mouseDevice; + arbiter.setArbiterOnNode(&mouseDevice); + + { + // WHEN + mouseDevice.setUpdateAxesContinuously(true); + // THEN + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mouseDevice); + } + + { + // WHEN + mouseDevice.setSensitivity(true); + + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), &mouseDevice); + } + + } + }; QTEST_MAIN(tst_QMouseDevice) diff --git a/tests/auto/render/buffer/tst_buffer.cpp b/tests/auto/render/buffer/tst_buffer.cpp index fa1491914..5c2ae296d 100644 --- a/tests/auto/render/buffer/tst_buffer.cpp +++ b/tests/auto/render/buffer/tst_buffer.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <qbackendnodetester.h> #include <Qt3DRender/private/buffer_p.h> diff --git a/tests/auto/render/commons/testrenderer.cpp b/tests/auto/render/commons/testrenderer.cpp index 277b2b99b..5a36fecf2 100644 --- a/tests/auto/render/commons/testrenderer.cpp +++ b/tests/auto/render/commons/testrenderer.cpp @@ -30,11 +30,7 @@ QT_BEGIN_NAMESPACE -TestRenderer::TestRenderer() - : m_changes(0) - , m_managers(nullptr) -{ -} +TestRenderer::TestRenderer() = default; TestRenderer::~TestRenderer() { @@ -60,7 +56,7 @@ void TestRenderer::clearDirtyBits(Qt3DRender::Render::AbstractRenderer::BackendN void TestRenderer::resetDirty() { - m_changes = 0; + m_changes = {}; } QVariant TestRenderer::executeCommand(const QStringList &args) diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h index e1ee329f4..7b3e0a387 100644 --- a/tests/auto/render/commons/testrenderer.h +++ b/tests/auto/render/commons/testrenderer.h @@ -30,6 +30,7 @@ #define TESTRENDERER_H #include <Qt3DRender/private/abstractrenderer_p.h> +#include <Qt3DRender/private/resourceaccessor_p.h> QT_BEGIN_NAMESPACE @@ -43,32 +44,38 @@ public: API api() const override { return AbstractRenderer::OpenGL; } qint64 time() const override { return 0; } void setTime(qint64 time) override { Q_UNUSED(time); } - void setNodeManagers(Qt3DRender::Render::NodeManagers *m) override { m_managers = m; } + void setNodeManagers(Qt3DRender::Render::NodeManagers *m) override + { + m_managers = m; + m_resourceAccessor.reset(new Qt3DRender::Render::ResourceAccessor(this, m_managers)); + } void setServices(Qt3DCore::QServiceLocator *services) override { Q_UNUSED(services); } void setSurfaceExposed(bool exposed) override { Q_UNUSED(exposed); } + void setJobsInLastFrame(int jobsInLastFrame) override { Q_UNUSED(jobsInLastFrame) } Qt3DRender::Render::NodeManagers *nodeManagers() const override { return m_managers; } Qt3DCore::QServiceLocator *services() const override { return nullptr; } void initialize() override {} void shutdown() override {} void releaseGraphicsResources() override {} void render() override {} - void doRender(bool swapBuffers) override { Q_UNUSED(swapBuffers); } + void doRender(bool swapBuffers) override { Q_UNUSED(swapBuffers) } void cleanGraphicsResources() override {} bool isRunning() const override { return true; } bool shouldRender() const override { return true; } void skipNextFrame() override {} + void jobsDone(Qt3DCore::QAspectManager *manager) override { Q_UNUSED(manager) } QVector<Qt3DCore::QAspectJobPtr> preRenderingJobs() override { return QVector<Qt3DCore::QAspectJobPtr>(); } QVector<Qt3DCore::QAspectJobPtr> renderBinJobs() override { return QVector<Qt3DCore::QAspectJobPtr>(); } Qt3DCore::QAspectJobPtr pickBoundingVolumeJob() override { return Qt3DCore::QAspectJobPtr(); } Qt3DCore::QAspectJobPtr rayCastingJob() override { return Qt3DCore::QAspectJobPtr(); } Qt3DCore::QAspectJobPtr syncLoadingJobs() override { return Qt3DCore::QAspectJobPtr(); } Qt3DCore::QAspectJobPtr expandBoundingVolumeJob() override { return Qt3DCore::QAspectJobPtr(); } - void setSceneRoot(Qt3DRender::Render::Entity *root) override { Q_UNUSED(root); } + void setSceneRoot(Qt3DRender::Render::Entity *root) override { Q_UNUSED(root) } Qt3DRender::Render::Entity *sceneRoot() const override { return nullptr; } Qt3DRender::Render::FrameGraphNode *frameGraphRoot() const override { return nullptr; } Qt3DCore::QAbstractFrameAdvanceService *frameAdvanceService() const override { return nullptr; } - void registerEventFilter(Qt3DCore::QEventFilterService *service) override { Q_UNUSED(service); } - void setSettings(Qt3DRender::Render::RenderSettings *settings) override { Q_UNUSED(settings); } + void registerEventFilter(Qt3DCore::QEventFilterService *service) override { Q_UNUSED(service) } + void setSettings(Qt3DRender::Render::RenderSettings *settings) override { Q_UNUSED(settings) } Qt3DRender::Render::RenderSettings *settings() const override { return nullptr; } void markDirty(Qt3DRender::Render::AbstractRenderer::BackendNodeDirtySet changes, Qt3DRender::Render::BackendNode *node) override; @@ -85,12 +92,15 @@ public: QSurfaceFormat format() override; void setOpenGLContext(QOpenGLContext *) override {} + bool accessOpenGLTexture(Qt3DCore::QNodeId, QOpenGLTexture **, QMutex **, bool) override { return false; } + QSharedPointer<Qt3DRender::Render::RenderBackendResourceAccessor> resourceAccessor() const override { return m_resourceAccessor; } void loadShader(Qt3DRender::Render::Shader *, Qt3DRender::Render::HShader) override {} protected: Qt3DRender::Render::AbstractRenderer::BackendNodeDirtySet m_changes; - Qt3DRender::Render::NodeManagers *m_managers; + Qt3DRender::Render::NodeManagers *m_managers = nullptr; + QSharedPointer<Qt3DRender::Render::ResourceAccessor> m_resourceAccessor; }; QT_END_NAMESPACE diff --git a/tests/auto/render/computecommand/tst_computecommand.cpp b/tests/auto/render/computecommand/tst_computecommand.cpp index 2046ecc76..4dc6b4436 100644 --- a/tests/auto/render/computecommand/tst_computecommand.cpp +++ b/tests/auto/render/computecommand/tst_computecommand.cpp @@ -54,11 +54,6 @@ public: ~tst_Renderer() { shutdown(); } - - Qt3DRender::Render::SynchronizerPostFramePtr sendDisablesToFrontendJob() const - { - return m_sendDisablesToFrontendJob; - } }; @@ -337,8 +332,7 @@ private Q_SLOTS: QCOMPARE(computeCommand.isEnabled(), true); // WHEN - auto sendDisablesJob = renderer.sendDisablesToFrontendJob(); - Qt3DCore::QAspectJobPrivate::get(sendDisablesJob.data())->postFrame(&manager); + renderer.jobsDone(&manager); // so Renderer::sendDisablesToFrontend gets called // THEN QCOMPARE(computeCommand.isEnabled(), false); diff --git a/tests/auto/render/ddstextures/tst_ddstextures.cpp b/tests/auto/render/ddstextures/tst_ddstextures.cpp index 1f33f20e2..ecdb5d234 100644 --- a/tests/auto/render/ddstextures/tst_ddstextures.cpp +++ b/tests/auto/render/ddstextures/tst_ddstextures.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DRender/qtextureimagedata.h> #include <Qt3DRender/private/qtexture_p.h> diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp index 2eeca2b39..a762330dd 100644 --- a/tests/auto/render/entity/tst_entity.cpp +++ b/tests/auto/render/entity/tst_entity.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QtTest> #include <Qt3DRender/private/entity_p.h> #include <Qt3DRender/private/entity_p_p.h> @@ -35,7 +39,6 @@ #include <Qt3DRender/private/entityaccumulator_p.h> #include <Qt3DRender/QCameraLens> -#include <Qt3DCore/QPropertyNodeAddedChange> #include <Qt3DCore/QTransform> #include <Qt3DRender/QEnvironmentLight> diff --git a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp index 25262a772..618709269 100644 --- a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp +++ b/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp @@ -53,6 +53,7 @@ public: : Qt3DRender::QRenderAspect(Qt3DRender::QRenderAspect::Synchronous) , m_jobManager(new Qt3DCore::QAspectJobManager()) , m_window(new QWindow()) + , m_contextCreationSuccessful(false) { m_window->setSurfaceType(QWindow::OpenGLSurface); m_window->setGeometry(0, 0, 10, 10); @@ -68,6 +69,8 @@ public: return; } + m_contextCreationSuccessful = true; + Qt3DCore::QAbstractAspectPrivate::get(this)->m_jobManager = m_jobManager.data(); QRenderAspect::onRegistered(); @@ -91,7 +94,8 @@ public: ~TestAspect() { - QRenderAspect::onUnregistered(); + if (m_contextCreationSuccessful) + QRenderAspect::onUnregistered(); } Qt3DRender::Render::NodeManagers *nodeManagers() const @@ -100,6 +104,11 @@ public: ? d_func()->m_renderer->nodeManagers() : nullptr; } + bool contextCreationSuccessful() const + { + return m_contextCreationSuccessful; + } + void initializeRenderer() { renderer()->setOpenGLContext(&m_glContext); @@ -119,6 +128,7 @@ private: QScopedPointer<Qt3DCore::QAspectJobManager> m_jobManager; QScopedPointer<QWindow> m_window; QOpenGLContext m_glContext; + bool m_contextCreationSuccessful; }; } // namespace Qt3DRender @@ -211,6 +221,11 @@ private Q_SLOTS: Qt3DRender::Render::FilterCompatibleTechniqueJob backendFilterCompatibleTechniqueJob; Qt3DRender::TestAspect testAspect(buildTestScene()); + const bool unableToCreateContext = !testAspect.contextCreationSuccessful(); + + if (unableToCreateContext) + QSKIP("Initialization failed, unable to create GL context"); + // WHEN Qt3DRender::Render::NodeManagers *nodeManagers = testAspect.nodeManagers(); QVERIFY(nodeManagers); diff --git a/tests/auto/render/geometry/tst_geometry.cpp b/tests/auto/render/geometry/tst_geometry.cpp index 09dbb8eb3..a13f6fa40 100644 --- a/tests/auto/render/geometry/tst_geometry.cpp +++ b/tests/auto/render/geometry/tst_geometry.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <qbackendnodetester.h> #include <Qt3DRender/private/geometry_p.h> diff --git a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp index 0f6af16db..19df24680 100644 --- a/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp +++ b/tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <qbackendnodetester.h> #include <Qt3DRender/private/geometryrenderer_p.h> diff --git a/tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro b/tests/auto/render/glshadermanager/glshadermanager.pro index 6aff0bebd..27aadf84f 100644 --- a/tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro +++ b/tests/auto/render/glshadermanager/glshadermanager.pro @@ -1,12 +1,12 @@ TEMPLATE = app -TARGET = tst_sendrendercapturejob +TARGET = tst_glshadermanager QT += core-private 3dcore 3dcore-private 3drender 3drender-private testlib CONFIG += testcase -SOURCES += tst_sendrendercapturejob.cpp +SOURCES += tst_glshadermanager.cpp -include(../commons/commons.pri) include(../../core/common/common.pri) +include(../commons/commons.pri) diff --git a/tests/auto/render/glshadermanager/tst_glshadermanager.cpp b/tests/auto/render/glshadermanager/tst_glshadermanager.cpp new file mode 100644 index 000000000..c18fb4793 --- /dev/null +++ b/tests/auto/render/glshadermanager/tst_glshadermanager.cpp @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the Qt3D module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QtTest/QTest> +#include <Qt3DRender/private/glresourcemanagers_p.h> +#include <Qt3DCore/qnodeid.h> +#include "qbackendnodetester.h" +#include "testrenderer.h" + +class tst_GLShaderManager : public Qt3DCore::QBackendNodeTester +{ + Q_OBJECT + +private Q_SLOTS: + void adopt(); + void lookupResource(); + void abandon(); + void insertAfterRemoval(); +}; + +void tst_GLShaderManager::adopt() +{ + // GIVEN + Qt3DRender::Render::GLShaderManager cache; + Qt3DRender::QShaderProgram frontendShader1; + Qt3DRender::QShaderProgram frontendShader2; + TestRenderer renderer; + Qt3DRender::Render::Shader backendShaderNode1; + Qt3DRender::Render::Shader backendShaderNode2; + + backendShaderNode1.setRenderer(&renderer); + backendShaderNode2.setRenderer(&renderer); + simulateInitialization(&frontendShader1, &backendShaderNode1); + simulateInitialization(&frontendShader2, &backendShaderNode2); + + // THEN + QVERIFY(cache.lookupResource(backendShaderNode1.peerId()) == nullptr); + QVERIFY(cache.lookupResource(backendShaderNode2.peerId()) == nullptr); + QVERIFY(backendShaderNode1.peerId() != backendShaderNode2.peerId()); + + // WHEN + Qt3DRender::Render::GLShader *glShader1 = cache.createOrAdoptExisting(&backendShaderNode1); + + // THEN + QVERIFY(glShader1 != nullptr); + QVector<Qt3DCore::QNodeId> shaderNodeIds = cache.shaderIdsForProgram(glShader1); + QCOMPARE(shaderNodeIds.size(), 1); + QCOMPARE(shaderNodeIds.first(), backendShaderNode1.peerId()); + + // WHEN + Qt3DRender::Render::GLShader *glShader2 = cache.createOrAdoptExisting(&backendShaderNode2); + + // THEN + QCOMPARE(glShader1, glShader2); + + shaderNodeIds = cache.shaderIdsForProgram(glShader2); + QCOMPARE(shaderNodeIds.size(), 2); + QCOMPARE(shaderNodeIds.first(), backendShaderNode1.peerId()); + QCOMPARE(shaderNodeIds.last(), backendShaderNode2.peerId()); +} + +void tst_GLShaderManager::lookupResource() +{ + // GIVEN + Qt3DRender::Render::GLShaderManager cache; + Qt3DRender::QShaderProgram frontendShader1; + Qt3DRender::QShaderProgram frontendShader2; + TestRenderer renderer; + Qt3DRender::Render::Shader backendShaderNode1; + Qt3DRender::Render::Shader backendShaderNode2; + + backendShaderNode1.setRenderer(&renderer); + backendShaderNode2.setRenderer(&renderer); + simulateInitialization(&frontendShader1, &backendShaderNode1); + simulateInitialization(&frontendShader2, &backendShaderNode2); + + // WHEN + cache.createOrAdoptExisting(&backendShaderNode1); + cache.createOrAdoptExisting(&backendShaderNode2); + + // THEN + Qt3DRender::Render::GLShader *glShader1 = cache.lookupResource(backendShaderNode1.peerId()); + Qt3DRender::Render::GLShader *glShader2 = cache.lookupResource(backendShaderNode2.peerId()); + QVERIFY(glShader1 != nullptr); + QCOMPARE(glShader1, glShader2); + const QVector<Qt3DCore::QNodeId> shaderNodeIds = cache.shaderIdsForProgram(glShader1); + QCOMPARE(shaderNodeIds.size(), 2); + QVERIFY(shaderNodeIds.contains(frontendShader1.id())); + QVERIFY(shaderNodeIds.contains(frontendShader2.id())); +} + +void tst_GLShaderManager::abandon() +{ + // GIVEN + Qt3DRender::Render::GLShaderManager cache; + Qt3DRender::QShaderProgram frontendShader1; + Qt3DRender::QShaderProgram frontendShader2; + TestRenderer renderer; + Qt3DRender::Render::Shader backendShaderNode1; + Qt3DRender::Render::Shader backendShaderNode2; + + backendShaderNode1.setRenderer(&renderer); + backendShaderNode2.setRenderer(&renderer); + simulateInitialization(&frontendShader1, &backendShaderNode1); + simulateInitialization(&frontendShader2, &backendShaderNode2); + cache.createOrAdoptExisting(&backendShaderNode1); + cache.createOrAdoptExisting(&backendShaderNode2); + + // WHEN + Qt3DRender::Render::GLShader *glShader = cache.lookupResource(backendShaderNode1.peerId()); + cache.abandon(glShader, &backendShaderNode1); + + // THEN + QVector<Qt3DCore::QNodeId> shaderNodeIds = cache.shaderIdsForProgram(glShader); + QVERIFY(cache.takeAbandonned().isEmpty()); + QCOMPARE(shaderNodeIds.size(), 1); + QCOMPARE(shaderNodeIds.first(), backendShaderNode2.peerId()); + + // WHEN + cache.abandon(glShader, &backendShaderNode2); + + // THEN + shaderNodeIds = cache.shaderIdsForProgram(glShader); + QCOMPARE(shaderNodeIds.size(), 0); + const QVector<Qt3DRender::Render::GLShader *> releasedShaders = cache.takeAbandonned(); + QCOMPARE(releasedShaders.size(), 1); + QCOMPARE(releasedShaders.first(), glShader); +} + +void tst_GLShaderManager::insertAfterRemoval() +{ + // GIVEN + Qt3DRender::Render::GLShaderManager cache; + Qt3DRender::QShaderProgram frontendShader; + TestRenderer renderer; + Qt3DRender::Render::Shader backendShaderNode; + + + backendShaderNode.setRenderer(&renderer); + simulateInitialization(&frontendShader, &backendShaderNode); + + // WHEN + Qt3DRender::Render::GLShader *apiShader1 = cache.createOrAdoptExisting(&backendShaderNode); + const Qt3DRender::Render::GLShader *originalApiShader = apiShader1; + + // THEN + auto apiShader2 = cache.lookupResource(frontendShader.id()); + QVERIFY(apiShader1 != nullptr); + QVERIFY(apiShader2 != nullptr); + QVERIFY(apiShader1 == originalApiShader); + QVERIFY(apiShader1 == apiShader2); + + // WHEN + cache.abandon(apiShader1, &backendShaderNode); + + // THEN + Qt3DRender::Render::GLShader *apiShaderEmpty = cache.lookupResource(frontendShader.id()); + QVERIFY(apiShaderEmpty == nullptr); + + // WHEN + apiShader1 = cache.createOrAdoptExisting(&backendShaderNode); + cache.purge(); + apiShader2 = cache.lookupResource(frontendShader.id()); + + // THEN + QVERIFY(apiShader1 != nullptr); + QVERIFY(apiShader2 != nullptr); + QVERIFY(apiShader1 == apiShader2); + QVERIFY(apiShader2 == originalApiShader); +} + +QTEST_APPLESS_MAIN(tst_GLShaderManager) + +#include "tst_glshadermanager.moc" diff --git a/tests/auto/render/gltexture/tst_gltexture.cpp b/tests/auto/render/gltexture/tst_gltexture.cpp index e971078d0..7d8c679f3 100644 --- a/tests/auto/render/gltexture/tst_gltexture.cpp +++ b/tests/auto/render/gltexture/tst_gltexture.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DRender/private/gltexture_p.h> #include <Qt3DRender/qabstracttexture.h> diff --git a/tests/auto/render/ktxtextures/tst_ktxtextures.cpp b/tests/auto/render/ktxtextures/tst_ktxtextures.cpp index 57ccd3652..f57bc86b6 100644 --- a/tests/auto/render/ktxtextures/tst_ktxtextures.cpp +++ b/tests/auto/render/ktxtextures/tst_ktxtextures.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DRender/qtextureimagedata.h> #include <Qt3DRender/private/qtexture_p.h> diff --git a/tests/auto/render/meshfunctors/tst_meshfunctors.cpp b/tests/auto/render/meshfunctors/tst_meshfunctors.cpp index 1142d1447..f8110085b 100644 --- a/tests/auto/render/meshfunctors/tst_meshfunctors.cpp +++ b/tests/auto/render/meshfunctors/tst_meshfunctors.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QtTest> #include <Qt3DCore/qcomponent.h> #include <Qt3DRender/qgeometryfactory.h> diff --git a/tests/auto/render/picking/tst_picking.cpp b/tests/auto/render/picking/tst_picking.cpp index d0e6512d5..b281eb6cb 100644 --- a/tests/auto/render/picking/tst_picking.cpp +++ b/tests/auto/render/picking/tst_picking.cpp @@ -82,8 +82,11 @@ public: Qt3DRender::QBuffer *vertexBuffer = static_cast<Qt3DRender::QBuffer *>(positionAttr->buffer()); // Load the geometry + QT_WARNING_PUSH + QT_WARNING_DISABLE_DEPRECATED const QByteArray data = (*vertexBuffer->dataGenerator())(); vertexBuffer->setData(data); + QT_WARNING_POP transform->setTranslation(position); diff --git a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp index ad12ffad0..1b65388af 100644 --- a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp +++ b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp @@ -50,7 +50,7 @@ Qt3DCore::QEntity *buildEntityAtDistance(float distance, Qt3DCore::QEntity *pare // create geometry with a valid bounding volume - a single point is sufficient auto geometry = new Qt3DRender::QGeometry; - auto vertexBuffer = new Qt3DRender::QBuffer(Qt3DRender::QBuffer::VertexBuffer, geometry); + auto vertexBuffer = new Qt3DRender::QBuffer(geometry); auto positionAttribute = new Qt3DRender::QAttribute; positionAttribute->setName(Qt3DRender::QAttribute::defaultPositionAttributeName()); diff --git a/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp b/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp index a1973176e..6fad09a0d 100644 --- a/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp +++ b/tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qabstracttexture.h> diff --git a/tests/auto/render/qbuffer/tst_qbuffer.cpp b/tests/auto/render/qbuffer/tst_qbuffer.cpp index 94c0a49cb..fd96bf1c2 100644 --- a/tests/auto/render/qbuffer/tst_qbuffer.cpp +++ b/tests/auto/render/qbuffer/tst_qbuffer.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/private/qnode_p.h> #include <Qt3DCore/private/qscene_p.h> diff --git a/tests/auto/render/qdefaultmeshes/tst_qdefaultmeshes.cpp b/tests/auto/render/qdefaultmeshes/tst_qdefaultmeshes.cpp index bbecdd187..8c64a005a 100644 --- a/tests/auto/render/qdefaultmeshes/tst_qdefaultmeshes.cpp +++ b/tests/auto/render/qdefaultmeshes/tst_qdefaultmeshes.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DRender/qgeometryrenderer.h> diff --git a/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp b/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp index 24febdac4..6116e031e 100644 --- a/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp +++ b/tests/auto/render/qframegraphnode/tst_qframegraphnode.cpp @@ -94,7 +94,7 @@ private Q_SLOTS: { Qt3DRender::QFrameGraphNode *nodeWithNestedChildren = new MyFrameGraphNode(); Qt3DRender::QFrameGraphNode *child = new MyFrameGraphNode(nodeWithNestedChildren); - Qt3DCore::QNode *dummy = new Qt3DCore::QNode(nodeWithNestedChildren); + new Qt3DCore::QNode(nodeWithNestedChildren); Qt3DRender::QFrameGraphNode *grandChild = new MyFrameGraphNode(nodeWithNestedChildren); QVector<Qt3DCore::QNodeId> childIds = {child->id(), grandChild->id()}; QTest::newRow("nodeWithNestedChildren") << nodeWithNestedChildren << childIds << true << 4; diff --git a/tests/auto/render/qgeometry/tst_qgeometry.cpp b/tests/auto/render/qgeometry/tst_qgeometry.cpp index 017314ecf..e790ba9cc 100644 --- a/tests/auto/render/qgeometry/tst_qgeometry.cpp +++ b/tests/auto/render/qgeometry/tst_qgeometry.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/qpropertyupdatedchange.h> #include <Qt3DCore/private/qnode_p.h> diff --git a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp index 28574d3c5..8cfbc0d23 100644 --- a/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp +++ b/tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DCore/private/qnode_p.h> #include <Qt3DCore/private/qscene_p.h> diff --git a/tests/auto/render/qmesh/tst_qmesh.cpp b/tests/auto/render/qmesh/tst_qmesh.cpp index 0df96dd24..d77005dfa 100644 --- a/tests/auto/render/qmesh/tst_qmesh.cpp +++ b/tests/auto/render/qmesh/tst_qmesh.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qmesh.h> diff --git a/tests/auto/render/qraycaster/tst_qraycaster.cpp b/tests/auto/render/qraycaster/tst_qraycaster.cpp index 720c372de..8ac084545 100644 --- a/tests/auto/render/qraycaster/tst_qraycaster.cpp +++ b/tests/auto/render/qraycaster/tst_qraycaster.cpp @@ -80,7 +80,7 @@ private Q_SLOTS: QScopedPointer<Qt3DRender::QRayCaster> rayCaster(new Qt3DRender::QRayCaster()); QVERIFY(!rayCaster->isEnabled()); - QVERIFY(rayCaster->direction().length() > 0.); + QVERIFY(rayCaster->direction().length() > 0.f); QCOMPARE(rayCaster->runMode(), Qt3DRender::QAbstractRayCaster::SingleShot); // WHEN @@ -125,13 +125,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto addChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(addChange->propertyName(), "layer"); - QCOMPARE(addChange->subjectId(), rayCaster->id()); - QCOMPARE(addChange->addedNodeId(), rayCaster->layers().at(0)->id()); - QCOMPARE(addChange->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), rayCaster.data()); + arbiter.dirtyNodes.clear(); arbiter.events.clear(); // WHEN @@ -141,13 +139,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - addChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeAddedChange>(); - QCOMPARE(addChange->propertyName(), "layer"); - QCOMPARE(addChange->subjectId(), rayCaster->id()); - QCOMPARE(addChange->addedNodeId(), rayCaster->layers().at(1)->id()); - QCOMPARE(addChange->type(), Qt3DCore::PropertyValueAdded); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), rayCaster.data()); + arbiter.dirtyNodes.clear(); arbiter.events.clear(); // WHEN @@ -156,13 +152,11 @@ private Q_SLOTS: QCoreApplication::processEvents(); // THEN - QCOMPARE(arbiter.events.size(), 1); - auto removeChange = arbiter.events.first().staticCast<Qt3DCore::QPropertyNodeRemovedChange>(); - QCOMPARE(removeChange->propertyName(), "layer"); - QCOMPARE(removeChange->subjectId(), rayCaster->id()); - QCOMPARE(removeChange->removedNodeId(), layer->id()); - QCOMPARE(removeChange->type(), Qt3DCore::PropertyValueRemoved); + QCOMPARE(arbiter.events.size(), 0); + QCOMPARE(arbiter.dirtyNodes.size(), 1); + QCOMPARE(arbiter.dirtyNodes.front(), rayCaster.data()); + arbiter.dirtyNodes.clear(); arbiter.events.clear(); } @@ -209,29 +203,6 @@ private Q_SLOTS: << QByteArray(SIGNAL(hitsChanged(const Hits &))) << QByteArrayLiteral("hits"); } - - void checkBackendUpdates() - { - // GIVEN - QFETCH(QByteArray, signalPrototype); - QFETCH(QByteArray, propertyName); - QScopedPointer<MyRayCaster> rayCaster(new MyRayCaster()); - QSignalSpy spy(rayCaster.data(), signalPrototype.constData()); - Qt3DRender::QRayCaster::Hits hits; - - // WHEN - // Create Backend Change and distribute it to frontend node - Qt3DCore::QPropertyUpdatedChangePtr e(new Qt3DCore::QPropertyUpdatedChange(rayCaster->id())); - e->setPropertyName(propertyName.constData()); - QVariant v; - v.setValue<Qt3DRender::QRayCaster::Hits>(hits); - e->setValue(v); - rayCaster->sceneChangeEvent(e); - - // THEN - // Check that the QRayCaster triggers the expected signal - QCOMPARE(spy.count(), 1); - } }; QTEST_MAIN(tst_QRayCaster) diff --git a/tests/auto/render/qrendercapture/tst_qrendercapture.cpp b/tests/auto/render/qrendercapture/tst_qrendercapture.cpp index 9ed7651fc..35c645d41 100644 --- a/tests/auto/render/qrendercapture/tst_qrendercapture.cpp +++ b/tests/auto/render/qrendercapture/tst_qrendercapture.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <QtTest/QSignalSpy> diff --git a/tests/auto/render/qsetfence/tst_qsetfence.cpp b/tests/auto/render/qsetfence/tst_qsetfence.cpp index c602e6f5c..ad92e9fe0 100644 --- a/tests/auto/render/qsetfence/tst_qsetfence.cpp +++ b/tests/auto/render/qsetfence/tst_qsetfence.cpp @@ -37,6 +37,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <Qt3DRender/qsetfence.h> #include <Qt3DRender/private/qsetfence_p.h> @@ -153,7 +157,6 @@ private Q_SLOTS: QCOMPARE(creationChanges.size(), 1); const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QSetFenceData>>(creationChanges.first()); - const Qt3DRender::QSetFenceData cloneData = creationChangeData->data; QCOMPARE(setFence.id(), creationChangeData->subjectId()); QCOMPARE(setFence.isEnabled(), true); @@ -174,7 +177,6 @@ private Q_SLOTS: QCOMPARE(creationChanges.size(), 1); const auto creationChangeData = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<Qt3DRender::QSetFenceData>>(creationChanges.first()); - const Qt3DRender::QSetFenceData cloneData = creationChangeData->data; QCOMPARE(setFence.id(), creationChangeData->subjectId()); QCOMPARE(setFence.isEnabled(), false); diff --git a/tests/auto/render/qshaderprogram/tst_qshaderprogram.cpp b/tests/auto/render/qshaderprogram/tst_qshaderprogram.cpp index a261d0860..15be26e8e 100644 --- a/tests/auto/render/qshaderprogram/tst_qshaderprogram.cpp +++ b/tests/auto/render/qshaderprogram/tst_qshaderprogram.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qshaderprogram.h> @@ -42,6 +45,13 @@ class tst_QShaderProgram : public Qt3DRender::QShaderProgram { Q_OBJECT +public: + tst_QShaderProgram() + : Qt3DRender::QShaderProgram() + { + qRegisterMetaType<Qt3DRender::QShaderProgram::Format>("Format"); + } + private Q_SLOTS: void checkDefaultConstruction() @@ -58,6 +68,7 @@ private Q_SLOTS: QCOMPARE(shaderProgram.computeShaderCode(), QByteArray()); QCOMPARE(shaderProgram.log(), QString()); QCOMPARE(shaderProgram.status(), Qt3DRender::QShaderProgram::NotReady); + QCOMPARE(shaderProgram.format(), Qt3DRender::QShaderProgram::GLSL); } void checkPropertyChanges() @@ -179,6 +190,25 @@ private Q_SLOTS: QCOMPARE(shaderProgram.computeShaderCode(), newValue); QCOMPARE(spy.count(), 0); } + { + // WHEN + QSignalSpy spy(&shaderProgram, SIGNAL(formatChanged(Format))); + const QShaderProgram::Format newValue = QShaderProgram::SPIRV; + shaderProgram.setFormat(newValue); + + // THEN + QVERIFY(spy.isValid()); + QCOMPARE(shaderProgram.format(), newValue); + QCOMPARE(spy.count(), 1); + + // WHEN + spy.clear(); + shaderProgram.setFormat(newValue); + + // THEN + QCOMPARE(shaderProgram.format(), newValue); + QCOMPARE(spy.count(), 0); + } } void checkCreationData() @@ -192,6 +222,7 @@ private Q_SLOTS: shaderProgram.setGeometryShaderCode(QByteArrayLiteral("Geometry")); shaderProgram.setFragmentShaderCode(QByteArrayLiteral("Fragment")); shaderProgram.setComputeShaderCode(QByteArrayLiteral("Compute")); + shaderProgram.setFormat(QShaderProgram::SPIRV); // WHEN QVector<Qt3DCore::QNodeCreatedChangeBasePtr> creationChanges; @@ -214,6 +245,7 @@ private Q_SLOTS: QCOMPARE(shaderProgram.geometryShaderCode(), cloneData.geometryShaderCode); QCOMPARE(shaderProgram.fragmentShaderCode(), cloneData.fragmentShaderCode); QCOMPARE(shaderProgram.computeShaderCode(), cloneData.computeShaderCode); + QCOMPARE(shaderProgram.format(), cloneData.format); QCOMPARE(shaderProgram.id(), creationChangeData->subjectId()); QCOMPARE(shaderProgram.isEnabled(), true); QCOMPARE(shaderProgram.isEnabled(), creationChangeData->isNodeEnabled()); @@ -529,6 +561,42 @@ private Q_SLOTS: // THEN QVERIFY(mainContent.indexOf(includedContent) == 0); } + + void checkFormatPropertyUpdate() + { + // GIVEN + TestArbiter arbiter; + Qt3DRender::QShaderProgram shaderProgram; + arbiter.setArbiterOnNode(&shaderProgram); + + QSignalSpy spy(&shaderProgram, SIGNAL(formatChanged(Format))); + + // THEN + QVERIFY(spy.isValid()); + + { + // WHEN + shaderProgram.setFormat(QShaderProgram::SPIRV); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(spy.count(), 1); + QCOMPARE(arbiter.events.size(), 0); + + spy.clear(); + } + + { + // WHEN + shaderProgram.setFormat(QShaderProgram::SPIRV); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(spy.count(), 0); + QCOMPARE(arbiter.events.size(), 0); + } + } + }; QTEST_MAIN(tst_QShaderProgram) diff --git a/tests/auto/render/qsharedgltexture/tst_qsharedgltexture.cpp b/tests/auto/render/qsharedgltexture/tst_qsharedgltexture.cpp index 4011eeea6..3187dbd52 100644 --- a/tests/auto/render/qsharedgltexture/tst_qsharedgltexture.cpp +++ b/tests/auto/render/qsharedgltexture/tst_qsharedgltexture.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qtexture.h> diff --git a/tests/auto/render/qtextureimage/tst_qtextureimage.cpp b/tests/auto/render/qtextureimage/tst_qtextureimage.cpp index 4996c877d..ba5c2c3d8 100644 --- a/tests/auto/render/qtextureimage/tst_qtextureimage.cpp +++ b/tests/auto/render/qtextureimage/tst_qtextureimage.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qtextureimage.h> diff --git a/tests/auto/render/qtextureloader/tst_qtextureloader.cpp b/tests/auto/render/qtextureloader/tst_qtextureloader.cpp index dd92894da..b6d949c83 100644 --- a/tests/auto/render/qtextureloader/tst_qtextureloader.cpp +++ b/tests/auto/render/qtextureloader/tst_qtextureloader.cpp @@ -26,6 +26,9 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qtexture.h> diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp index eaf85f5b6..1ff899936 100644 --- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp +++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp @@ -285,7 +285,7 @@ private Q_SLOTS: initializeJob(&rayCastingJob, test.data()); bool earlyReturn = !rayCastingJob.runHelper(); - Qt3DCore::QAspectJobPrivate::get(&rayCastingJob)->postFrame(test->aspectManager()); + rayCastingJob.postFrame(test->aspectManager()); QCoreApplication::processEvents(); // THEN @@ -345,7 +345,7 @@ private Q_SLOTS: initializeJob(&rayCastingJob, test.data()); bool earlyReturn = !rayCastingJob.runHelper(); - Qt3DCore::QAspectJobPrivate::get(&rayCastingJob)->postFrame(test->aspectManager()); + rayCastingJob.postFrame(test->aspectManager()); QCoreApplication::processEvents(); // THEN diff --git a/tests/auto/render/render.pro b/tests/auto/render/render.pro index 180ff7ac1..2b73ec8b7 100644 --- a/tests/auto/render/render.pro +++ b/tests/auto/render/render.pro @@ -42,7 +42,6 @@ qtConfig(private_tests) { # boundingvolumedebug \ ddstextures \ ktxtextures \ - shadercache \ layerfiltering \ filterentitybycomponent \ genericlambdajob \ @@ -130,6 +129,7 @@ qtConfig(qt3d-opengl-renderer):qtConfig(private_tests) { graphicshelpergl3_3 \ graphicshelpergl3_2 \ graphicshelpergl2 \ + glshadermanager \ materialparametergathererjob \ textures \ renderer \ @@ -137,7 +137,6 @@ qtConfig(qt3d-opengl-renderer):qtConfig(private_tests) { renderviews \ renderqueue \ renderviewbuilder \ - sendrendercapturejob \ gltexture qtConfig(qt3d-extras) { diff --git a/tests/auto/render/renderer/tst_renderer.cpp b/tests/auto/render/renderer/tst_renderer.cpp index a343d6e57..0cbc1aefc 100644 --- a/tests/auto/render/renderer/tst_renderer.cpp +++ b/tests/auto/render/renderer/tst_renderer.cpp @@ -78,16 +78,6 @@ private Q_SLOTS: 1); // RayCastingJob // WHEN - renderer.addRenderCaptureSendRequest(Qt3DCore::QNodeId::createId()); - jobs = renderer.preRenderingJobs(); - - // THEN - QCOMPARE(jobs.size(), - 1 + // PickBoundingVolumeJob - 1 + // RayCastingJob - 1); // SendRenderCaptureJob - - // WHEN renderer.m_sendBufferCaptureJob->addRequest({Qt3DCore::QNodeId(), {}}); jobs = renderer.preRenderingJobs(); @@ -110,20 +100,6 @@ private Q_SLOTS: 1); // SendSetFenceHandlesJob // Note: pending set fence handles are only cleared when the job is run - // WHEN - renderer.m_updatedTextureProperties.push_back({{}, {}}); - jobs = renderer.preRenderingJobs(); - - // THEN - QCOMPARE(jobs.size(), - 1 + // PickBoundingVolumeJob - 1 + // RayCastingJob - 1 + // SendBufferCaptureJob - 1 + // SendSetFenceHandlesJob - 1); // SendTextureChangesToFrontend - - // Note: pending texture changes are only cleared when the job is run - // Properly shutdown command thread renderer.shutdown(); } @@ -192,7 +168,6 @@ private Q_SLOTS: 1 + // SyncLoadingJobs 1 + // updateLevelOfDetailJob 1 + // cleanupJob - 1 + // sendDisablesToFrontend 1 + // VAOGatherer 1 + // BufferGathererJob 1 + // TexturesGathererJob @@ -222,7 +197,6 @@ private Q_SLOTS: 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1 + // SyncLoadingJobs - 1 + // sendDisablesToFrontend singleRenderViewJobCount + singleRenderViewCommandRebuildJobCount + renderViewBuilderMaterialCacheJobCount + @@ -243,7 +217,6 @@ private Q_SLOTS: 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1 + // SyncLoadingJobs - 1 + // sendDisablesToFrontend singleRenderViewJobCount + singleRenderViewCommandRebuildJobCount + renderViewBuilderMaterialCacheJobCount + @@ -263,7 +236,6 @@ private Q_SLOTS: 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1 + // SyncLoadingJobs - 1 + // sendDisablesToFrontend 1 + // EntityEnabledDirty singleRenderViewJobCount + layerCacheJobCount); @@ -285,7 +257,6 @@ private Q_SLOTS: 1 + // UpdateShaderDataTransform 1 + // updateSkinningPaletteJob 1 + // SyncLoadingJobs - 1 + // sendDisablesToFrontend 1 + // ExpandBoundingVolumeJob singleRenderViewJobCount); @@ -303,7 +274,6 @@ private Q_SLOTS: 1 + // VAOGatherer 1 + // updateSkinningPaletteJob 1 + // SyncLoadingJobs - 1 + // sendDisablesToFrontend singleRenderViewJobCount + singleRenderViewCommandRebuildJobCount + renderViewBuilderMaterialCacheJobCount); @@ -327,7 +297,6 @@ private Q_SLOTS: 1 + // ExpandBoundingVolumeJob 1 + // RenderableEntityFilterPtr 1 + // SyncRenderableEntities - 1 + // sendDisablesToFrontend singleRenderViewCommandRebuildJobCount + singleRenderViewJobCount); @@ -348,7 +317,6 @@ private Q_SLOTS: 1 + // CalculateBoundingVolumeJob 1 + // UpdateMeshTriangleListJob 1 + // BufferGathererJob - 1 + // sendDisablesToFrontend singleRenderViewJobCount); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); @@ -366,7 +334,6 @@ private Q_SLOTS: 1 + // TexturesGathererJob 1 + // updateSkinningPaletteJob 1 + // SyncTexturesGathererJob - 1 + // sendDisablesToFrontend singleRenderViewJobCount); renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty); diff --git a/tests/auto/render/renderviews/tst_renderviews.cpp b/tests/auto/render/renderviews/tst_renderviews.cpp index 1558b68c9..b434fe83a 100644 --- a/tests/auto/render/renderviews/tst_renderviews.cpp +++ b/tests/auto/render/renderviews/tst_renderviews.cpp @@ -36,6 +36,9 @@ #include <private/rendercommand_p.h> #include <testpostmanarbiter.h> #include <testrenderer.h> +#include <private/shader_p.h> +#include <private/glresourcemanagers_p.h> +#include <Qt3DRender/qshaderprogram.h> QT_BEGIN_NAMESPACE @@ -64,6 +67,7 @@ void compareShaderParameterPacks(const ShaderParameterPack &t1, class tst_RenderViews : public Qt3DCore::QBackendNodeTester { Q_OBJECT + private Q_SLOTS: void checkRenderViewSizeFitsWithAllocator() @@ -132,10 +136,15 @@ private Q_SLOTS: void checkRenderCommandBackToFrontSorting() { // GIVEN + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); RenderView renderView; QVector<RenderCommand> rawCommands; QVector<QSortPolicy::SortType> sortTypes; + renderer.setNodeManagers(&nodeManagers); + renderView.setRenderer(&renderer); + sortTypes.push_back(QSortPolicy::BackToFront); for (int i = 0; i < 200; ++i) { @@ -156,28 +165,34 @@ private Q_SLOTS: QVERIFY(sortedCommands.at(j - 1).m_depth > sortedCommands.at(j).m_depth); // RenderCommands are deleted by RenderView dtor + renderer.shutdown(); } void checkRenderCommandMaterialSorting() { // GIVEN + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); RenderView renderView; QVector<RenderCommand> rawCommands; QVector<QSortPolicy::SortType> sortTypes; + renderer.setNodeManagers(&nodeManagers); + renderView.setRenderer(&renderer); + sortTypes.push_back(QSortPolicy::Material); - ProgramDNA dnas[5] = { - ProgramDNA(250), - ProgramDNA(500), - ProgramDNA(1000), - ProgramDNA(1500), - ProgramDNA(2000), + GLShader *dnas[5] = { + reinterpret_cast<GLShader *>(0x250), + reinterpret_cast<GLShader *>(0x500), + reinterpret_cast<GLShader *>(0x1000), + reinterpret_cast<GLShader *>(0x1500), + reinterpret_cast<GLShader *>(0x2000) }; for (int i = 0; i < 20; ++i) { RenderCommand c; - c.m_shaderDna = dnas[i % 5]; + c.m_glShader = dnas[i % 5]; rawCommands.push_back(c); } @@ -189,24 +204,25 @@ private Q_SLOTS: // THEN const QVector<RenderCommand> sortedCommands = renderView.commands(); QCOMPARE(rawCommands.size(), sortedCommands.size()); - ProgramDNA targetDNA; + GLShader *targetShader; for (int j = 0; j < sortedCommands.size(); ++j) { if (j % 4 == 0) { - targetDNA = sortedCommands.at(j).m_shaderDna; + targetShader = sortedCommands.at(j).m_glShader; if (j > 0) - QVERIFY(targetDNA != sortedCommands.at(j - 1).m_shaderDna); + QVERIFY(targetShader != sortedCommands.at(j - 1).m_glShader); } - QCOMPARE(targetDNA, sortedCommands.at(j).m_shaderDna); + QCOMPARE(targetShader, sortedCommands.at(j).m_glShader); } // RenderCommands are deleted by RenderView dtor + renderer.shutdown(); } void checkRenderViewUniformMinification_data() { - QTest::addColumn<QVector<ProgramDNA>>("programDNAs"); + QTest::addColumn<QVector<QShaderProgram*>>("shaders"); QTest::addColumn<QVector<ShaderParameterPack>>("rawParameters"); QTest::addColumn<QVector<ShaderParameterPack>>("expectedMinimizedParameters"); @@ -217,63 +233,91 @@ private Q_SLOTS: pack1.setUniform(2, UniformValue(1584.0f)); pack1.setTexture(3, 0, fakeTextureNodeId); + QShaderProgram *shader1 = new QShaderProgram(); + QShaderProgram *shader2 = new QShaderProgram(); + + shader1->setShaderCode(QShaderProgram::Vertex, QByteArrayLiteral("1")); + shader2->setShaderCode(QShaderProgram::Vertex, QByteArrayLiteral("2")); + ShaderParameterPack minifiedPack1; QTest::newRow("NoMinification") - << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(1584)) + << (QVector<QShaderProgram*>() << shader1 << shader2) << (QVector<ShaderParameterPack>() << pack1 << pack1) << (QVector<ShaderParameterPack>() << pack1 << pack1); QTest::newRow("SingleShaderMinified") - << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(883)) + << (QVector<QShaderProgram*>() << shader1 << shader1 << shader1) << (QVector<ShaderParameterPack>() << pack1 << pack1 << pack1) << (QVector<ShaderParameterPack>() << pack1 << minifiedPack1 << minifiedPack1); QTest::newRow("MultipleShadersMinified") - << (QVector<ProgramDNA>() << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(883) << ProgramDNA(1584) << ProgramDNA(1584) << ProgramDNA(1584)) + << (QVector<QShaderProgram*>() << shader1 << shader1 << shader1 << shader2 << shader2 << shader2) << (QVector<ShaderParameterPack>() << pack1 << pack1 << pack1 << pack1 << pack1 << pack1) << (QVector<ShaderParameterPack>() << pack1 << minifiedPack1 << minifiedPack1 << pack1 << minifiedPack1 << minifiedPack1); } void checkRenderViewUniformMinification() { - QFETCH(QVector<ProgramDNA>, programDNAs); + QFETCH(QVector<QShaderProgram*>, shaders); QFETCH(QVector<ShaderParameterPack>, rawParameters); QFETCH(QVector<ShaderParameterPack>, expectedMinimizedParameters); + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); + renderer.setNodeManagers(&nodeManagers); + + GLShaderManager *shaderManager = renderer.glResourceManagers()->glShaderManager(); + for (int i = 0, m = shaders.size(); i < m; ++i) { + Shader* backend = new Shader(); + backend->setRenderer(&renderer); + simulateInitializationSync(shaders.at(i), backend); + shaderManager->createOrAdoptExisting(backend); + } + RenderView renderView; QVector<RenderCommand> rawCommands; + renderView.setRenderer(&renderer); - for (int i = 0, m = programDNAs.size(); i < m; ++i) { + for (int i = 0, m = shaders.size(); i < m; ++i) { RenderCommand c; - c.m_shaderDna = programDNAs.at(i); + c.m_shaderId = shaders.at(i)->id(); + c.m_glShader = shaderManager->lookupResource(c.m_shaderId); c.m_parameterPack = rawParameters.at(i); rawCommands.push_back(c); } // WHEN renderView.setCommands(rawCommands); + renderView.addSortType((QVector<QSortPolicy::SortType>() << QSortPolicy::Uniform)); renderView.sort(); // THEN const QVector<RenderCommand> sortedCommands = renderView.commands(); QCOMPARE(rawCommands, sortedCommands); - for (int i = 0, m = programDNAs.size(); i < m; ++i) { + for (int i = 0, m = shaders.size(); i < m; ++i) { const RenderCommand c = sortedCommands.at(i); - QCOMPARE(c.m_shaderDna, programDNAs.at(i)); + QCOMPARE(c.m_shaderId, shaders.at(i)->id()); compareShaderParameterPacks(c.m_parameterPack, expectedMinimizedParameters.at(i)); } + + renderer.shutdown(); } void checkRenderCommandFrontToBackSorting() { // GIVEN + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); RenderView renderView; QVector<RenderCommand> rawCommands; QVector<QSortPolicy::SortType> sortTypes; + renderer.setNodeManagers(&nodeManagers); + renderView.setRenderer(&renderer); + sortTypes.push_back(QSortPolicy::FrontToBack); for (int i = 0; i < 200; ++i) { @@ -294,15 +338,21 @@ private Q_SLOTS: QVERIFY(sortedCommands.at(j - 1).m_depth < sortedCommands.at(j).m_depth); // RenderCommands are deleted by RenderView dtor + renderer.shutdown(); } void checkRenderCommandStateCostSorting() { // GIVEN + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); RenderView renderView; QVector<RenderCommand> rawCommands; QVector<QSortPolicy::SortType> sortTypes; + renderer.setNodeManagers(&nodeManagers); + renderView.setRenderer(&renderer); + sortTypes.push_back(QSortPolicy::StateChangeCost); for (int i = 0; i < 200; ++i) { @@ -323,24 +373,31 @@ private Q_SLOTS: QVERIFY(sortedCommands.at(j - 1).m_changeCost > sortedCommands.at(j).m_changeCost); // RenderCommands are deleted by RenderView dtor + renderer.shutdown(); } void checkRenderCommandCombinedStateMaterialDepthSorting() { // GIVEN + Qt3DRender::Render::NodeManagers nodeManagers; + Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); RenderView renderView; QVector<RenderCommand> rawCommands; QVector<QSortPolicy::SortType> sortTypes; + renderer.setNodeManagers(&nodeManagers); + renderView.setRenderer(&renderer); + sortTypes.push_back(QSortPolicy::StateChangeCost); sortTypes.push_back(QSortPolicy::Material); sortTypes.push_back(QSortPolicy::BackToFront); - ProgramDNA dna[4] = { - ProgramDNA(250), - ProgramDNA(500), - ProgramDNA(1000), - ProgramDNA(1500) + GLShader *dna[5] = { + reinterpret_cast<GLShader *>(0x250), + reinterpret_cast<GLShader *>(0x500), + reinterpret_cast<GLShader *>(0x1000), + reinterpret_cast<GLShader *>(0x1500), + reinterpret_cast<GLShader *>(0x2000) }; float depth[3] = { @@ -354,9 +411,9 @@ private Q_SLOTS: 200 }; - auto buildRC = [] (ProgramDNA dna, float depth, int changeCost) { + auto buildRC = [] (GLShader *dna, float depth, int changeCost) { RenderCommand c; - c.m_shaderDna = dna; + c.m_glShader = dna; c.m_depth = depth; c.m_changeCost = changeCost; return c; @@ -399,6 +456,7 @@ private Q_SLOTS: QCOMPARE(c9, sortedCommands.at(6)); // RenderCommands are deleted by RenderView dtor + renderer.shutdown(); } void checkRenderCommandTextureSorting() diff --git a/tests/auto/render/scene2d/tst_scene2d.cpp b/tests/auto/render/scene2d/tst_scene2d.cpp index ecade18fc..b0a7fbeb8 100644 --- a/tests/auto/render/scene2d/tst_scene2d.cpp +++ b/tests/auto/render/scene2d/tst_scene2d.cpp @@ -326,6 +326,7 @@ private Q_SLOTS: tri, v0, v1, v2, Qt3DRender::QPickEvent::LeftButton, Qt::LeftButton, 0, uvw) { + QSKIP("Disabled until Renderer plugin refactoring is complete"); // WHEN QVector3D uvw(1.0, 0.0f, 0.0f); Qt3DRender::QPickEventPtr ev = Qt3DRender::QPickEventPtr(PICK_TRIANGLE(0, 0, 1, 2, uvw)); diff --git a/tests/auto/render/sendrendercapturejob/tst_sendrendercapturejob.cpp b/tests/auto/render/sendrendercapturejob/tst_sendrendercapturejob.cpp deleted file mode 100644 index 53a646ccd..000000000 --- a/tests/auto/render/sendrendercapturejob/tst_sendrendercapturejob.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QTest> -#include "Qt3DRender/QRenderAspect" -#include "Qt3DRender/private/renderer_p.h" -#include "Qt3DRender/private/nodemanagers_p.h" -#include "Qt3DRender/private/rendercapture_p.h" -#include <Qt3DRender/private/sendrendercapturejob_p.h> -#include "testpostmanarbiter.h" - -class tst_SendRenderCaptureJob : public QObject -{ - Q_OBJECT -private Q_SLOTS: - void testSendRenderCaptureRequest() - { - // GIVEN - TestArbiter arbiter; - Qt3DRender::Render::RenderCapture *renderCapture = new Qt3DRender::Render::RenderCapture; - Qt3DCore::QBackendNodePrivate::get(renderCapture)->setArbiter(&arbiter); - - QImage image(10, 10, QImage::Format_ARGB32); - - Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); - Qt3DRender::Render::SendRenderCaptureJob job; - - Qt3DRender::Render::NodeManagers nodeManagers; - nodeManagers.frameGraphManager()->appendNode(renderCapture->peerId(), renderCapture); - renderer.setNodeManagers(&nodeManagers); - job.setManagers(&nodeManagers); - - renderCapture->requestCapture({ 42, QRect() }); - auto request = renderCapture->takeCaptureRequest(); - renderCapture->addRenderCapture(request.captureId, image); - renderer.addRenderCaptureSendRequest(renderCapture->peerId()); - job.setPendingCaptureRequests(renderer.takePendingRenderCaptureSendRequests()); - - //WHEN - job.run(); - - //THEN - QCOMPARE(arbiter.events.count(), 1); - Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); - QCOMPARE(change->subjectId(), renderCapture->peerId()); - QCOMPARE(change->propertyName(), "renderCaptureData"); - auto data = change->value().value<Qt3DRender::RenderCaptureDataPtr>(); - QCOMPARE(data.data()->captureId, 42); - QCOMPARE(data.data()->image.width(), 10); - QCOMPARE(data.data()->image.height(), 10); - QCOMPARE(data.data()->image.format(), QImage::Format_ARGB32); - - // renderCapture will be deallocated by the nodeManagers destructor - renderer.shutdown(); - } -}; - -QTEST_APPLESS_MAIN(tst_SendRenderCaptureJob) - -#include "tst_sendrendercapturejob.moc" diff --git a/tests/auto/render/setfence/tst_setfence.cpp b/tests/auto/render/setfence/tst_setfence.cpp index 92f7a0acc..75c414e7f 100644 --- a/tests/auto/render/setfence/tst_setfence.cpp +++ b/tests/auto/render/setfence/tst_setfence.cpp @@ -37,7 +37,9 @@ ** ****************************************************************************/ - +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED #include <QtTest/QTest> #include <Qt3DRender/qsetfence.h> diff --git a/tests/auto/render/shader/tst_shader.cpp b/tests/auto/render/shader/tst_shader.cpp index d1578aee7..a1f837010 100644 --- a/tests/auto/render/shader/tst_shader.cpp +++ b/tests/auto/render/shader/tst_shader.cpp @@ -42,15 +42,17 @@ private slots: void cleanupLeavesACoherentState(); void dealWithPropertyChanges_data(); void dealWithPropertyChanges(); + void dealWithFormatChanges(); void checkSetRendererDirtyOnInitialization(); void allowToChangeShaderCode_data(); void allowToChangeShaderCode(); }; -Qt3DRender::QShaderProgram *createFrontendShader() +Qt3DRender::QShaderProgram *createFrontendShader(Qt3DRender::QShaderProgram::Format format = Qt3DRender::QShaderProgram::GLSL) { Qt3DRender::QShaderProgram *shader = new Qt3DRender::QShaderProgram(); + shader->setFormat(format); shader->setVertexShaderCode(QByteArrayLiteral( "#version 150"\ @@ -79,15 +81,10 @@ void tst_RenderShader::hasCoherentInitialState() { Qt3DRender::Render::Shader *shader = new Qt3DRender::Render::Shader(); - QCOMPARE(shader->isLoaded(), false); - QCOMPARE(shader->dna(), 0U); - QVERIFY(shader->uniformsNames().isEmpty()); - QVERIFY(shader->attributesNames().isEmpty()); - QVERIFY(shader->uniformBlockNames().isEmpty()); - QVERIFY(shader->uniforms().isEmpty()); - QVERIFY(shader->attributes().isEmpty()); - QVERIFY(shader->uniformBlocks().isEmpty()); QCOMPARE(shader->status(), Qt3DRender::QShaderProgram::NotReady); + QCOMPARE(shader->format(), Qt3DRender::QShaderProgram::GLSL); + QVERIFY(shader->log().isEmpty()); + QCOMPARE(shader->isDirty(), false); } void tst_RenderShader::matchesFrontendPeer() @@ -98,17 +95,17 @@ void tst_RenderShader::matchesFrontendPeer() backend.setRenderer(&renderer); simulateInitializationSync(frontend.data(), &backend); - QCOMPARE(backend.isLoaded(), false); - QVERIFY(backend.dna() != 0U); + QCOMPARE(backend.isDirty(), true); for (int i = Qt3DRender::QShaderProgram::Vertex; i <= Qt3DRender::QShaderProgram::Compute; ++i) QCOMPARE(backend.shaderCode()[i], frontend->shaderCode(static_cast<Qt3DRender::QShaderProgram::ShaderType>(i))); + QCOMPARE(backend.format(), frontend->format()); } void tst_RenderShader::cleanupLeavesACoherentState() { - QScopedPointer<Qt3DRender::QShaderProgram> frontend(createFrontendShader()); + QScopedPointer<Qt3DRender::QShaderProgram> frontend(createFrontendShader(Qt3DRender::QShaderProgram::SPIRV)); TestRenderer renderer; Qt3DRender::Render::Shader shader; @@ -117,15 +114,9 @@ void tst_RenderShader::cleanupLeavesACoherentState() shader.cleanup(); - QCOMPARE(shader.isLoaded(), false); - QCOMPARE(shader.dna(), 0U); - QVERIFY(shader.uniformsNames().isEmpty()); - QVERIFY(shader.attributesNames().isEmpty()); - QVERIFY(shader.uniformBlockNames().isEmpty()); - QVERIFY(shader.uniforms().isEmpty()); - QVERIFY(shader.attributes().isEmpty()); - QVERIFY(shader.uniformBlocks().isEmpty()); + QCOMPARE(shader.isDirty(), false); QCOMPARE(shader.status(), Qt3DRender::QShaderProgram::NotReady); + QCOMPARE(shader.format(), Qt3DRender::QShaderProgram::GLSL); } void tst_RenderShader::dealWithPropertyChanges_data() @@ -152,7 +143,7 @@ void tst_RenderShader::dealWithPropertyChanges() Qt3DRender::Render::Shader backend; Qt3DRender::QShaderProgram shader; - backend.setLoaded(true); + TestRenderer renderer; backend.setRenderer(&renderer); simulateInitializationSync(&shader, &backend); @@ -162,11 +153,13 @@ void tst_RenderShader::dealWithPropertyChanges() backend.syncFromFrontEnd(&shader, false); // THEN - QCOMPARE(backend.shaderCode().at(type), QByteArrayLiteral("foo")); - QVERIFY(!backend.isLoaded()); + QCOMPARE(backend.shaderCode().at(type), QStringLiteral("foo")); QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + QCOMPARE(backend.isDirty(), true); + renderer.resetDirty(); - backend.setLoaded(true); + QCOMPARE(renderer.dirtyBits(), 0); + backend.unsetDirty(); // WHEN shader.setShaderCode(type, QByteArrayLiteral("foo")); @@ -174,10 +167,8 @@ void tst_RenderShader::dealWithPropertyChanges() // THEN QCOMPARE(backend.shaderCode().at(type), QByteArrayLiteral("foo")); - QVERIFY(backend.isLoaded()); QCOMPARE(renderer.dirtyBits(), 0); - renderer.resetDirty(); - backend.setLoaded(true); + QCOMPARE(backend.isDirty(), false); // WHEN shader.setShaderCode(type, QByteArrayLiteral("bar")); @@ -185,10 +176,48 @@ void tst_RenderShader::dealWithPropertyChanges() // THEN QCOMPARE(backend.shaderCode().at(type), QByteArrayLiteral("bar")); - QVERIFY(!backend.isLoaded()); QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); renderer.resetDirty(); - backend.setLoaded(true); + QCOMPARE(backend.isDirty(), true); +} + +void tst_RenderShader::dealWithFormatChanges() +{ + // GIVEN + Qt3DRender::Render::Shader backend; + Qt3DRender::QShaderProgram shader; + TestRenderer renderer; + backend.setRenderer(&renderer); + simulateInitializationSync(&shader, &backend); + + // WHEN + shader.setFormat(Qt3DRender::QShaderProgram::GLSL); + backend.syncFromFrontEnd(&shader, false); + + // THEN + QCOMPARE(backend.format(), Qt3DRender::QShaderProgram::GLSL); + QCOMPARE(backend.isDirty(), false); + QCOMPARE(renderer.dirtyBits(), 0); + + // WHEN + shader.setFormat(Qt3DRender::QShaderProgram::SPIRV); + backend.syncFromFrontEnd(&shader, false); + + // THEN + QCOMPARE(backend.format(), Qt3DRender::QShaderProgram::SPIRV); + QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + QCOMPARE(backend.isDirty(), true); + + renderer.resetDirty(); + backend.unsetDirty(); + + // WHEN + shader.setFormat(Qt3DRender::QShaderProgram::SPIRV); + backend.syncFromFrontEnd(&shader, false); + + // THEN + QCOMPARE(backend.isDirty(), false); + QCOMPARE(renderer.dirtyBits(), 0); } void tst_RenderShader::checkSetRendererDirtyOnInitialization() @@ -221,7 +250,6 @@ void tst_RenderShader::allowToChangeShaderCode() QFETCH(Qt3DRender::QShaderProgram::ShaderType, type); Qt3DRender::Render::Shader backend; - backend.setLoaded(true); TestRenderer renderer; backend.setRenderer(&renderer); @@ -230,30 +258,24 @@ void tst_RenderShader::allowToChangeShaderCode() // THEN QCOMPARE(backend.shaderCode().at(type), QStringLiteral("foo")); - QVERIFY(!backend.isLoaded()); QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); renderer.resetDirty(); - backend.setLoaded(true); // WHEN backend.setShaderCode(type, QByteArrayLiteral("foo")); // THEN QCOMPARE(backend.shaderCode().at(type), QStringLiteral("foo")); - QVERIFY(backend.isLoaded()); QCOMPARE(renderer.dirtyBits(), 0); renderer.resetDirty(); - backend.setLoaded(true); // WHEN backend.setShaderCode(type, QByteArrayLiteral("bar")); // THEN QCOMPARE(backend.shaderCode().at(type), QStringLiteral("bar")); - QVERIFY(!backend.isLoaded()); QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); renderer.resetDirty(); - backend.setLoaded(true); } QTEST_APPLESS_MAIN(tst_RenderShader) diff --git a/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp b/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp index 7a08fe018..24dbe514a 100644 --- a/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp +++ b/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp @@ -560,6 +560,7 @@ private slots: QVERIFY(!Qt3DRender::Render::ShaderBuilder::getPrototypeNames().isEmpty()); QFETCH(Qt3DRender::QShaderProgram::ShaderType, type); QFETCH(Qt3DRender::QShaderProgram::ShaderType, notificationType); + Q_UNUSED(notificationType) const auto gl3Api = []{ auto api = Qt3DRender::GraphicsApiFilterData(); diff --git a/tests/auto/render/shadercache/shadercache.pro b/tests/auto/render/shadercache/shadercache.pro deleted file mode 100644 index 38499588d..000000000 --- a/tests/auto/render/shadercache/shadercache.pro +++ /dev/null @@ -1,11 +0,0 @@ -TEMPLATE = app - -TARGET = tst_shadercache - -QT += core-private 3dcore 3dcore-private 3drender 3drender-private testlib - -CONFIG += testcase - -SOURCES += tst_shadercache.cpp - -include(../../core/common/common.pri) diff --git a/tests/auto/render/shadercache/tst_shadercache.cpp b/tests/auto/render/shadercache/tst_shadercache.cpp deleted file mode 100644 index 261548d69..000000000 --- a/tests/auto/render/shadercache/tst_shadercache.cpp +++ /dev/null @@ -1,293 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB). -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt3D module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:GPL-EXCEPT$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtTest/QTest> -#include <Qt3DRender/private/shadercache_p.h> -#include <Qt3DCore/qnodeid.h> -#include <QtGui/qopenglshaderprogram.h> -#include <QtCore/qobject.h> -#include <QtCore/qpointer.h> - -QT_BEGIN_NAMESPACE - -using namespace Qt3DCore; - -namespace Qt3DRender { -namespace Render { - -class tst_ShaderCache : public QObject -{ - Q_OBJECT - -private Q_SLOTS: - void insert(); - void insertAfterRemoval(); - void value(); - void removeRef(); - void purge(); - void destruction(); -}; - -void tst_ShaderCache::insert() -{ - // GIVEN - ShaderCache cache; - - // THEN - QCOMPARE(cache.m_programHash.isEmpty(), true); - QCOMPARE(cache.m_programRefs.isEmpty(), true); - QCOMPARE(cache.m_pendingRemoval.isEmpty(), true); - - // WHEN - auto dna = ProgramDNA(12345); - auto nodeId = QNodeId::createId(); - auto shaderProgram = new QOpenGLShaderProgram; - cache.insert(dna, nodeId, shaderProgram); - - // THEN - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programHash.keys().first(), dna); - QCOMPARE(cache.m_programHash.values().first(), shaderProgram); - - QCOMPARE(cache.m_programRefs.size(), 1); - QCOMPARE(cache.m_programRefs.keys().first(), dna); - QCOMPARE(cache.m_programRefs.values().first().size(), 1); - QCOMPARE(cache.m_programRefs.values().first().first(), nodeId); - - QCOMPARE(cache.m_pendingRemoval.isEmpty(), true); -} - -void tst_ShaderCache::insertAfterRemoval() -{ - // GIVEN - ShaderCache cache; - auto dna = ProgramDNA(12345); - auto nodeId = QNodeId::createId(); - - // WHEN - QOpenGLShaderProgram *shaderProgram = new QOpenGLShaderProgram(); - cache.insert(dna, nodeId, shaderProgram); - cache.getShaderProgramAndAddRef(dna, nodeId); - cache.removeRef(dna, nodeId); - shaderProgram = cache.getShaderProgramAndAddRef(dna, nodeId); - - // THEN - QVERIFY(!cache.m_pendingRemoval.contains(dna)); - - // WHEN - cache.removeRef(dna, nodeId); - cache.getShaderProgramAndAddRef(dna, nodeId); - cache.purge(); - - // THEN - QCOMPARE(cache.m_programHash.size(), 1); -} - -void tst_ShaderCache::value() -{ - // GIVEN - ShaderCache cache; - - // WHEN - auto dnaA = ProgramDNA(12345); - auto nodeIdA = QNodeId::createId(); - auto shaderProgramA = new QOpenGLShaderProgram; - cache.insert(dnaA, nodeIdA, shaderProgramA); - auto cachedProgramA = cache.getShaderProgramAndAddRef(dnaA, nodeIdA); - - // THEN - QCOMPARE(shaderProgramA, cachedProgramA); - - // WHEN - auto nodeIdA2 = QNodeId::createId(); - auto cachedProgramA2 = cache.getShaderProgramAndAddRef(dnaA, nodeIdA2); - - // THEN - QCOMPARE(shaderProgramA, cachedProgramA2); - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programHash.keys().first(), dnaA); - QCOMPARE(cache.m_programHash.values().first(), shaderProgramA); - - QCOMPARE(cache.m_programRefs.size(), 1); - QCOMPARE(cache.m_programRefs.keys().first(), dnaA); - const QVector<Qt3DCore::QNodeId> refsA = cache.m_programRefs.values().first(); - QCOMPARE(refsA.size(), 2); - QCOMPARE(refsA.at(0), nodeIdA); - QCOMPARE(refsA.at(1), nodeIdA2); - - // WHEN - auto dnaB = ProgramDNA(67890); - auto nodeIdB = QNodeId::createId(); - auto shaderProgramB = new QOpenGLShaderProgram; - cache.insert(dnaB, nodeIdB, shaderProgramB); - - // THEN - QCOMPARE(cache.m_programHash.size(), 2); - QCOMPARE(cache.m_programRefs.size(), 2); - - // WHEN - auto cachedProgramB = cache.getShaderProgramAndAddRef(dnaB, nodeIdB); - QCOMPARE(shaderProgramB, cachedProgramB); - - // WHEN - auto dnaC = ProgramDNA(54321); - auto uncachedProgram = cache.getShaderProgramAndAddRef(dnaC, nodeIdB); - QVERIFY(uncachedProgram == nullptr); - - cache.clear(); - // Test inserting nullptr. - cache.insert(dnaA, nodeIdA, nullptr); - bool wasPresent = false; - cachedProgramA = cache.getShaderProgramAndAddRef(dnaA, nodeIdA, &wasPresent); - QCOMPARE(wasPresent, true); - QCOMPARE(cachedProgramA, nullptr); - cache.clear(); - // Test wasPresent==false. - cachedProgramB = cache.getShaderProgramAndAddRef(dnaB, nodeIdB, &wasPresent); - QCOMPARE(wasPresent, false); - QCOMPARE(cachedProgramB, nullptr); -} - -void tst_ShaderCache::removeRef() -{ - // GIVEN - ShaderCache cache; - - // WHEN we add 2 references and remove one - auto dnaA = ProgramDNA(12345); - auto nodeIdA = QNodeId::createId(); - auto shaderProgramA = new QOpenGLShaderProgram; - cache.insert(dnaA, nodeIdA, shaderProgramA); - auto cachedProgramA = cache.getShaderProgramAndAddRef(dnaA, nodeIdA); - - auto nodeIdA2 = QNodeId::createId(); - auto cachedProgramA2 = cache.getShaderProgramAndAddRef(dnaA, nodeIdA2); - - cache.removeRef(dnaA, nodeIdA); - - // THEN - QCOMPARE(cachedProgramA, shaderProgramA); - QCOMPARE(cachedProgramA2, shaderProgramA); - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programRefs.size(), 1); - const auto refs = cache.m_programRefs.value(dnaA); - QCOMPARE(refs.size(), 1); - QCOMPARE(refs.first(), nodeIdA2); - QCOMPARE(cache.m_pendingRemoval.size(), 0); - - // WHEN we remove same ref again - cache.removeRef(dnaA, nodeIdA); - - // THEN no change - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programRefs.size(), 1); - const auto refs2 = cache.m_programRefs.value(dnaA); - QCOMPARE(refs2.size(), 1); - QCOMPARE(refs.first(), nodeIdA2); - - // WHEN we remove other reference - cache.removeRef(dnaA, nodeIdA2); - - // THEN - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programRefs.size(), 1); - const auto refs3 = cache.m_programRefs.value(dnaA); - QCOMPARE(refs3.size(), 0); - QCOMPARE(cache.m_pendingRemoval.size(), 1); - QCOMPARE(cache.m_pendingRemoval.first(), dnaA); -} - -void tst_ShaderCache::purge() -{ - // GIVEN - ShaderCache cache; - - // WHEN we add 2 references and remove one and purge - auto dnaA = ProgramDNA(12345); - auto nodeIdA = QNodeId::createId(); - auto shaderProgramA = new QOpenGLShaderProgram; - QPointer<QOpenGLShaderProgram> progPointer(shaderProgramA); - cache.insert(dnaA, nodeIdA, shaderProgramA); - auto cachedProgramA = cache.getShaderProgramAndAddRef(dnaA, nodeIdA); - - auto nodeIdA2 = QNodeId::createId(); - auto cachedProgramA2 = cache.getShaderProgramAndAddRef(dnaA, nodeIdA2); - - cache.removeRef(dnaA, nodeIdA); - cache.purge(); - - // THEN no removal - QCOMPARE(cachedProgramA, shaderProgramA); - QCOMPARE(cachedProgramA2, shaderProgramA); - QCOMPARE(cache.m_programHash.size(), 1); - QCOMPARE(cache.m_programRefs.size(), 1); - QCOMPARE(cache.m_pendingRemoval.isEmpty(), true); - - // WHEN we remove final ref and purge - cache.removeRef(dnaA, nodeIdA2); - cache.purge(); - - // THEN shader program is removed from cache and deleted - QCOMPARE(cache.m_programHash.isEmpty(), true); - QCOMPARE(cache.m_programRefs.isEmpty(), true); - QCOMPARE(progPointer.isNull(), true); -} - -void tst_ShaderCache::destruction() -{ - // GIVEN - auto cache = new ShaderCache; - - // WHEN - auto dnaA = ProgramDNA(12345); - auto nodeIdA = QNodeId::createId(); - auto shaderProgramA = new QOpenGLShaderProgram; - QPointer<QOpenGLShaderProgram> progPointerA(shaderProgramA); - - auto dnaB = ProgramDNA(67890); - auto nodeIdB = QNodeId::createId(); - auto shaderProgramB = new QOpenGLShaderProgram; - QPointer<QOpenGLShaderProgram> progPointerB(shaderProgramB); - - cache->insert(dnaA, nodeIdA, shaderProgramA); - cache->insert(dnaB, nodeIdB, shaderProgramB); - delete cache; - - // THEN - QCOMPARE(progPointerA.isNull(), true); - QCOMPARE(progPointerB.isNull(), true); -} - -} // namespace Render -} // namespace Qt3DRender - -QT_END_NAMESPACE - -QTEST_APPLESS_MAIN(Qt3DRender::Render::tst_ShaderCache) - -#include "tst_shadercache.moc" diff --git a/tests/auto/render/textures/tst_textures.cpp b/tests/auto/render/textures/tst_textures.cpp index 555bd09a3..12d538772 100644 --- a/tests/auto/render/textures/tst_textures.cpp +++ b/tests/auto/render/textures/tst_textures.cpp @@ -26,6 +26,10 @@ ** ****************************************************************************/ +// TODO Remove in Qt6 +#include <QtCore/qcompilerdetection.h> +QT_WARNING_DISABLE_DEPRECATED + #include <QtTest/QTest> #include <qbackendnodetester.h> #include <qtextureimagedatagenerator.h> @@ -34,11 +38,11 @@ #include <Qt3DRender/qtexturedata.h> #include <Qt3DRender/private/renderer_p.h> +#include <Qt3DRender/private/glresourcemanagers_p.h> #include <Qt3DRender/private/texture_p.h> #include <Qt3DRender/private/textureimage_p.h> #include <Qt3DRender/private/nodemanagers_p.h> #include <Qt3DRender/private/managers_p.h> -#include <Qt3DRender/private/gltexturemanager_p.h> #include <Qt3DRender/private/gltexture_p.h> #include <Qt3DRender/private/qtexture_p.h> @@ -238,8 +242,8 @@ private Q_SLOTS: renderer.updateTexture(bt1b); // THEN - QCOMPARE(mgrs->glTextureManager()->lookupResource(bt1a->peerId()), mgrs->glTextureManager()->lookupResource(bt1b->peerId())); - + QCOMPARE(renderer.glResourceManagers()->glTextureManager()->lookupResource(bt1a->peerId()), + renderer.glResourceManagers()->glTextureManager()->lookupResource(bt1b->peerId())); renderer.shutdown(); } @@ -274,11 +278,12 @@ private Q_SLOTS: // no 2 textures must be the same for (int i = 0; i < backend.size(); i++) for (int k = i+1; k < backend.size(); k++) - QVERIFY(mgrs->glTextureManager()->lookupResource(backend[i]->peerId()) != mgrs->glTextureManager()->lookupResource(backend[k]->peerId())); + QVERIFY(renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[i]->peerId()) != + renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[k]->peerId())); QVector<Qt3DRender::Render::GLTexture *> glTextures; for (Qt3DRender::Render::Texture *t : backend) - glTextures.push_back(mgrs->glTextureManager()->lookupResource(t->peerId())); + glTextures.push_back(renderer.glResourceManagers()->glTextureManager()->lookupResource(t->peerId())); // some texture generators must be the same QVERIFY(glTextures[0]->textureGenerator().data() == nullptr); @@ -304,6 +309,8 @@ private Q_SLOTS: Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous); renderer.setNodeManagers(mgrs.data()); + Qt3DRender::Render::GLResourceManagers *glMgrs = renderer.glResourceManagers(); + // both texture having the same sharedTextureId { // GIVEN @@ -328,8 +335,8 @@ private Q_SLOTS: renderer.updateTexture(bt2); // THEN - Qt3DRender::Render::GLTexture *glt1 = mgrs->glTextureManager()->lookupResource(bt1->peerId()); - Qt3DRender::Render::GLTexture *glt2 = mgrs->glTextureManager()->lookupResource(bt2->peerId()); + Qt3DRender::Render::GLTexture *glt1 = glMgrs->glTextureManager()->lookupResource(bt1->peerId()); + Qt3DRender::Render::GLTexture *glt2 = glMgrs->glTextureManager()->lookupResource(bt2->peerId()); QVERIFY(glt1 != glt2); QCOMPARE(glt1->sharedTextureId(), bt1->sharedTextureId()); QCOMPARE(glt2->sharedTextureId(), bt2->sharedTextureId()); @@ -359,8 +366,8 @@ private Q_SLOTS: renderer.updateTexture(bt2); // THEN - Qt3DRender::Render::GLTexture *glt1 = mgrs->glTextureManager()->lookupResource(bt1->peerId()); - Qt3DRender::Render::GLTexture *glt2 = mgrs->glTextureManager()->lookupResource(bt2->peerId()); + Qt3DRender::Render::GLTexture *glt1 = glMgrs->glTextureManager()->lookupResource(bt1->peerId()); + Qt3DRender::Render::GLTexture *glt2 = glMgrs->glTextureManager()->lookupResource(bt2->peerId()); QVERIFY(glt1 != glt2); QCOMPARE(glt1->sharedTextureId(), bt1->sharedTextureId()); QCOMPARE(glt2->sharedTextureId(), bt2->sharedTextureId()); @@ -392,12 +399,12 @@ private Q_SLOTS: renderer.updateTexture(backendTexture); } - Qt3DRender::QTextureImageDataGeneratorPtr idg1a = mgrs->glTextureManager()->lookupResource(backend[0]->peerId())->images()[0].generator; - Qt3DRender::QTextureImageDataGeneratorPtr idg1b = mgrs->glTextureManager()->lookupResource(backend[1]->peerId())->images()[0].generator; - Qt3DRender::QTextureImageDataGeneratorPtr idg2 = mgrs->glTextureManager()->lookupResource(backend[1]->peerId())->images()[1].generator; - Qt3DRender::QTextureGeneratorPtr tg1a = mgrs->glTextureManager()->lookupResource(backend[0]->peerId())->textureGenerator(); - Qt3DRender::QTextureGeneratorPtr tg1b = mgrs->glTextureManager()->lookupResource(backend[2]->peerId())->textureGenerator(); - Qt3DRender::QTextureGeneratorPtr tg2 = mgrs->glTextureManager()->lookupResource(backend[1]->peerId())->textureGenerator(); + Qt3DRender::QTextureImageDataGeneratorPtr idg1a = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[0]->peerId())->images()[0].generator; + Qt3DRender::QTextureImageDataGeneratorPtr idg1b = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[1]->peerId())->images()[0].generator; + Qt3DRender::QTextureImageDataGeneratorPtr idg2 = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[1]->peerId())->images()[1].generator; + Qt3DRender::QTextureGeneratorPtr tg1a = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[0]->peerId())->textureGenerator(); + Qt3DRender::QTextureGeneratorPtr tg1b = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[2]->peerId())->textureGenerator(); + Qt3DRender::QTextureGeneratorPtr tg2 = renderer.glResourceManagers()->glTextureManager()->lookupResource(backend[1]->peerId())->textureGenerator(); // THEN QVERIFY(idg1a); diff --git a/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp b/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp index 1238f1800..aafdb36f7 100644 --- a/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp +++ b/tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp @@ -71,7 +71,7 @@ private: bool isReadyToSubmit() { m_submitSemaphore.acquire(1); - return m_running.load() == 1; + return m_running.loadRelaxed() == 1; } Qt3DRender::Render::VSyncFrameAdvanceService *m_tickService; diff --git a/tests/manual/rendercapture-qml/main.qml b/tests/manual/rendercapture-qml/main.qml index 9aff1fefe..98b24e251 100644 --- a/tests/manual/rendercapture-qml/main.qml +++ b/tests/manual/rendercapture-qml/main.qml @@ -50,7 +50,7 @@ import QtQuick 2.2 import QtQuick.Layouts 1.3 -import QtQuick.Controls 1.4 +import QtQuick.Controls 2.12 import Qt3D.Render 2.9 import QtQuick.Scene3D 2.0 |