summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2020-02-07 18:08:29 +0000
committerMike Krus <mike.krus@kdab.com>2020-02-07 18:10:43 +0000
commitb0eb152b82cdd9658154ff7d9ef9e764eccc1ebd (patch)
treed754ad4412d5c1d26caedd54f2455f3e27cbbd46 /tests
parent137b0cbbc746eecc6dd6a93f9a268f8d42c96bcc (diff)
parentfa6799f63f3211300705b814b97716ca689d4bfa (diff)
Merge remote-tracking branch 5.15 into dev
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/animation/animationclip/tst_animationclip.cpp2
-rw-r--r--tests/auto/animation/animationutils/tst_animationutils.cpp2
-rw-r--r--tests/auto/animation/blendedclipanimator/tst_blendedclipanimator.cpp2
-rw-r--r--tests/auto/animation/channelmapping/tst_channelmapping.cpp32
-rw-r--r--tests/auto/animation/qanimationcliploader/tst_qanimationcliploader.cpp1
-rw-r--r--tests/auto/animation/skeleton/tst_skeleton.cpp1
-rw-r--r--tests/auto/core/common/qbackendnodetester.cpp9
-rw-r--r--tests/auto/core/common/testpostmanarbiter.cpp4
-rw-r--r--tests/auto/core/common/testpostmanarbiter.h3
-rw-r--r--tests/auto/core/core.pro5
-rw-r--r--tests/auto/core/nodes/tst_nodes.cpp116
-rw-r--r--tests/auto/core/qaspectengine/tst_qaspectengine.cpp14
-rw-r--r--tests/auto/core/qchangearbiter/tst_qchangearbiter.cpp4
-rw-r--r--tests/auto/core/qentity/tst_qentity.cpp4
-rw-r--r--tests/auto/core/qpostman/tst_qpostman.cpp221
-rw-r--r--tests/auto/core/qresourcemanager/tst_qresourcemanager.cpp21
-rw-r--r--tests/auto/core/qscene/tst_qscene.cpp4
-rw-r--r--tests/auto/core/qscheduler/qscheduler.pro7
-rw-r--r--tests/auto/core/qscheduler/tst_qscheduler.cpp201
-rw-r--r--tests/auto/core/qservicelocator/tst_qservicelocator.cpp16
-rw-r--r--tests/auto/core/qskeleton/tst_qskeleton.cpp36
-rw-r--r--tests/auto/core/qskeletonloader/tst_qskeletonloader.cpp65
-rw-r--r--tests/auto/core/qtransform/tst_qtransform.cpp4
-rw-r--r--tests/auto/core/threadpooler/tst_threadpooler.cpp2
-rw-r--r--tests/auto/coretest/qbackendnodetester.cpp6
-rw-r--r--tests/auto/coretest/testpostmanarbiter.cpp4
-rw-r--r--tests/auto/extras/common/geometrytesthelper.h3
-rw-r--r--tests/auto/global/aspects_startup_shutdown/tst_aspects_startup_shutdown.cpp4
-rw-r--r--tests/auto/input/abstractaxisinput/tst_abstractaxisinput.cpp2
-rw-r--r--tests/auto/input/action/tst_action.cpp1
-rw-r--r--tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp2
-rw-r--r--tests/auto/input/axis/tst_axis.cpp1
-rw-r--r--tests/auto/input/axisaccumulator/tst_axisaccumulator.cpp1
-rw-r--r--tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp2
-rw-r--r--tests/auto/input/input.pro3
-rw-r--r--tests/auto/input/loadproxydevicejob/tst_loadproxydevicejob.cpp1
-rw-r--r--tests/auto/input/mousedevice/tst_mousedevice.cpp73
-rw-r--r--tests/auto/input/physicaldeviceproxy/tst_physicaldeviceproxy.cpp2
-rw-r--r--tests/auto/input/qabstractphysicaldeviceproxy/tst_qabstractphysicaldeviceproxy.cpp1
-rw-r--r--tests/auto/input/qaction/tst_qaction.cpp1
-rw-r--r--tests/auto/input/qaxis/tst_qaxis.cpp1
-rw-r--r--tests/auto/input/qaxisaccumulator/tst_qaxisaccumulator.cpp1
-rw-r--r--tests/auto/input/qmousedevice/tst_qmousedevice.cpp45
-rw-r--r--tests/auto/input/qmouseevent/qmouseevent.pro11
-rw-r--r--tests/auto/input/qmouseevent/tst_qmouseevent.cpp93
-rw-r--r--tests/auto/render/buffer/tst_buffer.cpp64
-rw-r--r--tests/auto/render/commons/testrenderer.cpp5
-rw-r--r--tests/auto/render/commons/testrenderer.h24
-rw-r--r--tests/auto/render/computecommand/tst_computecommand.cpp48
-rw-r--r--tests/auto/render/ddstextures/tst_ddstextures.cpp4
-rw-r--r--tests/auto/render/effect/tst_effect.cpp1
-rw-r--r--tests/auto/render/entity/tst_entity.cpp52
-rw-r--r--tests/auto/render/geometry/tst_geometry.cpp4
-rw-r--r--tests/auto/render/geometryrenderer/tst_geometryrenderer.cpp4
-rw-r--r--tests/auto/render/gltexture/tst_gltexture.cpp4
-rw-r--r--tests/auto/render/ktxtextures/tst_ktxtextures.cpp4
-rw-r--r--tests/auto/render/layerfiltering/tst_layerfiltering.cpp1
-rw-r--r--tests/auto/render/meshfunctors/tst_meshfunctors.cpp4
-rw-r--r--tests/auto/render/objectpicker/tst_objectpicker.cpp1
-rw-r--r--tests/auto/render/opengl/computecommand/computecommand.pro15
-rw-r--r--tests/auto/render/opengl/computecommand/tst_computecommand.cpp143
-rw-r--r--tests/auto/render/opengl/filtercompatibletechniquejob/BLACKLIST (renamed from tests/auto/render/filtercompatibletechniquejob/BLACKLIST)0
-rw-r--r--tests/auto/render/opengl/filtercompatibletechniquejob/filtercompatibletechniquejob.pro (renamed from tests/auto/render/filtercompatibletechniquejob/filtercompatibletechniquejob.pro)7
-rw-r--r--tests/auto/render/opengl/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp (renamed from tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp)33
-rw-r--r--tests/auto/render/opengl/glshadermanager/glshadermanager.pro15
-rw-r--r--tests/auto/render/opengl/glshadermanager/tst_glshadermanager.cpp199
-rw-r--r--tests/auto/render/opengl/graphicshelpergl2/graphicshelpergl2.pro (renamed from tests/auto/render/graphicshelpergl2/graphicshelpergl2.pro)7
-rw-r--r--tests/auto/render/opengl/graphicshelpergl2/tst_graphicshelpergl2.cpp (renamed from tests/auto/render/graphicshelpergl2/tst_graphicshelpergl2.cpp)3
-rw-r--r--tests/auto/render/opengl/graphicshelpergl3_2/graphicshelpergl3_2.pro (renamed from tests/auto/render/graphicshelpergl3_2/graphicshelpergl3_2.pro)7
-rw-r--r--tests/auto/render/opengl/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp (renamed from tests/auto/render/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp)3
-rw-r--r--tests/auto/render/opengl/graphicshelpergl3_3/graphicshelpergl3_3.pro (renamed from tests/auto/render/graphicshelpergl3_3/graphicshelpergl3_3.pro)7
-rw-r--r--tests/auto/render/opengl/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp (renamed from tests/auto/render/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp)3
-rw-r--r--tests/auto/render/opengl/graphicshelpergl4/graphicshelpergl4.pro (renamed from tests/auto/render/graphicshelpergl4/graphicshelpergl4.pro)7
-rw-r--r--tests/auto/render/opengl/graphicshelpergl4/tst_graphicshelpergl4.cpp (renamed from tests/auto/render/graphicshelpergl4/tst_graphicshelpergl4.cpp)3
-rw-r--r--tests/auto/render/opengl/materialparametergathererjob/materialparametergathererjob.pro (renamed from tests/auto/render/materialparametergathererjob/materialparametergathererjob.pro)5
-rw-r--r--tests/auto/render/opengl/materialparametergathererjob/tst_materialparametergathererjob.cpp (renamed from tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp)60
-rw-r--r--tests/auto/render/opengl/opengl.pro19
-rw-r--r--tests/auto/render/opengl/opengl_render_plugin.pri18
-rw-r--r--tests/auto/render/opengl/qgraphicsutils/qgraphicsutils.pro (renamed from tests/auto/render/qgraphicsutils/qgraphicsutils.pro)3
-rw-r--r--tests/auto/render/opengl/qgraphicsutils/tst_qgraphicsutils.cpp (renamed from tests/auto/render/qgraphicsutils/tst_qgraphicsutils.cpp)78
-rw-r--r--tests/auto/render/opengl/renderer/renderer.pro (renamed from tests/auto/render/renderer/renderer.pro)3
-rw-r--r--tests/auto/render/opengl/renderer/tst_renderer.cpp (renamed from tests/auto/render/renderer/tst_renderer.cpp)138
-rw-r--r--tests/auto/render/opengl/renderqueue/renderqueue.pro (renamed from tests/auto/render/renderqueue/renderqueue.pro)5
-rw-r--r--tests/auto/render/opengl/renderqueue/tst_renderqueue.cpp (renamed from tests/auto/render/renderqueue/tst_renderqueue.cpp)36
-rw-r--r--tests/auto/render/opengl/renderviewbuilder/renderviewbuilder.pro (renamed from tests/auto/render/renderviewbuilder/renderviewbuilder.pro)7
-rw-r--r--tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp (renamed from tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp)229
-rw-r--r--tests/auto/render/opengl/renderviews/renderviews.pro (renamed from tests/auto/render/renderviews/renderviews.pro)7
-rw-r--r--tests/auto/render/opengl/renderviews/tst_renderviews.cpp (renamed from tests/auto/render/renderviews/tst_renderviews.cpp)255
-rw-r--r--tests/auto/render/opengl/renderviewutils/renderviewutils.pro (renamed from tests/auto/render/renderviewutils/renderviewutils.pro)7
-rw-r--r--tests/auto/render/opengl/renderviewutils/tst_renderviewutils.cpp (renamed from tests/auto/render/renderviewutils/tst_renderviewutils.cpp)83
-rw-r--r--tests/auto/render/opengl/textures/textures.pro (renamed from tests/auto/render/textures/textures.pro)7
-rw-r--r--tests/auto/render/opengl/textures/tst_textures.cpp (renamed from tests/auto/render/textures/tst_textures.cpp)63
-rw-r--r--tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp2
-rw-r--r--tests/auto/render/picking/tst_picking.cpp3
-rw-r--r--tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp18
-rw-r--r--tests/auto/render/qabstracttexture/tst_qabstracttexture.cpp3
-rw-r--r--tests/auto/render/qbuffer/tst_qbuffer.cpp4
-rw-r--r--tests/auto/render/qcamera/tst_qcamera.cpp1
-rw-r--r--tests/auto/render/qdefaultmeshes/tst_qdefaultmeshes.cpp4
-rw-r--r--tests/auto/render/qgeometry/tst_qgeometry.cpp4
-rw-r--r--tests/auto/render/qgeometryrenderer/tst_qgeometryrenderer.cpp4
-rw-r--r--tests/auto/render/qmesh/tst_qmesh.cpp3
-rw-r--r--tests/auto/render/qraycaster/tst_qraycaster.cpp55
-rw-r--r--tests/auto/render/qrendercapture/tst_qrendercapture.cpp3
-rw-r--r--tests/auto/render/qsetfence/tst_qsetfence.cpp4
-rw-r--r--tests/auto/render/qshaderprogram/tst_qshaderprogram.cpp68
-rw-r--r--tests/auto/render/qsharedgltexture/tst_qsharedgltexture.cpp3
-rw-r--r--tests/auto/render/qtextureimage/tst_qtextureimage.cpp3
-rw-r--r--tests/auto/render/qtextureloader/tst_qtextureloader.cpp3
-rw-r--r--tests/auto/render/raycaster/tst_raycaster.cpp1
-rw-r--r--tests/auto/render/raycastingjob/tst_raycastingjob.cpp1
-rw-r--r--tests/auto/render/render.pro19
-rw-r--r--tests/auto/render/scene2d/tst_scene2d.cpp3
-rw-r--r--tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp27
-rw-r--r--tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro12
-rw-r--r--tests/auto/render/sendrendercapturejob/tst_sendrendercapturejob.cpp85
-rw-r--r--tests/auto/render/setfence/tst_setfence.cpp4
-rw-r--r--tests/auto/render/shader/tst_shader.cpp94
-rw-r--r--tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp1
-rw-r--r--tests/auto/render/shadercache/shadercache.pro11
-rw-r--r--tests/auto/render/shadercache/tst_shadercache.cpp293
-rw-r--r--tests/auto/render/skeleton/tst_skeleton.cpp85
-rw-r--r--tests/auto/render/technique/tst_technique.cpp1
-rw-r--r--tests/auto/render/transform/tst_transform.cpp1
-rw-r--r--tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp1
-rw-r--r--tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp26
-rw-r--r--tests/auto/render/uniform/tst_uniform.cpp2
-rw-r--r--tests/auto/render/vsyncframeadvanceservice/tst_vsyncframeadvanceservice.cpp2
-rw-r--r--tests/benchmarks/render/jobs/jobs.pro4
-rw-r--r--tests/benchmarks/render/jobs/tst_bench_jobs.cpp24
-rw-r--r--tests/benchmarks/render/materialparametergathering/materialparametergathering.pro3
-rw-r--r--tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp8
-rw-r--r--tests/manual/compute-manual/ComputeFrameGraph.qml91
-rw-r--r--tests/manual/compute-manual/ComputeMaterial.qml118
-rw-r--r--tests/manual/compute-manual/ParticlesScene.qml200
-rw-r--r--tests/manual/compute-manual/compute-manual.pro14
-rw-r--r--tests/manual/compute-manual/compute-manual.qrc11
-rw-r--r--tests/manual/compute-manual/main.cpp66
-rw-r--r--tests/manual/compute-manual/main.qml109
-rw-r--r--tests/manual/compute-manual/particles.comp31
-rw-r--r--tests/manual/compute-manual/particles.frag33
-rw-r--r--tests/manual/compute-manual/particles.vert27
-rw-r--r--tests/manual/manual-renderloop/main.cpp211
-rw-r--r--tests/manual/manual-renderloop/manual-renderloop.pro8
-rw-r--r--tests/manual/manual.pro8
-rw-r--r--tests/manual/rendercapture-qml/main.qml2
-rw-r--r--tests/manual/scene3d-visibility/main.cpp66
-rw-r--r--tests/manual/scene3d-visibility/main.qml161
-rw-r--r--tests/manual/scene3d-visibility/scene3d-visibility.pro10
-rw-r--r--tests/manual/scene3d-visibility/scene3d-visibility.qrc5
-rw-r--r--tests/manual/sharedtexture/main.cpp3
-rw-r--r--tests/manual/sharedtexture/videoplayer.cpp28
-rw-r--r--tests/manual/sharedtexture/videoplayer.h10
-rw-r--r--tests/manual/sharedtextureqml/main.cpp3
-rw-r--r--tests/manual/subtree-enabler-qml/FrameGraph.qml100
-rw-r--r--tests/manual/subtree-enabler-qml/SimpleCamera.qml79
-rw-r--r--tests/manual/subtree-enabler-qml/main.cpp64
-rw-r--r--tests/manual/subtree-enabler-qml/main.qml110
-rw-r--r--tests/manual/subtree-enabler-qml/subtree-enabler-qml.pro17
-rw-r--r--tests/manual/subtree-enabler-qml/subtree-enabler-qml.qrc7
160 files changed, 3620 insertions, 1594 deletions
diff --git a/tests/auto/animation/animationclip/tst_animationclip.cpp b/tests/auto/animation/animationclip/tst_animationclip.cpp
index 35df21a58..d28a8fc58 100644
--- a/tests/auto/animation/animationclip/tst_animationclip.cpp
+++ b/tests/auto/animation/animationclip/tst_animationclip.cpp
@@ -31,9 +31,7 @@
#include <Qt3DAnimation/qanimationcliploader.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
-#include <Qt3DCore/private/qpropertyupdatedchangebase_p.h>
#include <qbackendnodetester.h>
#include <testpostmanarbiter.h>
diff --git a/tests/auto/animation/animationutils/tst_animationutils.cpp b/tests/auto/animation/animationutils/tst_animationutils.cpp
index 463656557..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)
diff --git a/tests/auto/animation/blendedclipanimator/tst_blendedclipanimator.cpp b/tests/auto/animation/blendedclipanimator/tst_blendedclipanimator.cpp
index bb95fe979..fb741050b 100644
--- a/tests/auto/animation/blendedclipanimator/tst_blendedclipanimator.cpp
+++ b/tests/auto/animation/blendedclipanimator/tst_blendedclipanimator.cpp
@@ -33,7 +33,6 @@
#include <Qt3DAnimation/qblendedclipanimator.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
#include <qbackendnodetester.h>
#include <testpostmanarbiter.h>
@@ -44,7 +43,6 @@
#include <Qt3DAnimation/qchannelmapper.h>
#include <Qt3DAnimation/private/qblendedclipanimator_p.h>
#include <Qt3DAnimation/private/blendedclipanimator_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include "qbackendnodetester.h"
class tst_BlendedClipAnimator : public Qt3DCore::QBackendNodeTester
diff --git a/tests/auto/animation/channelmapping/tst_channelmapping.cpp b/tests/auto/animation/channelmapping/tst_channelmapping.cpp
index e108e3d26..26a57449d 100644
--- a/tests/auto/animation/channelmapping/tst_channelmapping.cpp
+++ b/tests/auto/animation/channelmapping/tst_channelmapping.cpp
@@ -38,7 +38,6 @@
#include <Qt3DCore/qskeleton.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
#include "testpostmanarbiter.h"
@@ -181,16 +180,31 @@ private Q_SLOTS:
const char *testName = "translation";
QCOMPARE(qstrcmp(testName, backendMapping.propertyName()), 0);
+ }
-// // WHEN
-// const auto skeletonId = Qt3DCore::QNodeId::createId();
-// updateChange = QSharedPointer<Qt3DCore::QPropertyUpdatedChange>::create(Qt3DCore::QNodeId());
-// updateChange->setPropertyName("skeleton");
-// updateChange->setValue(QVariant::fromValue(skeletonId));
-// backendMapping.sceneChangeEvent(updateChange);
+ void checkSkeletonPropertyUpdate()
+ {
+ // GIVEN
+ Qt3DAnimation::QSkeletonMapping mapping;
+ Qt3DAnimation::Animation::Handler handler;
+ Qt3DAnimation::Animation::ChannelMapping backendMapping;
+ backendMapping.setHandler(&handler);
+ simulateInitializationSync(&mapping, &backendMapping);
-// // THEN
-// QCOMPARE(backendMapping.skeletonId(), skeletonId);
+ // WHEN
+ mapping.setEnabled(false);
+ backendMapping.syncFromFrontEnd(&mapping, false);
+
+ // THEN
+ QCOMPARE(backendMapping.isEnabled(), false);
+
+ // WHEN
+ auto skeleton = new Qt3DCore::QSkeleton;
+ mapping.setSkeleton(skeleton);
+ backendMapping.syncFromFrontEnd(&mapping, false);
+
+ // THEN
+ QCOMPARE(backendMapping.skeletonId(), skeleton->id());
}
};
diff --git a/tests/auto/animation/qanimationcliploader/tst_qanimationcliploader.cpp b/tests/auto/animation/qanimationcliploader/tst_qanimationcliploader.cpp
index 274144d3e..00130add3 100644
--- a/tests/auto/animation/qanimationcliploader/tst_qanimationcliploader.cpp
+++ b/tests/auto/animation/qanimationcliploader/tst_qanimationcliploader.cpp
@@ -30,7 +30,6 @@
#include <QtTest/QTest>
#include <Qt3DAnimation/qanimationcliploader.h>
#include <Qt3DAnimation/private/qanimationcliploader_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/qnodecreatedchange.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
#include <QObject>
diff --git a/tests/auto/animation/skeleton/tst_skeleton.cpp b/tests/auto/animation/skeleton/tst_skeleton.cpp
index 99acf0b43..d9b209194 100644
--- a/tests/auto/animation/skeleton/tst_skeleton.cpp
+++ b/tests/auto/animation/skeleton/tst_skeleton.cpp
@@ -32,7 +32,6 @@
#include <Qt3DAnimation/private/skeleton_p.h>
#include <Qt3DAnimation/private/handler_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
#include <qbackendnodetester.h>
#include <testpostmanarbiter.h>
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 cecc24f93..e927c2489 100644
--- a/tests/auto/core/common/testpostmanarbiter.h
+++ b/tests/auto/core/common/testpostmanarbiter.h
@@ -70,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 37c707aa7..3e4a8479d 100644
--- a/tests/auto/core/core.pro
+++ b/tests/auto/core/core.pro
@@ -22,10 +22,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 d65e20708..c39638754 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,6 +44,7 @@
#include <Qt3DCore/qpropertynoderemovedchange.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
#include <Qt3DCore/private/qaspectengine_p.h>
+#include <Qt3DCore/private/qaspectengine_p.h>
#include <private/qabstractaspect_p.h>
#include <private/qpostman_p.h>
@@ -92,6 +97,7 @@ private slots:
void checkConstructionWithNonRootParent(); // QTBUG-73986
void checkConstructionAsListElement();
void checkSceneIsSetOnConstructionWithParent(); // QTBUG-69352
+ void checkSubNodePostConstructIsCalledWhenReferincingNodeProperty(); // QTBUG-79350
void appendingComponentToEntity();
void appendingParentlessComponentToEntityWithoutScene();
@@ -290,22 +296,15 @@ public slots:
if (!attribute->parent())
attribute->setParent(this);
- if (d->m_changeArbiter != nullptr) {
- const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), attribute);
- change->setPropertyName("attribute");
- d->notifyObservers(change);
- }
+ d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueAdded);
}
}
void removeAttribute(MyQNode *attribute)
{
Qt3DCore::QNodePrivate *d = Qt3DCore::QNodePrivate::get(this);
- if (d->m_changeArbiter != nullptr) {
- const auto change = Qt3DCore::QPropertyNodeRemovedChangePtr::create(id(), attribute);
- change->setPropertyName("attribute");
- d->notifyObservers(change);
- }
+ d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved);
+
m_attributes.removeOne(attribute);
// Remove bookkeeping connection
d->unregisterDestructionHelper(attribute);
@@ -384,11 +383,7 @@ public:
if (!attribute->parent())
attribute->setParent(this);
- if (d->m_changeArbiter != nullptr) {
- const auto change = Qt3DCore::QPropertyNodeAddedChangePtr::create(id(), attribute);
- change->setPropertyName("attribute");
- d->notifyObservers(change);
- }
+ d->updateNode(attribute, "attribute", Qt3DCore::PropertyValueRemoved);
}
}
@@ -435,6 +430,29 @@ public:
}
};
+class MyFakeMaterial : public Qt3DCore::QComponent
+{
+ Q_OBJECT
+public:
+ explicit MyFakeMaterial(Qt3DCore::QNode *parent = nullptr)
+ : QComponent(parent)
+ , m_effect(new MyQNode(this))
+ , m_technique(new MyQNode(m_effect))
+ , m_renderPass(new MyQNode(m_technique))
+ {
+ }
+
+ void setArbiter(Qt3DCore::QAbstractArbiter *arbiter)
+ {
+ Q_ASSERT(arbiter);
+ Qt3DCore::QComponentPrivate::get(this)->setArbiter(arbiter);
+ }
+
+ MyQNode *m_effect;
+ MyQNode *m_technique;
+ MyQNode *m_renderPass;
+};
+
class TestAspectPrivate;
class TestAspect : public Qt3DCore::QAbstractAspect
{
@@ -928,6 +946,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent()
// GIVEN
ObserverSpy spy;
Qt3DCore::QAspectEngine engine;
+ engine.setRunMode(Qt3DCore::QAspectEngine::Manual);
QScopedPointer<MyQEntity> root(new MyQEntity());
root->setArbiterAndEngine(&spy, &engine);
auto aspect = new TestAspect;
@@ -937,6 +956,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent()
MyQNode *child2(new MyQNode(root.data()));
QCoreApplication::processEvents();
+ engine.processFrame();
// Due to the way we create root, it has a backend
QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->m_hasBackendNode == true);
@@ -967,6 +987,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent()
// WHEN
QCoreApplication::processEvents();
+ engine.processFrame();
// THEN
QCOMPARE(spy.events.size(), 2);
@@ -1043,6 +1064,7 @@ void tst_Nodes::checkParentChangeFromExistingBackendParentToNewlyCreatedParent()
// WHEN
QCoreApplication::processEvents();
+ engine.processFrame();
// THEN
QCOMPARE(spy.events.size(), 2);
@@ -1221,6 +1243,7 @@ void tst_Nodes::checkAllBackendCreationDoneInSingleFrame()
// GIVEN
ObserverSpy spy;
Qt3DCore::QAspectEngine engine;
+ engine.setRunMode(Qt3DCore::QAspectEngine::Manual);
auto aspect = new TestAspect;
engine.registerAspect(aspect);
@@ -1253,6 +1276,7 @@ void tst_Nodes::checkAllBackendCreationDoneInSingleFrame()
// WHEN
QCoreApplication::processEvents();
+ engine.processFrame();
// THEN - both children have their backend nodes actually created.
QCOMPARE(aspect->events.count(), 2);
@@ -1544,20 +1568,8 @@ void tst_Nodes::checkConstructionAsListElement()
QCoreApplication::processEvents();
QCOMPARE(root->children().count(), 1);
- QCOMPARE(spy.events.size(), 2); // 1 child added change, 1 property change
-
- const auto newChildEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>();
- QVERIFY(!newChildEvent.isNull());
- QCOMPARE(newChildEvent->subjectId(), root->id());
- QCOMPARE(newChildEvent->propertyName(), "children");
- QCOMPARE(newChildEvent->addedNodeId(), node->id());
-
- // Ensure second and last event is property set change
- const auto propertyEvent = spy.events.takeFirst().change().dynamicCast<Qt3DCore::QPropertyNodeAddedChange>();
- QVERIFY(!propertyEvent.isNull());
- QCOMPARE(propertyEvent->subjectId(), root->id());
- QCOMPARE(propertyEvent->propertyName(), "attribute");
- QCOMPARE(newChildEvent->addedNodeId(), node->id());
+ QCOMPARE(spy.dirtyNodes.size(), 1); // 1 property change
+ QCOMPARE(spy.dirtySubNodes.size(), 1); // 1 child added change
}
void tst_Nodes::checkSceneIsSetOnConstructionWithParent()
@@ -1606,6 +1618,52 @@ void tst_Nodes::checkSceneIsSetOnConstructionWithParent()
QCOMPARE(spy.dirtySubNodes.size(), 5); // 5 entities changed
}
+void tst_Nodes::checkSubNodePostConstructIsCalledWhenReferincingNodeProperty()
+{
+ // GIVEN
+ ObserverSpy spy;
+ Qt3DCore::QAspectEngine engine;
+ Qt3DCore::QScene scene(&engine);
+ QScopedPointer<MyQNode> root(new MyQNode());
+
+ // WHEN
+ root->setArbiterAndScene(&spy, &scene);
+ root->setSimulateBackendCreated(true);
+
+ // THEN
+ QVERIFY(Qt3DCore::QNodePrivate::get(root.data())->scene() != nullptr);
+
+ // WHEN
+ Qt3DCore::QEntity *subTreeRoot = new Qt3DCore::QEntity(root.data());
+ QCoreApplication::processEvents();
+
+ // THEN
+ QVERIFY(Qt3DCore::QNodePrivate::get(subTreeRoot)->m_hasBackendNode);
+
+ // WHEN
+ MyFakeMaterial *material = new MyFakeMaterial(subTreeRoot);
+ subTreeRoot->addComponent(material);
+
+ // THEN
+ QVERIFY(Qt3DCore::QNodePrivate::get(material)->m_hasBackendNode);
+ QVERIFY(Qt3DCore::QNodePrivate::get(material->m_effect)->m_hasBackendNode);
+ QVERIFY(Qt3DCore::QNodePrivate::get(material->m_technique)->m_hasBackendNode);
+ QVERIFY(Qt3DCore::QNodePrivate::get(material->m_renderPass)->m_hasBackendNode);
+
+ // WHEN
+ MyQNode *fakeRenderState = new MyQNode(material);
+ Qt3DCore::QNodePrivate *dPtr = Qt3DCore::QNodePrivate::get(fakeRenderState);
+
+ // THEN
+ QVERIFY(!dPtr->m_hasBackendNode);
+
+ // WHEN
+ material->m_renderPass->addAttribute(fakeRenderState);
+
+ // THEN
+ QVERIFY(dPtr->m_hasBackendNode);
+}
+
void tst_Nodes::appendingParentlessComponentToEntityWithoutScene()
{
// GIVEN
diff --git a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp
index eb20536e6..48443a66f 100644
--- a/tests/auto/core/qaspectengine/tst_qaspectengine.cpp
+++ b/tests/auto/core/qaspectengine/tst_qaspectengine.cpp
@@ -146,6 +146,10 @@ private Q_SLOTS:
void shouldNotCrashInNormalStartupShutdownSequence()
{
+#ifdef Q_OS_MACOS
+ QSKIP("Test frequently times out. See QTBUG-80660.");
+#endif
+
// GIVEN
// An initialized aspect engine...
QAspectEngine engine;
@@ -168,7 +172,7 @@ private Q_SLOTS:
engine.setRootEntity(entity);
QEventLoop eventLoop;
- QTimer::singleShot(100, &eventLoop, SLOT(quit()));
+ QTimer::singleShot(1000, &eventLoop, SLOT(quit()));
eventLoop.exec();
// THEN
@@ -179,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();
@@ -243,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/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/qresourcemanager/tst_qresourcemanager.cpp b/tests/auto/core/qresourcemanager/tst_qresourcemanager.cpp
index 9a387a919..a41ea83b5 100644
--- a/tests/auto/core/qresourcemanager/tst_qresourcemanager.cpp
+++ b/tests/auto/core/qresourcemanager/tst_qresourcemanager.cpp
@@ -50,6 +50,7 @@ private slots:
void heavyDutyMultiThreadedAccessRelease();
void collectResources();
void activeHandles();
+ void checkCleanup();
};
class tst_ArrayResource
@@ -422,6 +423,26 @@ void tst_QResourceManager::activeHandles()
}
}
+void tst_QResourceManager::checkCleanup()
+{
+ // GIVEN
+ Qt3DCore::QResourceManager<tst_ArrayResource, uint> manager;
+
+ // WHEN
+ tHandle newHandle = manager.getOrAcquireHandle(883U);
+ tst_ArrayResource *data = manager.data(newHandle);
+
+ data->m_value.ref();
+ // THEN
+ QCOMPARE(data->m_value.load(), 1);
+
+ // WHEN
+ manager.release(newHandle);
+
+ // THEN
+ QCOMPARE(data->m_value.load(), 0);
+}
+
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/qskeleton/tst_qskeleton.cpp b/tests/auto/core/qskeleton/tst_qskeleton.cpp
index 299567806..5c88bd754 100644
--- a/tests/auto/core/qskeleton/tst_qskeleton.cpp
+++ b/tests/auto/core/qskeleton/tst_qskeleton.cpp
@@ -30,7 +30,6 @@
#include <Qt3DCore/qskeleton.h>
#include <Qt3DCore/private/qskeleton_p.h>
#include <Qt3DCore/qjoint.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
@@ -160,41 +159,6 @@ private Q_SLOTS:
// THEN Should not crash when the joint is destroyed (tests for failed removal of destruction helper)
}
}
-
- void checkJointCountPropertyUpdate()
- {
- // GIVEN
- TestArbiter arbiter;
- arbiter.setArbiterOnNode(this);
- QSignalSpy spy(this, SIGNAL(jointCountChanged(int)));
- const int newJointCount = 99;
-
- // THEN
- QVERIFY(spy.isValid());
-
- // WHEN
- auto valueChange = QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId());
- valueChange->setPropertyName("jointCount");
- valueChange->setValue(QVariant(newJointCount));
- sceneChangeEvent(valueChange);
-
- // THEN
- QCOMPARE(spy.count(), 1);
- QCOMPARE(arbiter.events.size(), 0);
- QCOMPARE(jointCount(), newJointCount);
-
- // WHEN
- spy.clear();
- sceneChangeEvent(valueChange);
-
- // THEN
- QCOMPARE(spy.count(), 0);
- QCOMPARE(arbiter.events.size(), 0);
- QCOMPARE(jointCount(), newJointCount);
-
- // Cleanup
- QNodePrivate::get(this)->setArbiter(nullptr);
- }
};
QTEST_MAIN(tst_QSkeleton)
diff --git a/tests/auto/core/qskeletonloader/tst_qskeletonloader.cpp b/tests/auto/core/qskeletonloader/tst_qskeletonloader.cpp
index 7fcdc4bbe..f0f4c3872 100644
--- a/tests/auto/core/qskeletonloader/tst_qskeletonloader.cpp
+++ b/tests/auto/core/qskeletonloader/tst_qskeletonloader.cpp
@@ -209,71 +209,6 @@ private Q_SLOTS:
QCOMPARE(arbiter.events.size(), 0);
}
}
-
- void checkStatusPropertyUpdate()
- {
- // GIVEN
- qRegisterMetaType<Qt3DCore::QSkeletonLoader::Status>("Status");
- TestArbiter arbiter;
- arbiter.setArbiterOnNode(this);
- QSignalSpy spy(this, SIGNAL(statusChanged(Status)));
- const QSkeletonLoader::Status newStatus = QSkeletonLoader::Error;
-
- // THEN
- QVERIFY(spy.isValid());
-
- // WHEN
- QPropertyUpdatedChangePtr valueChange(new QPropertyUpdatedChange(QNodeId()));
- valueChange->setPropertyName("status");
- valueChange->setValue(QVariant::fromValue(newStatus));
- sceneChangeEvent(valueChange);
-
- // THEN
- QCOMPARE(spy.count(), 1);
- QCOMPARE(arbiter.events.size(), 0);
- QCOMPARE(status(), newStatus);
-
- // WHEN
- spy.clear();
- sceneChangeEvent(valueChange);
-
- // THEN
- QCOMPARE(spy.count(), 0);
- QCOMPARE(arbiter.events.size(), 0);
- QCOMPARE(status(), newStatus);
-
- // Cleanup
- QNodePrivate::get(this)->setArbiter(nullptr);
- }
-
- void checkRootJointPropertyUpdate()
- {
- // GIVEN
- qRegisterMetaType<Qt3DCore::QJoint*>();
- TestArbiter arbiter;
- arbiter.setArbiterOnNode(this);
- QSignalSpy spy(this, SIGNAL(rootJointChanged(Qt3DCore::QJoint*)));
- std::unique_ptr<QJoint> root(new QJoint());
-
- // THEN
- QVERIFY(spy.isValid());
- QVERIFY(rootJoint() == nullptr);
-
- // WHEN
- auto valueChange = QJointChangePtr::create(id());
- valueChange->setDeliveryFlags(Qt3DCore::QSceneChange::Nodes);
- valueChange->setPropertyName("rootJoint");
- valueChange->data = std::move(root);
- sceneChangeEvent(valueChange);
-
- // THEN
- QCOMPARE(spy.count(), 1);
- QCOMPARE(arbiter.dirtyNodes.size(), 1);
- QVERIFY(rootJoint() != nullptr);
-
- // Cleanup
- QNodePrivate::get(this)->setArbiter(nullptr);
- }
};
QTEST_MAIN(tst_QSkeletonLoader)
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 cfe3480ee..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()
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/global/aspects_startup_shutdown/tst_aspects_startup_shutdown.cpp b/tests/auto/global/aspects_startup_shutdown/tst_aspects_startup_shutdown.cpp
index 9eec010be..00e4890c8 100644
--- a/tests/auto/global/aspects_startup_shutdown/tst_aspects_startup_shutdown.cpp
+++ b/tests/auto/global/aspects_startup_shutdown/tst_aspects_startup_shutdown.cpp
@@ -143,6 +143,8 @@ private slots:
void checkStartupAndShutdownImmediately()
{
+ QSKIP("Fails on CI for some unexplained reason");
+
// GIVEN
QWindow *win = new QWindow();
win->setSurfaceType(QSurface::OpenGLSurface);
@@ -170,6 +172,8 @@ private slots:
void checkStartupAndShutdownAfterAFewFrames()
{
+ QSKIP("Fails on CI for some unexplained reason");
+
// GIVEN
QWindow *win = new QWindow();
win->setSurfaceType(QSurface::OpenGLSurface);
diff --git a/tests/auto/input/abstractaxisinput/tst_abstractaxisinput.cpp b/tests/auto/input/abstractaxisinput/tst_abstractaxisinput.cpp
index 48ac4b3fe..94f02bc1e 100644
--- a/tests/auto/input/abstractaxisinput/tst_abstractaxisinput.cpp
+++ b/tests/auto/input/abstractaxisinput/tst_abstractaxisinput.cpp
@@ -30,11 +30,9 @@
#include <qbackendnodetester.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DInput/private/abstractaxisinput_p.h>
#include <Qt3DInput/QAbstractAxisInput>
#include <Qt3DInput/private/qabstractaxisinput_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include "testdevice.h"
class DummyAxisInput : public Qt3DInput::QAbstractAxisInput
diff --git a/tests/auto/input/action/tst_action.cpp b/tests/auto/input/action/tst_action.cpp
index 6b8b11b80..cc40cef2f 100644
--- a/tests/auto/input/action/tst_action.cpp
+++ b/tests/auto/input/action/tst_action.cpp
@@ -30,7 +30,6 @@
#include <qbackendnodetester.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/qpropertynodeaddedchange.h>
#include <Qt3DCore/qpropertynoderemovedchange.h>
#include <Qt3DInput/private/action_p.h>
diff --git a/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp b/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp
index 0bdaadc46..6f91ce337 100644
--- a/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp
+++ b/tests/auto/input/analogaxisinput/tst_analogaxisinput.cpp
@@ -32,11 +32,9 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DInput/private/analogaxisinput_p.h>
#include <Qt3DInput/private/inputhandler_p.h>
#include <Qt3DInput/QAnalogAxisInput>
-#include <Qt3DCore/qpropertyupdatedchange.h>
class tst_AnalogAxisInput: public Qt3DCore::QBackendNodeTester
{
diff --git a/tests/auto/input/axis/tst_axis.cpp b/tests/auto/input/axis/tst_axis.cpp
index de9d5c553..ddd59b395 100644
--- a/tests/auto/input/axis/tst_axis.cpp
+++ b/tests/auto/input/axis/tst_axis.cpp
@@ -30,7 +30,6 @@
#include <qbackendnodetester.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/qpropertynodeaddedchange.h>
#include <Qt3DCore/qpropertynoderemovedchange.h>
#include <Qt3DInput/private/axis_p.h>
diff --git a/tests/auto/input/axisaccumulator/tst_axisaccumulator.cpp b/tests/auto/input/axisaccumulator/tst_axisaccumulator.cpp
index f7d7d32f1..f8d4adcd2 100644
--- a/tests/auto/input/axisaccumulator/tst_axisaccumulator.cpp
+++ b/tests/auto/input/axisaccumulator/tst_axisaccumulator.cpp
@@ -28,7 +28,6 @@
#include <QtTest/QTest>
#include <qbackendnodetester.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DInput/private/axis_p.h>
diff --git a/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp b/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp
index 5debe4d99..e315ed1dc 100644
--- a/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp
+++ b/tests/auto/input/buttonaxisinput/tst_buttonaxisinput.cpp
@@ -32,11 +32,9 @@
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DInput/private/buttonaxisinput_p.h>
#include <Qt3DInput/private/inputhandler_p.h>
#include <Qt3DInput/QButtonAxisInput>
-#include <Qt3DCore/qpropertyupdatedchange.h>
class tst_ButtonAxisInput: public Qt3DCore::QBackendNodeTester
{
diff --git a/tests/auto/input/input.pro b/tests/auto/input/input.pro
index 6169d3f7c..7799c2b89 100644
--- a/tests/auto/input/input.pro
+++ b/tests/auto/input/input.pro
@@ -29,5 +29,6 @@ qtConfig(private_tests) {
mousedevice \
utils \
axisaccumulator \
- axisaccumulatorjob
+ axisaccumulatorjob \
+ qmouseevent
}
diff --git a/tests/auto/input/loadproxydevicejob/tst_loadproxydevicejob.cpp b/tests/auto/input/loadproxydevicejob/tst_loadproxydevicejob.cpp
index 985ee1955..c5322eda6 100644
--- a/tests/auto/input/loadproxydevicejob/tst_loadproxydevicejob.cpp
+++ b/tests/auto/input/loadproxydevicejob/tst_loadproxydevicejob.cpp
@@ -33,7 +33,6 @@
#include <Qt3DInput/private/inputhandler_p.h>
#include <Qt3DInput/private/physicaldeviceproxy_p.h>
#include <Qt3DInput/private/qinputdeviceintegration_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
#include "qbackendnodetester.h"
#include "testdeviceproxy.h"
diff --git a/tests/auto/input/mousedevice/tst_mousedevice.cpp b/tests/auto/input/mousedevice/tst_mousedevice.cpp
index 41ecd68c7..cad1ab951 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()
@@ -249,6 +305,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/physicaldeviceproxy/tst_physicaldeviceproxy.cpp b/tests/auto/input/physicaldeviceproxy/tst_physicaldeviceproxy.cpp
index aaf46a54b..bd5da8e3f 100644
--- a/tests/auto/input/physicaldeviceproxy/tst_physicaldeviceproxy.cpp
+++ b/tests/auto/input/physicaldeviceproxy/tst_physicaldeviceproxy.cpp
@@ -32,9 +32,7 @@
#include <Qt3DInput/private/qabstractphysicaldeviceproxy_p_p.h>
#include <Qt3DInput/private/physicaldeviceproxy_p.h>
#include <Qt3DInput/private/inputmanagers_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
-#include <Qt3DCore/private/qpropertyupdatedchangebase_p.h>
#include "qbackendnodetester.h"
#include "testdeviceproxy.h"
#include "testpostmanarbiter.h"
diff --git a/tests/auto/input/qabstractphysicaldeviceproxy/tst_qabstractphysicaldeviceproxy.cpp b/tests/auto/input/qabstractphysicaldeviceproxy/tst_qabstractphysicaldeviceproxy.cpp
index aef76cc0d..bbe184e0e 100644
--- a/tests/auto/input/qabstractphysicaldeviceproxy/tst_qabstractphysicaldeviceproxy.cpp
+++ b/tests/auto/input/qabstractphysicaldeviceproxy/tst_qabstractphysicaldeviceproxy.cpp
@@ -29,7 +29,6 @@
#include <QtTest/QTest>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
#include <Qt3DCore/qnodecreatedchange.h>
#include "testdeviceproxy.h"
diff --git a/tests/auto/input/qaction/tst_qaction.cpp b/tests/auto/input/qaction/tst_qaction.cpp
index 8d097978f..13c4a2d83 100644
--- a/tests/auto/input/qaction/tst_qaction.cpp
+++ b/tests/auto/input/qaction/tst_qaction.cpp
@@ -27,7 +27,6 @@
****************************************************************************/
#include <QtTest/QTest>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
diff --git a/tests/auto/input/qaxis/tst_qaxis.cpp b/tests/auto/input/qaxis/tst_qaxis.cpp
index 36d434c6a..9b3068442 100644
--- a/tests/auto/input/qaxis/tst_qaxis.cpp
+++ b/tests/auto/input/qaxis/tst_qaxis.cpp
@@ -27,7 +27,6 @@
****************************************************************************/
#include <QtTest/QTest>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
diff --git a/tests/auto/input/qaxisaccumulator/tst_qaxisaccumulator.cpp b/tests/auto/input/qaxisaccumulator/tst_qaxisaccumulator.cpp
index e4145ab7a..9f96cd845 100644
--- a/tests/auto/input/qaxisaccumulator/tst_qaxisaccumulator.cpp
+++ b/tests/auto/input/qaxisaccumulator/tst_qaxisaccumulator.cpp
@@ -27,7 +27,6 @@
****************************************************************************/
#include <QtTest/QTest>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/private/qnodecreatedchangegenerator_p.h>
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/input/qmouseevent/qmouseevent.pro b/tests/auto/input/qmouseevent/qmouseevent.pro
new file mode 100644
index 000000000..70f4c6eda
--- /dev/null
+++ b/tests/auto/input/qmouseevent/qmouseevent.pro
@@ -0,0 +1,11 @@
+TEMPLATE = app
+
+TARGET = tst_qmouseevent
+
+QT += 3dcore 3dcore-private 3dinput 3dinput-private testlib
+
+CONFIG += testcase
+
+SOURCES += tst_qmouseevent.cpp
+
+include(../commons/commons.pri)
diff --git a/tests/auto/input/qmouseevent/tst_qmouseevent.cpp b/tests/auto/input/qmouseevent/tst_qmouseevent.cpp
new file mode 100644
index 000000000..b48afb99d
--- /dev/null
+++ b/tests/auto/input/qmouseevent/tst_qmouseevent.cpp
@@ -0,0 +1,93 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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 <Qt3DInput/qmouseevent.h>
+#include <QtGui/QMouseEvent>
+#include <QObject>
+#include <QSignalSpy>
+
+class tst_QMouseEvent : public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+ void checkModifiers()
+ {
+ {
+ // GIVEN
+ QT_PREPEND_NAMESPACE(QMouseEvent) event(QEvent::MouseButtonPress,
+ QPointF(500, 500),
+ QPointF(500, 500),
+ Qt::LeftButton,
+ Qt::LeftButton,
+ Qt::NoModifier);
+
+ // WHEN
+ Qt3DInput::QMouseEvent event3D(event);
+
+ // THEN
+ QCOMPARE(event3D.modifiers(), Qt3DInput::QMouseEvent::NoModifier);
+ }
+ {
+ // GIVEN
+ QT_PREPEND_NAMESPACE(QMouseEvent) event(QEvent::MouseButtonPress,
+ QPointF(500, 500),
+ QPointF(500, 500),
+ Qt::LeftButton,
+ Qt::LeftButton,
+ Qt::ShiftModifier);
+
+ // WHEN
+ Qt3DInput::QMouseEvent event3D(event);
+
+ // THEN
+ QCOMPARE(event3D.modifiers(), Qt3DInput::QMouseEvent::ShiftModifier);
+ }
+ {
+ // GIVEN
+ QT_PREPEND_NAMESPACE(QMouseEvent) event(QEvent::MouseButtonPress,
+ QPointF(500, 500),
+ QPointF(500, 500),
+ Qt::LeftButton,
+ Qt::LeftButton,
+ Qt::ShiftModifier|Qt::ControlModifier);
+
+ // WHEN
+ Qt3DInput::QMouseEvent event3D(event);
+
+ // THEN
+ QCOMPARE(int(event3D.modifiers()), int(Qt3DInput::QMouseEvent::ShiftModifier|Qt3DInput::QMouseEvent::ControlModifier));
+ }
+ }
+};
+
+QTEST_MAIN(tst_QMouseEvent)
+
+#include "tst_qmouseevent.moc"
diff --git a/tests/auto/render/buffer/tst_buffer.cpp b/tests/auto/render/buffer/tst_buffer.cpp
index 48215bea5..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>
@@ -157,6 +161,61 @@ private Q_SLOTS:
QVERIFY(backendBuffer.pendingBufferUpdates().empty());
}
+
+ void checkForceFullUploadOnFirstTime()
+ {
+ // GIVEN
+ Qt3DRender::Render::Buffer backendBuffer;
+ Qt3DRender::Render::BufferManager bufferManager;
+ TestRenderer renderer;
+ Qt3DRender::QBuffer frontendBuffer;
+
+ QByteArray data("111456789\0");
+
+ frontendBuffer.setData(data);
+ frontendBuffer.updateData(1, QByteArray("23\0"));
+
+ // THEN
+ QCOMPARE(frontendBuffer.data(), QByteArray("123456789\0"));
+
+ // WHEN
+ backendBuffer.setManager(&bufferManager);
+ backendBuffer.setRenderer(&renderer);
+ simulateInitializationSync(&frontendBuffer, &backendBuffer);
+
+ // THEN
+ QCOMPARE(backendBuffer.pendingBufferUpdates().size(), 1);
+ Qt3DRender::QBufferUpdate fullUpdate = backendBuffer.pendingBufferUpdates().first();
+ QCOMPARE(fullUpdate.offset, -1);
+ QVERIFY(fullUpdate.data.isEmpty());
+ QCOMPARE(frontendBuffer.data(), backendBuffer.data());
+
+ backendBuffer.pendingBufferUpdates().clear();
+
+ // WHEN
+ frontendBuffer.updateData(1, QByteArray("00\0"));
+ backendBuffer.syncFromFrontEnd(&frontendBuffer, false);
+
+ // THEN
+ QCOMPARE(frontendBuffer.data(), QByteArray("100456789\0"));
+ QCOMPARE(backendBuffer.pendingBufferUpdates().size(), 1);
+ fullUpdate = backendBuffer.pendingBufferUpdates().first();
+ QCOMPARE(fullUpdate.offset, 1);
+ QCOMPARE(fullUpdate.data, QByteArray("00\0"));
+ QCOMPARE(frontendBuffer.data(), backendBuffer.data());
+
+ // WHEN
+ frontendBuffer.updateData(1, QByteArray("22\0"));
+ backendBuffer.syncFromFrontEnd(&frontendBuffer, true);
+
+ // THEN
+ QCOMPARE(frontendBuffer.data(), QByteArray("122456789\0"));
+ fullUpdate = backendBuffer.pendingBufferUpdates().first();
+ QCOMPARE(fullUpdate.offset, -1);
+ QVERIFY(fullUpdate.data.isEmpty());
+ QCOMPARE(frontendBuffer.data(), backendBuffer.data());
+ }
+
void checkPropertyChanges()
{
// GIVEN
@@ -237,10 +296,7 @@ private Q_SLOTS:
backendBuffer.executeFunctor();
// THEN
- QCOMPARE(arbiter.events.count(), 1);
- Qt3DCore::QPropertyUpdatedChangePtr change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
- QCOMPARE(change->propertyName(), "data");
- QCOMPARE(change->value().toByteArray(), QByteArrayLiteral("454"));
+ QCOMPARE(arbiter.events.count(), 0);
QCOMPARE(backendBuffer.pendingBufferUpdates().size(), 1);
QCOMPARE(backendBuffer.pendingBufferUpdates().first().offset, -1);
diff --git a/tests/auto/render/commons/testrenderer.cpp b/tests/auto/render/commons/testrenderer.cpp
index 0f5cdc7c9..6b6e2326e 100644
--- a/tests/auto/render/commons/testrenderer.cpp
+++ b/tests/auto/render/commons/testrenderer.cpp
@@ -30,10 +30,7 @@
QT_BEGIN_NAMESPACE
-TestRenderer::TestRenderer()
- : m_managers(nullptr)
-{
-}
+TestRenderer::TestRenderer() = default;
TestRenderer::~TestRenderer()
{
diff --git a/tests/auto/render/commons/testrenderer.h b/tests/auto/render/commons/testrenderer.h
index 8d27998a0..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() 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 990c0cd98..d6fa1d579 100644
--- a/tests/auto/render/computecommand/tst_computecommand.cpp
+++ b/tests/auto/render/computecommand/tst_computecommand.cpp
@@ -31,12 +31,17 @@
#include <Qt3DRender/qcomputecommand.h>
#include <Qt3DRender/private/qcomputecommand_p.h>
#include <Qt3DRender/private/computecommand_p.h>
+#include <Qt3DRender/private/nodemanagers_p.h>
+#include <Qt3DRender/private/managers_p.h>
#include <Qt3DCore/private/qbackendnode_p.h>
+#include <Qt3DCore/private/qaspectmanager_p.h>
+#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/qpropertyupdatedchange.h>
#include "qbackendnodetester.h"
#include "testrenderer.h"
#include "testpostmanarbiter.h"
+
class tst_ComputeCommand : public Qt3DCore::QBackendNodeTester
{
Q_OBJECT
@@ -54,6 +59,7 @@ private Q_SLOTS:
QCOMPARE(backendComputeCommand.x(), 1);
QCOMPARE(backendComputeCommand.y(), 1);
QCOMPARE(backendComputeCommand.z(), 1);
+ QCOMPARE(backendComputeCommand.hasReachedFrameCount(), false);
QCOMPARE(backendComputeCommand.runType(), Qt3DRender::QComputeCommand::Continuous);
QCOMPARE(backendComputeCommand.frameCount(), 0);
}
@@ -61,15 +67,27 @@ private Q_SLOTS:
void checkCleanupState()
{
// GIVEN
+ TestRenderer renderer;
Qt3DRender::Render::ComputeCommand backendComputeCommand;
+ Qt3DRender::QComputeCommand computeCommand;
+ computeCommand.setWorkGroupX(256);
+ computeCommand.setWorkGroupY(512);
+ computeCommand.setWorkGroupZ(128);
+ computeCommand.setRunType(Qt3DRender::QComputeCommand::Manual);
+ computeCommand.trigger(1);
// WHEN
+ backendComputeCommand.setRenderer(&renderer);
+ simulateInitializationSync(&computeCommand, &backendComputeCommand);
+
backendComputeCommand.setEnabled(true);
+ backendComputeCommand.hasReachedFrameCount();
backendComputeCommand.cleanup();
// THEN
QCOMPARE(backendComputeCommand.isEnabled(), false);
+ QCOMPARE(backendComputeCommand.hasReachedFrameCount(), false);
}
void checkInitializeFromPeer()
@@ -207,6 +225,7 @@ private Q_SLOTS:
// THEN
QCOMPARE(backendComputeCommand.frameCount(), 6 - (i + 1));
QCOMPARE(backendComputeCommand.isEnabled(), true);
+ QCOMPARE(backendComputeCommand.hasReachedFrameCount(), false);
QCOMPARE(arbiter.events.size(), 0);
}
@@ -214,15 +233,28 @@ private Q_SLOTS:
backendComputeCommand.updateFrameCount();
// THEN
- QCOMPARE(backendComputeCommand.frameCount(), false);
+ QCOMPARE(backendComputeCommand.hasReachedFrameCount(), true);
+ QCOMPARE(backendComputeCommand.frameCount(), 0);
+ // Backend stays with enabled == true, frontend will be updated
+ // to be disabled and backend should be disabled on the next sync
+
+ // WHEN
+ computeCommand.setEnabled(false);
+ backendComputeCommand.syncFromFrontEnd(&computeCommand, false);
+
+ // THEN
QCOMPARE(backendComputeCommand.isEnabled(), false);
- QCOMPARE(arbiter.events.size(), 1);
- {
- auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>();
- QCOMPARE(change->propertyName(), "enabled");
- QCOMPARE(change->value().value<int>(), false);
- QCOMPARE(change->type(), Qt3DCore::PropertyUpdated);
- }
+ QCOMPARE(backendComputeCommand.frameCount(), 0);
+
+ // WHEN
+ computeCommand.trigger(1);
+ backendComputeCommand.syncFromFrontEnd(&computeCommand, false);
+
+ // THEN
+ QCOMPARE(computeCommand.isEnabled(), true);
+ QCOMPARE(backendComputeCommand.isEnabled(), true);
+ QCOMPARE(backendComputeCommand.hasReachedFrameCount(), false);
+ QCOMPARE(backendComputeCommand.frameCount(), 1);
}
};
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/effect/tst_effect.cpp b/tests/auto/render/effect/tst_effect.cpp
index 369cdf793..2b145669e 100644
--- a/tests/auto/render/effect/tst_effect.cpp
+++ b/tests/auto/render/effect/tst_effect.cpp
@@ -33,7 +33,6 @@
#include <Qt3DRender/qparameter.h>
#include <Qt3DRender/private/qeffect_p.h>
#include <Qt3DRender/private/effect_p.h>
-#include <Qt3DRender/private/shaderparameterpack_p.h>
#include "qbackendnodetester.h"
#include "testrenderer.h"
diff --git a/tests/auto/render/entity/tst_entity.cpp b/tests/auto/render/entity/tst_entity.cpp
index e3b8e756e..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>
@@ -123,11 +126,13 @@ private slots:
TestRenderer renderer;
NodeManagers nodeManagers;
Qt3DRender::Render::Entity entity;
- Qt3DCore::QEntity dummyFrontendEntity;
entity.setRenderer(&renderer);
entity.setNodeManagers(&nodeManagers);
// THEN
+ QCOMPARE(renderer.dirtyBits(), 0);
+
+ // THEN
QVERIFY(entity.componentUuid<Transform>().isNull());
QVERIFY(entity.componentUuid<CameraLens>().isNull());
QVERIFY(entity.componentUuid<Material>().isNull());
@@ -141,20 +146,16 @@ private slots:
QVERIFY(!entity.isBoundingVolumeDirty());
QVERIFY(entity.childrenHandles().isEmpty());
QVERIFY(entity.layerIds().isEmpty());
+ QCOMPARE(entity.renderer(), &renderer);
+
+ QCOMPARE(renderer.dirtyBits(), 0);
// WHEN
for (QComponent *component : components)
EntityPrivate::get(&entity)->componentAdded(component);
- Qt3DCore::QEntity dummyFrontendEntityChild;
- // Create nodes in the backend manager
- nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntity.id());
- nodeManagers.renderNodesManager()->getOrCreateResource(dummyFrontendEntityChild.id());
-
-// TODOSYNC clean up
-// // Send children added event to entity
-// const auto addEntityChange = QPropertyNodeAddedChangePtr::create(dummyFrontendEntity.id(), &dummyFrontendEntityChild);
-// entity.sceneChangeEvent(addEntityChange);
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
// THEN
QVERIFY(!entity.componentUuid<Transform>().isNull());
@@ -170,7 +171,7 @@ private slots:
QVERIFY(entity.isBoundingVolumeDirty());
QVERIFY(entity.childrenHandles().isEmpty());
QVERIFY(!entity.layerIds().isEmpty());
- QVERIFY(renderer.dirtyBits() != 0);
+ QCOMPARE(renderer.dirtyBits(), 0);
bool containsAll = entity.containsComponentsOfType<Transform,
CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand, Armature>();
QVERIFY(containsAll);
@@ -195,6 +196,9 @@ private slots:
containsAll = entity.containsComponentsOfType<Transform,
CameraLens, Material, GeometryRenderer, ObjectPicker, ComputeCommand, Armature>();
QVERIFY(!containsAll);
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void checkEntityReparenting()
@@ -217,6 +221,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN
auto sendParentChange = [&nodeManagers](const Qt3DCore::QEntity &entity) {
Entity *backendEntity = nodeManagers.renderNodesManager()->getOrCreateResource(entity.id());
@@ -238,6 +245,9 @@ private slots:
QCOMPARE(backendB->childrenHandles().count(), 1);
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - reparent C to A
frontendEntityC.setParent(&frontendEntityA);
sendParentChange(frontendEntityC);
@@ -251,6 +261,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - reparent B to null.
frontendEntityB.setParent(static_cast<Qt3DCore::QNode *>(nullptr));
sendParentChange(frontendEntityB);
@@ -264,6 +277,9 @@ private slots:
QVERIFY(!backendA->childrenHandles().contains(backendB->handle()));
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void checkEntityCleanup()
@@ -298,6 +314,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN - cleaning up a child
backendC->cleanup();
@@ -312,6 +331,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN (cleaning up parent)
backendA->cleanup();
@@ -324,6 +346,9 @@ private slots:
QVERIFY(backendB->childrenHandles().isEmpty());
QVERIFY(backendC->childrenHandles().isEmpty());
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
+
// WHEN
backendB->cleanup();
@@ -335,6 +360,9 @@ private slots:
QVERIFY(backendA->parent() == nullptr);
QVERIFY(backendB->parent() == nullptr);
QVERIFY(backendC->parent() == nullptr);
+
+ QVERIFY(renderer.dirtyBits() & Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderer.resetDirty();
}
void shouldHandleSingleComponentEvents_data()
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/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/layerfiltering/tst_layerfiltering.cpp b/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
index 255ff5ea8..1ffec30ae 100644
--- a/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
+++ b/tests/auto/render/layerfiltering/tst_layerfiltering.cpp
@@ -32,6 +32,7 @@
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/entity_p.h>
#include <Qt3DRender/private/filterlayerentityjob_p.h>
+#include <Qt3DRender/private/updateentitylayersjob_p.h>
#include <Qt3DRender/private/updatetreeenabledjob_p.h>
#include <Qt3DRender/qlayer.h>
#include <Qt3DRender/qlayerfilter.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/objectpicker/tst_objectpicker.cpp b/tests/auto/render/objectpicker/tst_objectpicker.cpp
index 5fc988d47..24fa2159d 100644
--- a/tests/auto/render/objectpicker/tst_objectpicker.cpp
+++ b/tests/auto/render/objectpicker/tst_objectpicker.cpp
@@ -32,7 +32,6 @@
#include <Qt3DRender/qpickevent.h>
#include <Qt3DRender/qobjectpicker.h>
#include <Qt3DCore/private/qbackendnode_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include "testpostmanarbiter.h"
#include "testrenderer.h"
diff --git a/tests/auto/render/opengl/computecommand/computecommand.pro b/tests/auto/render/opengl/computecommand/computecommand.pro
new file mode 100644
index 000000000..38515059a
--- /dev/null
+++ b/tests/auto/render/opengl/computecommand/computecommand.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+
+TARGET = tst_computecommand
+
+QT += 3dcore 3dcore-private 3drender 3drender-private testlib
+
+CONFIG += testcase
+
+SOURCES += tst_computecommand.cpp
+
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/opengl/computecommand/tst_computecommand.cpp b/tests/auto/render/opengl/computecommand/tst_computecommand.cpp
new file mode 100644
index 000000000..3caf11c8f
--- /dev/null
+++ b/tests/auto/render/opengl/computecommand/tst_computecommand.cpp
@@ -0,0 +1,143 @@
+/****************************************************************************
+**
+** 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/qcomputecommand.h>
+#include <Qt3DRender/private/qcomputecommand_p.h>
+#include <Qt3DRender/private/computecommand_p.h>
+#include <Qt3DRender/private/nodemanagers_p.h>
+#include <Qt3DRender/private/managers_p.h>
+#include <Qt3DCore/private/qbackendnode_p.h>
+#include <Qt3DCore/private/qaspectmanager_p.h>
+#include <Qt3DCore/private/qscene_p.h>
+#include <Qt3DCore/qpropertyupdatedchange.h>
+#include <renderer_p.h>
+#include "qbackendnodetester.h"
+#include "testrenderer.h"
+#include "testpostmanarbiter.h"
+
+
+// tst_Renderer is a friend class of Renderer
+class tst_Renderer : public Qt3DRender::Render::OpenGL::Renderer
+{
+public:
+ tst_Renderer()
+ : Qt3DRender::Render::OpenGL::Renderer(Qt3DRender::QRenderAspect::Synchronous)
+ {}
+
+ ~tst_Renderer() {
+ shutdown();
+ }
+};
+
+
+class tst_ComputeCommand : public Qt3DCore::QBackendNodeTester
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+
+ void checkDisablesFrontend()
+ {
+ // GIVEN
+ Qt3DRender::Render::NodeManagers nodeManager;
+ tst_Renderer renderer;
+ TestArbiter arbiter;
+
+ Qt3DCore::QAspectManager manager;
+ Qt3DCore::QScene scene;
+
+ Qt3DCore::QEntity rootEntity;
+ Qt3DCore::QNodePrivate::get(&rootEntity)->setScene(&scene);
+
+ Qt3DRender::QComputeCommand computeCommand;
+ Qt3DRender::Render::ComputeCommand *backendComputeCommand = nullptr;
+
+ renderer.setNodeManagers(&nodeManager);
+
+ // WHEN
+ computeCommand.setParent(&rootEntity);
+ // RootEntity is the entry point to retrieve the scene instance for lookups
+ manager.setRootEntity(&rootEntity, {});
+
+ // THEN
+ QVERIFY(scene.lookupNode(computeCommand.id()) != nullptr);
+
+ // WHEN
+ auto handle = nodeManager.computeJobManager()->getOrAcquireHandle(computeCommand.id());
+ backendComputeCommand = nodeManager.computeJobManager()->data(handle);
+
+ // WHEN
+ computeCommand.setWorkGroupX(256);
+ computeCommand.setWorkGroupY(512);
+ computeCommand.setWorkGroupZ(128);
+ computeCommand.setRunType(Qt3DRender::QComputeCommand::Manual);
+ computeCommand.trigger(1);
+
+ Qt3DCore::QBackendNodePrivate::get(backendComputeCommand)->setArbiter(&arbiter);
+ backendComputeCommand->setRenderer(&renderer);
+ simulateInitializationSync(&computeCommand, backendComputeCommand);
+
+ // THEN
+ QCOMPARE(backendComputeCommand->frameCount(),1);
+ QCOMPARE(backendComputeCommand->isEnabled(), true);
+ QCOMPARE(computeCommand.isEnabled(), true);
+ QCOMPARE(backendComputeCommand->hasReachedFrameCount(), false);
+
+ // WHEN
+ backendComputeCommand->updateFrameCount();
+
+ // THEN
+ QCOMPARE(backendComputeCommand->frameCount(), 0);
+ QCOMPARE(backendComputeCommand->hasReachedFrameCount(), true);
+
+
+ // Still enabled as we have yet to notify the fronted
+ QCOMPARE(backendComputeCommand->isEnabled(), true);
+ QCOMPARE(computeCommand.isEnabled(), true);
+
+ // WHEN
+ renderer.jobsDone(&manager); // so Renderer::sendDisablesToFrontend gets called
+
+ // THEN
+ QCOMPARE(computeCommand.isEnabled(), false);
+ QCOMPARE(backendComputeCommand->hasReachedFrameCount(), false);
+
+ // WHEN
+ backendComputeCommand->syncFromFrontEnd(&computeCommand, false);
+
+ // THEN
+ QCOMPARE(backendComputeCommand->frameCount(), 0);
+ QCOMPARE(backendComputeCommand->isEnabled(), false);
+ }
+};
+
+QTEST_MAIN(tst_ComputeCommand)
+
+#include "tst_computecommand.moc"
diff --git a/tests/auto/render/filtercompatibletechniquejob/BLACKLIST b/tests/auto/render/opengl/filtercompatibletechniquejob/BLACKLIST
index 7cbc7c4c0..7cbc7c4c0 100644
--- a/tests/auto/render/filtercompatibletechniquejob/BLACKLIST
+++ b/tests/auto/render/opengl/filtercompatibletechniquejob/BLACKLIST
diff --git a/tests/auto/render/filtercompatibletechniquejob/filtercompatibletechniquejob.pro b/tests/auto/render/opengl/filtercompatibletechniquejob/filtercompatibletechniquejob.pro
index 4f63e514b..5d533839c 100644
--- a/tests/auto/render/filtercompatibletechniquejob/filtercompatibletechniquejob.pro
+++ b/tests/auto/render/opengl/filtercompatibletechniquejob/filtercompatibletechniquejob.pro
@@ -8,5 +8,8 @@ CONFIG += testcase
SOURCES += tst_filtercompatibletechniquejob.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp b/tests/auto/render/opengl/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp
index 25262a772..e5c34f804 100644
--- a/tests/auto/render/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp
+++ b/tests/auto/render/opengl/filtercompatibletechniquejob/tst_filtercompatibletechniquejob.cpp
@@ -35,12 +35,12 @@
#include <Qt3DRender/qtechnique.h>
#include <Qt3DRender/qviewport.h>
#include <Qt3DRender/private/technique_p.h>
-#include <Qt3DRender/private/filtercompatibletechniquejob_p.h>
#include <Qt3DRender/private/nodemanagers_p.h>
-#include <Qt3DRender/private/renderer_p.h>
-#include <Qt3DRender/private/submissioncontext_p.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
#include <Qt3DRender/private/techniquemanager_p.h>
+#include <renderer_p.h>
+#include <submissioncontext_p.h>
+#include <filtercompatibletechniquejob_p.h>
QT_BEGIN_NAMESPACE
@@ -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);
@@ -107,9 +116,9 @@ public:
renderer()->submissionContext()->beginDrawing(m_window.data());
}
- Render::Renderer *renderer() const
+ Render::OpenGL::Renderer *renderer() const
{
- return static_cast<Render::Renderer *>(d_func()->m_renderer);
+ return static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer);
}
void onRegistered() { QRenderAspect::onRegistered(); }
@@ -119,6 +128,7 @@ private:
QScopedPointer<Qt3DCore::QAspectJobManager> m_jobManager;
QScopedPointer<QWindow> m_window;
QOpenGLContext m_glContext;
+ bool m_contextCreationSuccessful;
};
} // namespace Qt3DRender
@@ -186,7 +196,7 @@ private Q_SLOTS:
void checkInitialState()
{
// GIVEN
- Qt3DRender::Render::FilterCompatibleTechniqueJob backendFilterCompatibleTechniqueJob;
+ Qt3DRender::Render::OpenGL::FilterCompatibleTechniqueJob backendFilterCompatibleTechniqueJob;
// THEN
QVERIFY(backendFilterCompatibleTechniqueJob.manager() == nullptr);
@@ -194,7 +204,7 @@ private Q_SLOTS:
// WHEN
Qt3DRender::Render::TechniqueManager techniqueManager;
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
backendFilterCompatibleTechniqueJob.setManager(&techniqueManager);
backendFilterCompatibleTechniqueJob.setRenderer(&renderer);
@@ -208,9 +218,14 @@ private Q_SLOTS:
void checkRunRendererRunning()
{
// GIVEN
- Qt3DRender::Render::FilterCompatibleTechniqueJob backendFilterCompatibleTechniqueJob;
+ Qt3DRender::Render::OpenGL::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/opengl/glshadermanager/glshadermanager.pro b/tests/auto/render/opengl/glshadermanager/glshadermanager.pro
new file mode 100644
index 000000000..dc96ab3bb
--- /dev/null
+++ b/tests/auto/render/opengl/glshadermanager/glshadermanager.pro
@@ -0,0 +1,15 @@
+TEMPLATE = app
+
+TARGET = tst_glshadermanager
+
+QT += core-private 3dcore 3dcore-private 3drender 3drender-private testlib
+
+CONFIG += testcase
+
+SOURCES += tst_glshadermanager.cpp
+
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/opengl/glshadermanager/tst_glshadermanager.cpp b/tests/auto/render/opengl/glshadermanager/tst_glshadermanager.cpp
new file mode 100644
index 000000000..6a5bc87ea
--- /dev/null
+++ b/tests/auto/render/opengl/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 <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::OpenGL::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::OpenGL::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::OpenGL::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::OpenGL::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::OpenGL::GLShader *glShader1 = cache.lookupResource(backendShaderNode1.peerId());
+ Qt3DRender::Render::OpenGL::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::OpenGL::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::OpenGL::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::OpenGL::GLShader *> releasedShaders = cache.takeAbandonned();
+ QCOMPARE(releasedShaders.size(), 1);
+ QCOMPARE(releasedShaders.first(), glShader);
+}
+
+void tst_GLShaderManager::insertAfterRemoval()
+{
+ // GIVEN
+ Qt3DRender::Render::OpenGL::GLShaderManager cache;
+ Qt3DRender::QShaderProgram frontendShader;
+ TestRenderer renderer;
+ Qt3DRender::Render::Shader backendShaderNode;
+
+
+ backendShaderNode.setRenderer(&renderer);
+ simulateInitialization(&frontendShader, &backendShaderNode);
+
+ // WHEN
+ Qt3DRender::Render::OpenGL::GLShader *apiShader1 = cache.createOrAdoptExisting(&backendShaderNode);
+ const Qt3DRender::Render::OpenGL::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::OpenGL::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/graphicshelpergl2/graphicshelpergl2.pro b/tests/auto/render/opengl/graphicshelpergl2/graphicshelpergl2.pro
index b27060635..eb8ba7f04 100644
--- a/tests/auto/render/graphicshelpergl2/graphicshelpergl2.pro
+++ b/tests/auto/render/opengl/graphicshelpergl2/graphicshelpergl2.pro
@@ -9,5 +9,8 @@ CONFIG += testcase
SOURCES += \
tst_graphicshelpergl2.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/graphicshelpergl2/tst_graphicshelpergl2.cpp b/tests/auto/render/opengl/graphicshelpergl2/tst_graphicshelpergl2.cpp
index ffafc2312..5a1d22283 100644
--- a/tests/auto/render/graphicshelpergl2/tst_graphicshelpergl2.cpp
+++ b/tests/auto/render/opengl/graphicshelpergl2/tst_graphicshelpergl2.cpp
@@ -29,7 +29,7 @@
#include <QtTest/QTest>
#include <Qt3DRender/qrendertargetoutput.h>
#include <Qt3DRender/private/uniform_p.h>
-#include <Qt3DRender/private/graphicshelpergl2_p.h>
+#include <graphicshelpergl2_p.h>
#include <Qt3DRender/private/attachmentpack_p.h>
#include <QtOpenGLExtensions/QOpenGLExtensions>
#include <QOpenGLContext>
@@ -47,6 +47,7 @@ QT_BEGIN_NAMESPACE
using namespace Qt3DRender;
using namespace Qt3DRender::Render;
+using namespace Qt3DRender::Render::OpenGL;
namespace {
diff --git a/tests/auto/render/graphicshelpergl3_2/graphicshelpergl3_2.pro b/tests/auto/render/opengl/graphicshelpergl3_2/graphicshelpergl3_2.pro
index 5d8bf60fd..a613f1279 100644
--- a/tests/auto/render/graphicshelpergl3_2/graphicshelpergl3_2.pro
+++ b/tests/auto/render/opengl/graphicshelpergl3_2/graphicshelpergl3_2.pro
@@ -9,5 +9,8 @@ CONFIG += testcase
SOURCES += \
tst_graphicshelpergl3_2.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp b/tests/auto/render/opengl/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp
index 840a7f6da..08c30dc15 100644
--- a/tests/auto/render/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp
+++ b/tests/auto/render/opengl/graphicshelpergl3_2/tst_graphicshelpergl3_2.cpp
@@ -29,7 +29,7 @@
#include <QtTest/QTest>
#include <Qt3DRender/qrendertargetoutput.h>
#include <Qt3DRender/private/uniform_p.h>
-#include <Qt3DRender/private/graphicshelpergl3_2_p.h>
+#include <graphicshelpergl3_2_p.h>
#include <Qt3DRender/private/attachmentpack_p.h>
#include <QOpenGLBuffer>
#include <QOpenGLFunctions_3_2_Core>
@@ -43,6 +43,7 @@
using namespace Qt3DRender;
using namespace Qt3DRender::Render;
+using namespace Qt3DRender::Render::OpenGL;
namespace {
diff --git a/tests/auto/render/graphicshelpergl3_3/graphicshelpergl3_3.pro b/tests/auto/render/opengl/graphicshelpergl3_3/graphicshelpergl3_3.pro
index 36bda15b2..5ef0b6806 100644
--- a/tests/auto/render/graphicshelpergl3_3/graphicshelpergl3_3.pro
+++ b/tests/auto/render/opengl/graphicshelpergl3_3/graphicshelpergl3_3.pro
@@ -9,5 +9,8 @@ CONFIG += testcase
SOURCES += \
tst_graphicshelpergl3_3.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp b/tests/auto/render/opengl/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp
index 874c83f0b..b463e6236 100644
--- a/tests/auto/render/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp
+++ b/tests/auto/render/opengl/graphicshelpergl3_3/tst_graphicshelpergl3_3.cpp
@@ -29,8 +29,8 @@
#include <QtTest/QTest>
#include <Qt3DRender/qrendertargetoutput.h>
#include <Qt3DRender/private/uniform_p.h>
-#include <Qt3DRender/private/graphicshelpergl3_3_p.h>
#include <Qt3DRender/private/attachmentpack_p.h>
+#include <graphicshelpergl3_3_p.h>
#include <QOpenGLBuffer>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
@@ -42,6 +42,7 @@
using namespace Qt3DRender;
using namespace Qt3DRender::Render;
+using namespace Qt3DRender::Render::OpenGL;
namespace {
diff --git a/tests/auto/render/graphicshelpergl4/graphicshelpergl4.pro b/tests/auto/render/opengl/graphicshelpergl4/graphicshelpergl4.pro
index b20d1afec..5ea881208 100644
--- a/tests/auto/render/graphicshelpergl4/graphicshelpergl4.pro
+++ b/tests/auto/render/opengl/graphicshelpergl4/graphicshelpergl4.pro
@@ -9,5 +9,8 @@ CONFIG += testcase
SOURCES += \
tst_graphicshelpergl4.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/graphicshelpergl4/tst_graphicshelpergl4.cpp b/tests/auto/render/opengl/graphicshelpergl4/tst_graphicshelpergl4.cpp
index 6e5c54303..8f86f38ce 100644
--- a/tests/auto/render/graphicshelpergl4/tst_graphicshelpergl4.cpp
+++ b/tests/auto/render/opengl/graphicshelpergl4/tst_graphicshelpergl4.cpp
@@ -29,8 +29,8 @@
#include <QtTest/QTest>
#include <Qt3DRender/qrendertargetoutput.h>
#include <Qt3DRender/private/uniform_p.h>
-#include <Qt3DRender/private/graphicshelpergl4_p.h>
#include <Qt3DRender/private/attachmentpack_p.h>
+#include <graphicshelpergl4_p.h>
#include <QOpenGLBuffer>
#include <QOpenGLFunctions_4_3_Core>
#include <QOpenGLShaderProgram>
@@ -43,6 +43,7 @@
using namespace Qt3DRender;
using namespace Qt3DRender::Render;
+using namespace Qt3DRender::Render::OpenGL;
namespace {
diff --git a/tests/auto/render/materialparametergathererjob/materialparametergathererjob.pro b/tests/auto/render/opengl/materialparametergathererjob/materialparametergathererjob.pro
index ac68b8248..106e7a263 100644
--- a/tests/auto/render/materialparametergathererjob/materialparametergathererjob.pro
+++ b/tests/auto/render/opengl/materialparametergathererjob/materialparametergathererjob.pro
@@ -8,4 +8,7 @@ CONFIG += testcase
SOURCES += tst_materialparametergathererjob.cpp
-include(../commons/commons.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp b/tests/auto/render/opengl/materialparametergathererjob/tst_materialparametergathererjob.cpp
index 236faa8f0..efd2c6603 100644
--- a/tests/auto/render/materialparametergathererjob/tst_materialparametergathererjob.cpp
+++ b/tests/auto/render/opengl/materialparametergathererjob/tst_materialparametergathererjob.cpp
@@ -36,16 +36,18 @@
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/entity_p.h>
-#include <Qt3DRender/private/materialparametergathererjob_p.h>
+#include <materialparametergathererjob_p.h>
#include <Qt3DRender/private/techniquefilternode_p.h>
#include <Qt3DRender/private/technique_p.h>
#include <Qt3DRender/private/techniquemanager_p.h>
#include <Qt3DRender/private/renderpassfilternode_p.h>
+#include <Qt3DRender/qrendersettings.h>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/qeffect.h>
#include <Qt3DRender/qmaterial.h>
#include <Qt3DRender/qparameter.h>
#include <Qt3DRender/qtechniquefilter.h>
+#include <Qt3DRender/qtechnique.h>
#include <Qt3DRender/qrenderpassfilter.h>
#include <Qt3DRender/qrenderpass.h>
#include <Qt3DRender/qshaderprogram.h>
@@ -105,9 +107,9 @@ public:
d_func()->m_renderer->initialize();
}
- Render::MaterialParameterGathererJobPtr materialGathererJob() const
+ Render::OpenGL::MaterialParameterGathererJobPtr materialGathererJob() const
{
- Render::MaterialParameterGathererJobPtr job = Render::MaterialParameterGathererJobPtr::create();
+ Render::OpenGL::MaterialParameterGathererJobPtr job = Render::OpenGL::MaterialParameterGathererJobPtr::create();
job->setNodeManagers(nodeManagers());
return job;
}
@@ -230,7 +232,7 @@ private Q_SLOTS:
// GIVEN
Qt3DCore::QEntity *sceneRoot = buildScene(viewportFrameGraph());
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -250,7 +252,7 @@ private Q_SLOTS:
TestMaterial material;
Qt3DCore::QEntity *sceneRoot = buildScene(viewportFrameGraph(), &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -272,7 +274,7 @@ private Q_SLOTS:
material.setEnabled(false);
Qt3DCore::QEntity *sceneRoot = buildScene(viewportFrameGraph(), &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -304,7 +306,7 @@ private Q_SLOTS:
Qt3DCore::QEntity *sceneRoot = buildScene(frameGraphFilter, &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -344,7 +346,7 @@ private Q_SLOTS:
Qt3DCore::QEntity *sceneRoot = buildScene(frameGraphFilter, &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -380,7 +382,7 @@ private Q_SLOTS:
Qt3DCore::QEntity *sceneRoot = buildScene(frameGraphFilter, &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -414,7 +416,7 @@ private Q_SLOTS:
Qt3DCore::QEntity *sceneRoot = buildScene(frameGraphFilter, &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -454,7 +456,7 @@ private Q_SLOTS:
Qt3DCore::QEntity *sceneRoot = buildScene(frameGraphFilter, &material);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
@@ -507,7 +509,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -524,10 +526,10 @@ private Q_SLOTS:
// THEN -> RenderPassFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(renderPassParameter->id()));
@@ -563,7 +565,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -580,10 +582,10 @@ private Q_SLOTS:
// THEN -> TechniqueFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(techniqueFilterParameter->id()));
@@ -618,7 +620,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -635,10 +637,10 @@ private Q_SLOTS:
// THEN -> TechniqueFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(materialParameter->id()));
@@ -672,7 +674,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -689,10 +691,10 @@ private Q_SLOTS:
// THEN -> TechniqueFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(effectParameter->id()));
@@ -722,7 +724,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -739,10 +741,10 @@ private Q_SLOTS:
// THEN -> TechniqueFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(techniqueParam->id()));
@@ -766,7 +768,7 @@ private Q_SLOTS:
material.es2Pass()->addParameter(passParam);
Qt3DRender::TestAspect testAspect(sceneRoot);
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatherer = testAspect.materialGathererJob();
testAspect.initializeRenderer();
QCOMPARE(testAspect.nodeManagers()->materialManager()->activeHandles().size(), 1);
@@ -783,10 +785,10 @@ private Q_SLOTS:
// THEN -> TechniqueFilter wins
QCOMPARE(gatherer->materialToPassAndParameter().size(), 1);
- const QVector<Qt3DRender::Render::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
+ const QVector<Qt3DRender::Render::OpenGL::RenderPassParameterData> passParameterData = gatherer->materialToPassAndParameter().begin().value();
QCOMPARE(passParameterData.size(), 1);
- const Qt3DRender::Render::RenderPassParameterData data = passParameterData.first();
+ const Qt3DRender::Render::OpenGL::RenderPassParameterData data = passParameterData.first();
QCOMPARE(data.parameterInfo.size(), 1);
QCOMPARE(data.parameterInfo.first().handle, testAspect.nodeManagers()->parameterManager()->lookupHandle(passParam->id()));
diff --git a/tests/auto/render/opengl/opengl.pro b/tests/auto/render/opengl/opengl.pro
new file mode 100644
index 000000000..5299ebd36
--- /dev/null
+++ b/tests/auto/render/opengl/opengl.pro
@@ -0,0 +1,19 @@
+TEMPLATE = subdirs
+
+SUBDIRS += \
+ filtercompatibletechniquejob \
+ graphicshelpergl3_3 \
+ graphicshelpergl3_2 \
+ graphicshelpergl2 \
+ glshadermanager \
+ materialparametergathererjob \
+ textures \
+ renderer \
+ renderviewutils \
+ renderviews \
+ renderqueue \
+ renderviewbuilder \
+ qgraphicsutils \
+ computecommand
+
+!macos: SUBDIRS += graphicshelpergl4
diff --git a/tests/auto/render/opengl/opengl_render_plugin.pri b/tests/auto/render/opengl/opengl_render_plugin.pri
new file mode 100644
index 000000000..50fade878
--- /dev/null
+++ b/tests/auto/render/opengl/opengl_render_plugin.pri
@@ -0,0 +1,18 @@
+# Found no way of having the test runner include the correct
+# library path as runtime
+
+#PLUGIN_SRC_PATH = $$PWD/../../../../src/plugins/renderers/opengl
+
+#INCLUDEPATH += \
+# $$PLUGIN_SRC_PATH/graphicshelpers \
+# $$PLUGIN_SRC_PATH/io \
+# $$PLUGIN_SRC_PATH/jobs \
+# $$PLUGIN_SRC_PATH/managers \
+# $$PLUGIN_SRC_PATH/renderer \
+# $$PLUGIN_SRC_PATH/renderstates \
+# $$PLUGIN_SRC_PATH/textures
+
+#LIBS += -L$$[QT_INSTALL_PLUGINS]/renderers/ -lopenglrenderer
+
+# Instead we link against the sources directly
+include(../../../../src/plugins/renderers/opengl/opengl.pri)
diff --git a/tests/auto/render/qgraphicsutils/qgraphicsutils.pro b/tests/auto/render/opengl/qgraphicsutils/qgraphicsutils.pro
index 031a26246..8c936c527 100644
--- a/tests/auto/render/qgraphicsutils/qgraphicsutils.pro
+++ b/tests/auto/render/opengl/qgraphicsutils/qgraphicsutils.pro
@@ -7,3 +7,6 @@ QT += 3dcore 3dcore-private 3drender 3drender-private testlib
CONFIG += testcase
SOURCES += tst_qgraphicsutils.cpp
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/qgraphicsutils/tst_qgraphicsutils.cpp b/tests/auto/render/opengl/qgraphicsutils/tst_qgraphicsutils.cpp
index e3676ad3b..bd4772045 100644
--- a/tests/auto/render/qgraphicsutils/tst_qgraphicsutils.cpp
+++ b/tests/auto/render/opengl/qgraphicsutils/tst_qgraphicsutils.cpp
@@ -27,7 +27,7 @@
****************************************************************************/
#include <QtTest/QtTest>
-#include <private/qgraphicsutils_p.h>
+#include <qgraphicsutils_p.h>
class tst_QGraphicsUtils : public QObject
{
@@ -44,14 +44,14 @@ private slots:
void tst_QGraphicsUtils::fillScalarInDataArray()
{
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 1;
description.m_offset = 0;
description.m_arrayStride = 10;
QVector4D testVector(8.0f, 8.0f, 3.0f, 1.0f);
- const GLfloat *vectorData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(testVector, 1, 4);
+ const GLfloat *vectorData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(testVector, 1, 4);
for (int i = 0; i < 4; i++) {
if (i == 0)
@@ -68,7 +68,7 @@ void tst_QGraphicsUtils::fillScalarInDataArray()
char *innerData = data.data();
// Checked that we are not overflowing
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 2);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 2);
for (int i = 0; i < 4; ++i) {
if (i < 2)
QVERIFY(vectorData[i] == ((GLfloat*)innerData)[i]);
@@ -77,7 +77,7 @@ void tst_QGraphicsUtils::fillScalarInDataArray()
}
// Check that all values are copied
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
for (int i = 0; i < 4; ++i)
QVERIFY(vectorData[i] == ((GLfloat*)innerData)[i]);
@@ -86,7 +86,7 @@ void tst_QGraphicsUtils::fillScalarInDataArray()
data = QByteArray(description.m_size * 8 * sizeof(GLfloat), 0);
innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
for (int i = 0; i < 8; ++i) {
if (i < 4)
QVERIFY(((GLfloat*)innerData)[i] == 0.0f);
@@ -102,9 +102,9 @@ void tst_QGraphicsUtils::fillArray()
QVector4D testVector3(4.0f, 5.0f, 4.0f, 2.0f);
QVariantList variantList = QVariantList() << testVector << testVector2 << testVector3;
- const GLfloat *vectorData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant(variantList), 3, 4);
+ const GLfloat *vectorData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant(variantList), 3, 4);
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 3;
description.m_offset = 16;
@@ -112,7 +112,7 @@ void tst_QGraphicsUtils::fillArray()
QByteArray data(description.m_size * (4 + description.m_arrayStride) * sizeof(GLfloat) + description.m_offset, 0);
char *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData, vectorData, description, 4);
int offset = description.m_offset / sizeof(GLfloat);
int stride = description.m_arrayStride / sizeof(GLfloat);
@@ -144,25 +144,25 @@ void tst_QGraphicsUtils::fillScalarWithOffsets()
QVector4D color(4.0f, 5.0f, 4.0f, 1.0f);
float intensity = 1.0f;
- Qt3DRender::Render::ShaderUniform posUniform;
+ Qt3DRender::Render::OpenGL::ShaderUniform posUniform;
posUniform.m_size = 1;
posUniform.m_arrayStride = 0;
posUniform.m_matrixStride = 0;
posUniform.m_offset = 0;
- Qt3DRender::Render::ShaderUniform dirUniform;
+ Qt3DRender::Render::OpenGL::ShaderUniform dirUniform;
dirUniform.m_size = 1;
dirUniform.m_arrayStride = 0;
dirUniform.m_matrixStride = 0;
dirUniform.m_offset = 16;
- Qt3DRender::Render::ShaderUniform colUniform;
+ Qt3DRender::Render::OpenGL::ShaderUniform colUniform;
colUniform.m_size = 1;
colUniform.m_arrayStride = 0;
colUniform.m_matrixStride = 0;
colUniform.m_offset = 32;
- Qt3DRender::Render::ShaderUniform intUniform;
+ Qt3DRender::Render::OpenGL::ShaderUniform intUniform;
intUniform.m_size = 1;
intUniform.m_arrayStride = 0;
intUniform.m_matrixStride = 0;
@@ -171,18 +171,18 @@ void tst_QGraphicsUtils::fillScalarWithOffsets()
QVector<GLfloat> data(16);
void *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData,
- Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(position, 1, 3),
- posUniform, 3);
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData,
- Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(direction, 1, 3),
- dirUniform, 3);
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData,
- Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(color, 1, 4),
- colUniform, 4);
- Qt3DRender::Render::QGraphicsUtils::fillDataArray(innerData,
- Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(intensity, 1, 1),
- intUniform, 1);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData,
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(position, 1, 3),
+ posUniform, 3);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData,
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(direction, 1, 3),
+ dirUniform, 3);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData,
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(color, 1, 4),
+ colUniform, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataArray(innerData,
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(intensity, 1, 1),
+ intUniform, 1);
GLfloat *floatData = (GLfloat*)innerData;
@@ -214,9 +214,9 @@ void tst_QGraphicsUtils::fillMatrix4x4()
QMatrix4x4 mat(1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f);
// column major
- const GLfloat *matData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(mat, 1, 16);
+ const GLfloat *matData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(mat, 1, 16);
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 1;
description.m_offset = 0;
@@ -226,7 +226,7 @@ void tst_QGraphicsUtils::fillMatrix4x4()
QByteArray data(description.m_size * 16 * sizeof(GLfloat), 0);
char *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
// Check for no offset/no stride
for (int i = 0; i < 16; ++i)
QVERIFY((((GLfloat *)innerData)[i]) == matData[i]);
@@ -234,7 +234,7 @@ void tst_QGraphicsUtils::fillMatrix4x4()
description.m_offset = 12;
data = QByteArray((description.m_size * 16 + description.m_offset) * sizeof(GLfloat), 0);
innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
// Check with 12 offset/no stride
for (int i = 0; i < 16; ++i)
QVERIFY((((GLfloat *)innerData)[3 + i]) == matData[i]);
@@ -242,7 +242,7 @@ void tst_QGraphicsUtils::fillMatrix4x4()
description.m_matrixStride = 16;
data = QByteArray((description.m_size * 16 + 4 * description.m_matrixStride + description.m_offset) * sizeof(GLfloat), 0);
innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 4);
// Check with 10 offset/ 16 stride
int offset = description.m_offset / sizeof(GLfloat);
int matrixStride = description.m_matrixStride / sizeof(GLfloat);
@@ -259,9 +259,9 @@ void tst_QGraphicsUtils::fillMatrix3x4()
QMatrix3x4 mat;
mat.fill(6.0f);
- const GLfloat *matData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(mat), 1, 12);
+ const GLfloat *matData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(mat), 1, 12);
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 1;
description.m_offset = 16;
@@ -270,7 +270,7 @@ void tst_QGraphicsUtils::fillMatrix3x4()
QByteArray data((description.m_size * 12 + 3 * description.m_matrixStride + description.m_offset) * sizeof(GLfloat), 0);
char *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 3, 4);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 3, 4);
// Check with 16 offset/ 12 stride
int offset = description.m_offset / sizeof(GLfloat);
int matrixStride = description.m_matrixStride / sizeof(GLfloat);
@@ -287,9 +287,9 @@ void tst_QGraphicsUtils::fillMatrix4x3()
QMatrix4x3 mat;
mat.fill(6.0f);
- const GLfloat *matData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(mat), 1, 12);
+ const GLfloat *matData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(mat), 1, 12);
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 1;
description.m_offset = 16;
@@ -298,7 +298,7 @@ void tst_QGraphicsUtils::fillMatrix4x3()
QByteArray data((description.m_size * 12 + 4 * description.m_matrixStride + description.m_offset) * sizeof(GLfloat), 0);
char *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 3);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 3);
// Check with 16 offset/ 16 stride
int offset = description.m_offset / sizeof(GLfloat);
int matrixStride = description.m_matrixStride / sizeof(GLfloat);
@@ -321,9 +321,9 @@ void tst_QGraphicsUtils::fillMatrixArray()
QVariantList matrices = QVariantList() << QVariant::fromValue(mat1) << QVariant::fromValue(mat2) << QVariant::fromValue(mat3);
- const GLfloat *matData = Qt3DRender::Render::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(matrices), 3, 12);
+ const GLfloat *matData = Qt3DRender::Render::OpenGL::QGraphicsUtils::valueArrayFromVariant<GLfloat>(QVariant::fromValue(matrices), 3, 12);
- Qt3DRender::Render::ShaderUniform description;
+ Qt3DRender::Render::OpenGL::ShaderUniform description;
description.m_size = 3;
description.m_offset = 12;
@@ -332,7 +332,7 @@ void tst_QGraphicsUtils::fillMatrixArray()
QByteArray data((description.m_size * (12 + 4 * description.m_matrixStride + description.m_arrayStride) + description.m_offset) * sizeof(GLfloat), 0);
char *innerData = data.data();
- Qt3DRender::Render::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 3);
+ Qt3DRender::Render::OpenGL::QGraphicsUtils::fillDataMatrixArray(innerData, matData, description, 4, 3);
// Check with 12 offset/ 4 array stride / 16 matrix stride
int offset = description.m_offset / sizeof(GLfloat);
int matrixStride = description.m_matrixStride / sizeof(GLfloat);
diff --git a/tests/auto/render/renderer/renderer.pro b/tests/auto/render/opengl/renderer/renderer.pro
index cbafc156b..d481c7b9e 100644
--- a/tests/auto/render/renderer/renderer.pro
+++ b/tests/auto/render/opengl/renderer/renderer.pro
@@ -7,3 +7,6 @@ QT += 3dcore 3dcore-private 3drender 3drender-private testlib
CONFIG += testcase
SOURCES += tst_renderer.cpp
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/renderer/tst_renderer.cpp b/tests/auto/render/opengl/renderer/tst_renderer.cpp
index e1bf8dfd9..db7a37af1 100644
--- a/tests/auto/render/renderer/tst_renderer.cpp
+++ b/tests/auto/render/opengl/renderer/tst_renderer.cpp
@@ -30,13 +30,12 @@
#include <QMutex>
#include <QWaitCondition>
#include <QThread>
-#include <Qt3DRender/private/renderer_p.h>
#include <Qt3DRender/private/viewportnode_p.h>
-#include <Qt3DRender/private/renderview_p.h>
-#include <Qt3DRender/private/renderviewbuilder_p.h>
+#include <renderer_p.h>
+#include <renderview_p.h>
+#include <renderviewbuilder_p.h>
#include <Qt3DRender/private/offscreensurfacehelper_p.h>
-#include <Qt3DRender/private/renderqueue_p.h>
-#include <Qt3DRender/private/job_common_p.h>
+#include <renderqueue_p.h>
class tst_Renderer : public QObject
{
@@ -51,7 +50,7 @@ private Q_SLOTS:
{
// GIVEN
Qt3DRender::Render::NodeManagers nodeManagers;
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
Qt3DRender::Render::OffscreenSurfaceHelper offscreenHelper(&renderer);
Qt3DRender::Render::RenderSettings settings;
// owned by FG manager
@@ -78,17 +77,7 @@ 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({nullptr, {}});
+ renderer.m_sendBufferCaptureJob->addRequest({Qt3DCore::QNodeId(), {}});
jobs = renderer.preRenderingJobs();
// THEN
@@ -110,20 +99,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();
}
@@ -132,8 +107,8 @@ private Q_SLOTS:
{
// GIVEN
Qt3DRender::Render::NodeManagers nodeManagers;
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
- Qt3DRender::Render::RenderQueue *renderQueue = renderer.renderQueue();
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::RenderQueue *renderQueue = renderer.renderQueue();
Qt3DRender::Render::OffscreenSurfaceHelper offscreenHelper(&renderer);
Qt3DRender::Render::RenderSettings settings;
// owned by FG manager
@@ -154,39 +129,84 @@ private Q_SLOTS:
// NOTE: FilterCompatibleTechniqueJob and ShaderGathererJob cannot run because the context
// is not initialized in this test
- const int renderViewBuilderMaterialCacheJobCount = 1 + Qt3DRender::Render::RenderViewBuilder::optimalJobCount();
+ const int renderViewBuilderMaterialCacheJobCount = 1 + Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount();
// syncMaterialGathererJob
// n * materialGathererJob
const int layerCacheJobCount = 2;
// filterEntityByLayerJob,
// syncFilterEntityByLayerJob
- const int singleRenderViewJobCount = 8 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount();
+
+ const int singleRenderViewCommandRebuildJobCount = 1 + Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount();
+
+ const int singleRenderViewJobCount = 8 + 1 * Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount();
// RenderViewBuilder renderViewJob,
// syncRenderViewInitializationJob,
// syncFrustumCullingJob,
// filterProximityJob,
// setClearDrawBufferIndexJob,
// frustumCullingJob,
- // syncRenderCommandBuldingJob,
- // syncRenderViewCommandBuilderJob
+ // syncRenderCommandUpdateJob,
+ // syncRenderViewCommandPostUpdateJob
// n * (RenderViewCommandBuildJobs)
// WHEN
QVector<Qt3DCore::QAspectJobPtr> jobs = renderer.renderBinJobs();
- // THEN
+ // THEN -> AllDirty
+ // (Renderer is not initialized so FilterCompatibleTechniqueJob
+ // and ShaderGathererJob are not added here)
+ QCOMPARE(jobs.size(),
+ 1 + // EntityEnabledDirty
+ 1 + // WorldTransformJob
+ 1 + // UpdateWorldBoundingVolume
+ 1 + // UpdateShaderDataTransform
+ 1 + // ExpandBoundingVolumeJob
+ 1 + // CalculateBoundingVolumeJob
+ 1 + // UpdateMeshTriangleListJob
+ 1 + // updateSkinningPaletteJob
+ 1 + // SyncLoadingJobs
+ 1 + // updateLevelOfDetailJob
+ 1 + // cleanupJob
+ 1 + // VAOGatherer
+ 1 + // BufferGathererJob
+ 1 + // TexturesGathererJob
+ 1 + // UpdateEntityLayersJob
+ 1 + // LightGathererJob
+ 1 + // CacheLightJob
+ 1 + // RenderableEntityFilterJob
+ 1 + // CacheRenderableEntitiesJob
+ 1 + // ComputableEntityFilterJob
+ 1 + // CacheComputableEntitiesJob
+ singleRenderViewJobCount +
+ singleRenderViewCommandRebuildJobCount +
+ layerCacheJobCount +
+ renderViewBuilderMaterialCacheJobCount);
+
+ renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
+ renderQueue->reset();
+
+ // WHEN (nothing dirty, no buffers, no layers to be rebuilt, no materials to be rebuilt) (Nothing in cache)
+ renderer.markDirty(Qt3DRender::Render::AbstractRenderer::FrameGraphDirty, nullptr);
+ jobs = renderer.renderBinJobs();
+
+ // THEN (level
QCOMPARE(jobs.size(),
1 + // updateLevelOfDetailJob
1 + // cleanupJob
1 + // VAOGatherer
1 + // updateSkinningPaletteJob
- 1); // SyncLoadingJobs
+ 1 + // SyncLoadingJobs
+ singleRenderViewJobCount +
+ singleRenderViewCommandRebuildJobCount +
+ renderViewBuilderMaterialCacheJobCount +
+ layerCacheJobCount);
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
renderQueue->reset();
- // WHEN (nothing dirty, no buffers, no layers to be rebuilt, no materials to be rebuilt)
+ // WHEN (nothing dirty, no buffers, no layers to be rebuilt, no materials to be rebuilt) (RV leaf in cache)
renderer.markDirty(Qt3DRender::Render::AbstractRenderer::FrameGraphDirty, nullptr);
+ renderer.cache()->leafNodeCache[renderer.m_frameGraphLeaves.first()] = {};
jobs = renderer.renderBinJobs();
// THEN (level
@@ -197,6 +217,7 @@ private Q_SLOTS:
1 + // updateSkinningPaletteJob
1 + // SyncLoadingJobs
singleRenderViewJobCount +
+ singleRenderViewCommandRebuildJobCount +
renderViewBuilderMaterialCacheJobCount +
layerCacheJobCount);
@@ -253,6 +274,7 @@ private Q_SLOTS:
1 + // updateSkinningPaletteJob
1 + // SyncLoadingJobs
singleRenderViewJobCount +
+ singleRenderViewCommandRebuildJobCount +
renderViewBuilderMaterialCacheJobCount);
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
@@ -274,6 +296,7 @@ private Q_SLOTS:
1 + // ExpandBoundingVolumeJob
1 + // RenderableEntityFilterPtr
1 + // SyncRenderableEntities
+ singleRenderViewCommandRebuildJobCount +
singleRenderViewJobCount);
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
@@ -315,41 +338,6 @@ private Q_SLOTS:
renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
renderQueue->reset();
- // WHEN
- renderer.markDirty(Qt3DRender::Render::AbstractRenderer::AllDirty, nullptr);
- jobs = renderer.renderBinJobs();
-
- // THEN (Renderer is not initialized so FilterCompatibleTechniqueJob
- // and ShaderGathererJob are not added here)
- QCOMPARE(jobs.size(),
- 1 + // EntityEnabledDirty
- 1 + // WorldTransformJob
- 1 + // UpdateWorldBoundingVolume
- 1 + // UpdateShaderDataTransform
- 1 + // ExpandBoundingVolumeJob
- 1 + // CalculateBoundingVolumeJob
- 1 + // UpdateMeshTriangleListJob
- 1 + // updateSkinningPaletteJob
- 1 + // SyncLoadingJobs
- 1 + // updateLevelOfDetailJob
- 1 + // cleanupJob
- 1 + // VAOGatherer
- 1 + // BufferGathererJob
- 1 + // TexturesGathererJob
- 1 + // UpdateEntityLayersJob
- 1 + // LightGathererJob
- 1 + // CacheLightJob
- 1 + // RenderableEntityFilterJob
- 1 + // CacheRenderableEntitiesJob
- 1 + // ComputableEntityFilterJob
- 1 + // CacheComputableEntitiesJob
- singleRenderViewJobCount +
- layerCacheJobCount +
- renderViewBuilderMaterialCacheJobCount);
-
- renderer.clearDirtyBits(Qt3DRender::Render::AbstractRenderer::AllDirty);
- renderQueue->reset();
-
// Properly shutdown command thread
renderer.shutdown();
}
diff --git a/tests/auto/render/renderqueue/renderqueue.pro b/tests/auto/render/opengl/renderqueue/renderqueue.pro
index 945fe4cf4..19106ba92 100644
--- a/tests/auto/render/renderqueue/renderqueue.pro
+++ b/tests/auto/render/opengl/renderqueue/renderqueue.pro
@@ -8,4 +8,7 @@ CONFIG += testcase
SOURCES += tst_renderqueue.cpp
-include(../../core/common/common.pri)
+include(../../../core/common/common.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/renderqueue/tst_renderqueue.cpp b/tests/auto/render/opengl/renderqueue/tst_renderqueue.cpp
index 071f9b3a5..728648a3c 100644
--- a/tests/auto/render/renderqueue/tst_renderqueue.cpp
+++ b/tests/auto/render/opengl/renderqueue/tst_renderqueue.cpp
@@ -30,8 +30,8 @@
#include <QMutex>
#include <QWaitCondition>
#include <QThread>
-#include <Qt3DRender/private/renderqueue_p.h>
-#include <Qt3DRender/private/renderview_p.h>
+#include <renderqueue_p.h>
+#include <renderview_p.h>
class tst_RenderQueue : public QObject
{
@@ -53,7 +53,7 @@ private Q_SLOTS:
void tst_RenderQueue::setRenderViewCount()
{
// GIVEN
- Qt3DRender::Render::RenderQueue renderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue renderQueue;
// THEN
QCOMPARE(renderQueue.wasReset(), true);
@@ -70,7 +70,7 @@ void tst_RenderQueue::setRenderViewCount()
void tst_RenderQueue::circleQueues()
{
// GIVEN
- Qt3DRender::Render::RenderQueue renderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue renderQueue;
renderQueue.setTargetRenderViewCount(7);
// WHEN
@@ -85,9 +85,9 @@ void tst_RenderQueue::circleQueues()
QCOMPARE(renderQueue.currentRenderViewCount(), 0);
// WHEN
- QList<Qt3DRender::Render::RenderView *> renderViews;
+ QList<Qt3DRender::Render::OpenGL::RenderView *> renderViews;
for (int i = 0; i < 7; i++) {
- renderViews << new Qt3DRender::Render::RenderView();
+ renderViews << new Qt3DRender::Render::OpenGL::RenderView();
renderQueue.queueRenderView(renderViews.at(i), i);
}
@@ -99,19 +99,19 @@ void tst_RenderQueue::circleQueues()
void tst_RenderQueue::checkOrder()
{
// GIVEN
- Qt3DRender::Render::RenderQueue renderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue renderQueue;
renderQueue.setTargetRenderViewCount(7);
- QVector<Qt3DRender::Render::RenderView *> renderViews(7);
+ QVector<Qt3DRender::Render::OpenGL::RenderView *> renderViews(7);
// WHEN
for (int i = 0; i < 7; ++i) {
int processingOrder = (i % 2 == 0) ? (6 - i) : i;
- renderViews[processingOrder] = new Qt3DRender::Render::RenderView();
+ renderViews[processingOrder] = new Qt3DRender::Render::OpenGL::RenderView();
renderQueue.queueRenderView(renderViews[processingOrder], processingOrder);
}
// THEN
- QVector<Qt3DRender::Render::RenderView *> frame = renderQueue.nextFrameQueue();
+ QVector<Qt3DRender::Render::OpenGL::RenderView *> frame = renderQueue.nextFrameQueue();
for (int i = 0; i < 7; ++i) {
QVERIFY(frame[i] == renderViews[i]);
}
@@ -120,14 +120,14 @@ void tst_RenderQueue::checkOrder()
void tst_RenderQueue::checkTimeToSubmit()
{
// GIVEN
- Qt3DRender::Render::RenderQueue renderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue renderQueue;
renderQueue.setTargetRenderViewCount(7);
- QVector<Qt3DRender::Render::RenderView *> renderViews(7);
+ QVector<Qt3DRender::Render::OpenGL::RenderView *> renderViews(7);
// WHEN
for (int i = 0; i < 7; i++) {
int processingOrder = (i % 2 == 0) ? (6 - i) : i;
- renderViews[processingOrder] = new Qt3DRender::Render::RenderView();
+ renderViews[processingOrder] = new Qt3DRender::Render::OpenGL::RenderView();
renderQueue.queueRenderView(renderViews[processingOrder], processingOrder);
// THEN
@@ -144,7 +144,7 @@ class SimpleWorker : public QThread
public:
QSemaphore m_waitSubmit;
QSemaphore m_waitQueue;
- Qt3DRender::Render::RenderQueue *m_renderQueues;
+ Qt3DRender::Render::OpenGL::RenderQueue *m_renderQueues;
public Q_SLOTS:
@@ -160,7 +160,7 @@ public Q_SLOTS:
// THEN
QCOMPARE(m_renderQueues->currentRenderViewCount(), j);
// WHEN
- m_renderQueues->queueRenderView(new Qt3DRender::Render::RenderView(), j);
+ m_renderQueues->queueRenderView(new Qt3DRender::Render::OpenGL::RenderView(), j);
// THEN
QVERIFY(m_renderQueues->targetRenderViewCount() == 7);
QCOMPARE(m_renderQueues->currentRenderViewCount(), j + 1);
@@ -178,7 +178,7 @@ public Q_SLOTS:
void tst_RenderQueue::concurrentQueueAccess()
{
// GIVEN
- Qt3DRender::Render::RenderQueue *renderQueue = new Qt3DRender::Render::RenderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue *renderQueue = new Qt3DRender::Render::OpenGL::RenderQueue;
SimpleWorker *jobsThread = new SimpleWorker();
renderQueue->setTargetRenderViewCount(7);
@@ -212,7 +212,7 @@ void tst_RenderQueue::concurrentQueueAccess()
void tst_RenderQueue::resetQueue()
{
// GIVEN
- Qt3DRender::Render::RenderQueue renderQueue;
+ Qt3DRender::Render::OpenGL::RenderQueue renderQueue;
for (int j = 0; j < 5; j++) {
// WHEN
@@ -222,7 +222,7 @@ void tst_RenderQueue::resetQueue()
QVERIFY(renderQueue.currentRenderViewCount() == 0);
// WHEN
- QVector<Qt3DRender::Render::RenderView *> renderViews(5);
+ QVector<Qt3DRender::Render::OpenGL::RenderView *> renderViews(5);
for (int i = 0; i < 5; ++i) {
renderQueue.queueRenderView(renderViews.at(i), i);
}
diff --git a/tests/auto/render/renderviewbuilder/renderviewbuilder.pro b/tests/auto/render/opengl/renderviewbuilder/renderviewbuilder.pro
index 00fdd49cf..b7b8f5b81 100644
--- a/tests/auto/render/renderviewbuilder/renderviewbuilder.pro
+++ b/tests/auto/render/opengl/renderviewbuilder/renderviewbuilder.pro
@@ -8,5 +8,8 @@ CONFIG += testcase
SOURCES += tst_renderviewbuilder.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp b/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp
index 96d51a3a9..fe534e243 100644
--- a/tests/auto/render/renderviewbuilder/tst_renderviewbuilder.cpp
+++ b/tests/auto/render/opengl/renderviewbuilder/tst_renderviewbuilder.cpp
@@ -31,7 +31,7 @@
#include <Qt3DCore/private/qnodevisitor_p.h>
#include <Qt3DCore/private/qnode_p.h>
-#include <Qt3DRender/private/renderviewbuilder_p.h>
+#include <renderviewbuilder_p.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
#include <Qt3DRender/qviewport.h>
#include <Qt3DRender/qclearbuffers.h>
@@ -52,6 +52,7 @@
#include <Qt3DRender/private/qrenderaspect_p.h>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/managers_p.h>
+#include <Qt3DRender/private/filterentitybycomponentjob_p.h>
QT_BEGIN_NAMESPACE
@@ -95,14 +96,14 @@ public:
return d_func()->m_renderer->nodeManagers();
}
- Render::Renderer *renderer() const
+ Render::OpenGL::Renderer *renderer() const
{
- return static_cast<Render::Renderer *>(d_func()->m_renderer);
+ return static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer);
}
- Render::MaterialParameterGathererJobPtr materialGathererJob() const
+ Render::OpenGL::MaterialParameterGathererJobPtr materialGathererJob() const
{
- Render::MaterialParameterGathererJobPtr job = Render::MaterialParameterGathererJobPtr::create();
+ Render::OpenGL::MaterialParameterGathererJobPtr job = Render::OpenGL::MaterialParameterGathererJobPtr::create();
job->setNodeManagers(nodeManagers());
return job;
}
@@ -215,7 +216,7 @@ private Q_SLOTS:
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
// THEN
QCOMPARE(renderViewBuilder.renderViewIndex(), 0);
@@ -224,36 +225,36 @@ private Q_SLOTS:
QCOMPARE(renderViewBuilder.materialGathererCacheNeedsToBeRebuilt(), false);
QVERIFY(!renderViewBuilder.renderViewJob().isNull());
QVERIFY(!renderViewBuilder.frustumCullingJob().isNull());
- QVERIFY(!renderViewBuilder.syncFrustumCullingJob().isNull());
+ QVERIFY(!renderViewBuilder.syncPreFrustumCullingJob().isNull());
QVERIFY(!renderViewBuilder.setClearDrawBufferIndexJob().isNull());
QVERIFY(renderViewBuilder.filterEntityByLayerJob().isNull());
QVERIFY(renderViewBuilder.syncFilterEntityByLayerJob().isNull());
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob().isNull());
- QVERIFY(renderViewBuilder.syncRenderViewCommandBuildersJob().isNull());
- QVERIFY(renderViewBuilder.syncRenderViewInitializationJob().isNull());
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob().isNull());
+ QVERIFY(renderViewBuilder.syncRenderViewPostCommandUpdateJob().isNull());
+ QVERIFY(renderViewBuilder.syncRenderViewPostInitializationJob().isNull());
- QCOMPARE(renderViewBuilder.renderViewBuilderJobs().size(), 0);
+ QCOMPARE(renderViewBuilder.renderViewCommandUpdaterJobs().size(), 0);
QCOMPARE(renderViewBuilder.materialGathererJobs().size(), 0);
// WHEN
renderViewBuilder.prepareJobs();
// THEN
- QVERIFY(!renderViewBuilder.syncRenderCommandBuildingJob().isNull());
- QVERIFY(!renderViewBuilder.syncRenderViewCommandBuildersJob().isNull());
- QVERIFY(!renderViewBuilder.syncRenderViewInitializationJob().isNull());
+ QVERIFY(!renderViewBuilder.syncRenderViewPreCommandUpdateJob().isNull());
+ QVERIFY(!renderViewBuilder.syncRenderViewPostCommandUpdateJob().isNull());
+ QVERIFY(!renderViewBuilder.syncRenderViewPostInitializationJob().isNull());
QVERIFY(renderViewBuilder.filterEntityByLayerJob().isNull());
QVERIFY(renderViewBuilder.syncFilterEntityByLayerJob().isNull());
- QCOMPARE(renderViewBuilder.renderViewBuilderJobs().size(), Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
+ QCOMPARE(renderViewBuilder.renderViewCommandUpdaterJobs().size(), Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount());
QCOMPARE(renderViewBuilder.materialGathererJobs().size(), 0);
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 8 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
+ QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 8 + 1 * Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount());
}
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.setLayerCacheNeedsToBeRebuilt(true);
renderViewBuilder.prepareJobs();
@@ -263,55 +264,22 @@ private Q_SLOTS:
QVERIFY(!renderViewBuilder.syncFilterEntityByLayerJob().isNull());
// mark jobs dirty and recheck
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 10 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
+ QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 10 + 1 * Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount());
}
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.setMaterialGathererCacheNeedsToBeRebuilt(true);
renderViewBuilder.prepareJobs();
// THEN
QCOMPARE(renderViewBuilder.materialGathererCacheNeedsToBeRebuilt(), true);
- QCOMPARE(renderViewBuilder.materialGathererJobs().size(), Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
+ QCOMPARE(renderViewBuilder.materialGathererJobs().size(), Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount());
QVERIFY(!renderViewBuilder.syncMaterialGathererJob().isNull());
// mark jobs dirty and recheck
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 9 + 2 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
- }
-
- {
- // WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setLightGathererCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
-
- // THEN
- QCOMPARE(renderViewBuilder.lightGathererCacheNeedsToBeRebuilt(), true);
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 10 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
- }
-
- {
- // WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setRenderableCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
-
- // THEN
- QCOMPARE(renderViewBuilder.renderableCacheNeedsToBeRebuilt(), true);
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 10 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
- }
-
- {
- // WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setComputableCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
-
- // THEN
- QCOMPARE(renderViewBuilder.computableCacheNeedsToBeRebuilt(), true);
- QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 10 + 1 * Qt3DRender::Render::RenderViewBuilder::optimalJobCount());
+ QCOMPARE(renderViewBuilder.buildJobHierachy().size(), 9 + 2 * Qt3DRender::Render::OpenGL::RenderViewBuilder::optimalJobCount());
}
}
@@ -328,7 +296,7 @@ private Q_SLOTS:
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
@@ -338,8 +306,8 @@ private Q_SLOTS:
// Step 2
- QCOMPARE(renderViewBuilder.syncRenderViewInitializationJob()->dependencies().size(), 1);
- QCOMPARE(renderViewBuilder.syncRenderViewInitializationJob()->dependencies().constFirst().toStrongRef().data(),
+ QCOMPARE(renderViewBuilder.syncRenderViewPostInitializationJob()->dependencies().size(), 1);
+ QCOMPARE(renderViewBuilder.syncRenderViewPostInitializationJob()->dependencies().constFirst().toStrongRef().data(),
renderViewBuilder.renderViewJob().data());
// Step 3
@@ -347,48 +315,49 @@ private Q_SLOTS:
QVERIFY(renderViewBuilder.syncFilterEntityByLayerJob().isNull());
QCOMPARE(renderViewBuilder.filterProximityJob()->dependencies().size(), 2);
- QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
+ QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(testAspect.renderer()->expandBoundingVolumeJob()));
QCOMPARE(renderViewBuilder.setClearDrawBufferIndexJob()->dependencies().size(), 1);
QCOMPARE(renderViewBuilder.setClearDrawBufferIndexJob()->dependencies().constFirst().toStrongRef().data(),
- renderViewBuilder.syncRenderViewInitializationJob().data());
+ renderViewBuilder.syncRenderViewPostInitializationJob().data());
- QCOMPARE(renderViewBuilder.syncFrustumCullingJob()->dependencies().size(), 3);
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateWorldTransformJob()));
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateShaderDataTransformJob()));
+ QCOMPARE(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().size(), 3);
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateWorldTransformJob()));
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateShaderDataTransformJob()));
// Step 4
QCOMPARE(renderViewBuilder.frustumCullingJob()->dependencies().size(), 2);
- QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(renderViewBuilder.syncFrustumCullingJob()));
+ QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(renderViewBuilder.syncPreFrustumCullingJob()));
QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(testAspect.renderer()->expandBoundingVolumeJob()));
- QCOMPARE(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().size(), renderViewBuilder.materialGathererJobs().size() + 6);
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.filterProximityJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.frustumCullingJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->introspectShadersJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->bufferGathererJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->textureGathererJob()));
+ QCOMPARE(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().size(), renderViewBuilder.materialGathererJobs().size() + 7);
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.filterProximityJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.frustumCullingJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->introspectShadersJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->bufferGathererJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->textureGathererJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->cacheLightJob()));
// Step 5
- for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewBuilderJobs()) {
+ for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewCommandUpdaterJobs()) {
QCOMPARE(renderViewBuilderJob->dependencies().size(), 1);
QCOMPARE(renderViewBuilderJob->dependencies().constFirst().toStrongRef().data(),
- renderViewBuilder.syncRenderCommandBuildingJob().data());
+ renderViewBuilder.syncRenderViewPreCommandUpdateJob().data());
}
// Step 6
- QCOMPARE(renderViewBuilder.syncRenderViewCommandBuildersJob()->dependencies().size(), renderViewBuilder.renderViewBuilderJobs().size());
- for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewBuilderJobs()) {
- QVERIFY(renderViewBuilder.syncRenderViewCommandBuildersJob()->dependencies().contains(renderViewBuilderJob));
+ QCOMPARE(renderViewBuilder.syncRenderViewPostCommandUpdateJob()->dependencies().size(), renderViewBuilder.renderViewCommandUpdaterJobs().size());
+ for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewCommandUpdaterJobs()) {
+ QVERIFY(renderViewBuilder.syncRenderViewPostCommandUpdateJob()->dependencies().contains(renderViewBuilderJob));
}
}
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.setLayerCacheNeedsToBeRebuilt(true);
renderViewBuilder.setMaterialGathererCacheNeedsToBeRebuilt(true);
renderViewBuilder.prepareJobs();
@@ -399,63 +368,63 @@ private Q_SLOTS:
QCOMPARE(renderViewBuilder.renderViewJob()->dependencies().size(), 1); // Depends upon skinning palette update
// Step 2
- QCOMPARE(renderViewBuilder.syncRenderViewInitializationJob()->dependencies().size(), 1);
- QCOMPARE(renderViewBuilder.syncRenderViewInitializationJob()->dependencies().constFirst().toStrongRef().data(),
+ QCOMPARE(renderViewBuilder.syncRenderViewPostInitializationJob()->dependencies().size(), 1);
+ QCOMPARE(renderViewBuilder.syncRenderViewPostInitializationJob()->dependencies().constFirst().toStrongRef().data(),
renderViewBuilder.renderViewJob().data());
// Step 3
QCOMPARE(renderViewBuilder.filterEntityByLayerJob()->dependencies().size(), 3);
QVERIFY(renderViewBuilder.filterEntityByLayerJob()->dependencies().contains(testAspect.renderer()->updateEntityLayersJob()));
- QVERIFY(renderViewBuilder.filterEntityByLayerJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
+ QVERIFY(renderViewBuilder.filterEntityByLayerJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
QVERIFY(renderViewBuilder.filterEntityByLayerJob()->dependencies().contains(testAspect.renderer()->updateTreeEnabledJob()));
QCOMPARE(renderViewBuilder.syncFilterEntityByLayerJob()->dependencies().size(), 1);
QVERIFY(renderViewBuilder.syncFilterEntityByLayerJob()->dependencies().contains(renderViewBuilder.filterEntityByLayerJob()));
QCOMPARE(renderViewBuilder.filterProximityJob()->dependencies().size(), 2);
- QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
+ QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
QVERIFY(renderViewBuilder.filterProximityJob()->dependencies().contains(testAspect.renderer()->expandBoundingVolumeJob()));
QCOMPARE(renderViewBuilder.setClearDrawBufferIndexJob()->dependencies().size(), 1);
QCOMPARE(renderViewBuilder.setClearDrawBufferIndexJob()->dependencies().constFirst().toStrongRef().data(),
- renderViewBuilder.syncRenderViewInitializationJob().data());
+ renderViewBuilder.syncRenderViewPostInitializationJob().data());
- QCOMPARE(renderViewBuilder.syncFrustumCullingJob()->dependencies().size(), 3);
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateWorldTransformJob()));
- QVERIFY(renderViewBuilder.syncFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateShaderDataTransformJob()));
+ QCOMPARE(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().size(), 3);
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateWorldTransformJob()));
+ QVERIFY(renderViewBuilder.syncPreFrustumCullingJob()->dependencies().contains(testAspect.renderer()->updateShaderDataTransformJob()));
for (const auto &materialGatherer : renderViewBuilder.materialGathererJobs()) {
QCOMPARE(materialGatherer->dependencies().size(), 3);
- QVERIFY(materialGatherer->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
+ QVERIFY(materialGatherer->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
QVERIFY(materialGatherer->dependencies().contains(testAspect.renderer()->introspectShadersJob()));
QVERIFY(materialGatherer->dependencies().contains(testAspect.renderer()->filterCompatibleTechniqueJob()));
}
// Step 4
QCOMPARE(renderViewBuilder.frustumCullingJob()->dependencies().size(), 2);
- QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(renderViewBuilder.syncFrustumCullingJob()));
+ QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(renderViewBuilder.syncPreFrustumCullingJob()));
QVERIFY(renderViewBuilder.frustumCullingJob()->dependencies().contains(testAspect.renderer()->expandBoundingVolumeJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.syncRenderViewInitializationJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.syncFilterEntityByLayerJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.frustumCullingJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(renderViewBuilder.filterProximityJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->introspectShadersJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->bufferGathererJob()));
- QVERIFY(renderViewBuilder.syncRenderCommandBuildingJob()->dependencies().contains(testAspect.renderer()->textureGathererJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.syncRenderViewPostInitializationJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.syncFilterEntityByLayerJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.frustumCullingJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(renderViewBuilder.filterProximityJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->introspectShadersJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->bufferGathererJob()));
+ QVERIFY(renderViewBuilder.syncRenderViewPreCommandUpdateJob()->dependencies().contains(testAspect.renderer()->textureGathererJob()));
// Step 5
- for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewBuilderJobs()) {
+ for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewCommandUpdaterJobs()) {
QCOMPARE(renderViewBuilderJob->dependencies().size(), 1);
QCOMPARE(renderViewBuilderJob->dependencies().constFirst().toStrongRef().data(),
- renderViewBuilder.syncRenderCommandBuildingJob().data());
+ renderViewBuilder.syncRenderViewPreCommandUpdateJob().data());
}
// Step 6
- QCOMPARE(renderViewBuilder.syncRenderViewCommandBuildersJob()->dependencies().size(), renderViewBuilder.renderViewBuilderJobs().size());
- for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewBuilderJobs()) {
- QVERIFY(renderViewBuilder.syncRenderViewCommandBuildersJob()->dependencies().contains(renderViewBuilderJob));
+ QCOMPARE(renderViewBuilder.syncRenderViewPostCommandUpdateJob()->dependencies().size(), renderViewBuilder.renderViewCommandUpdaterJobs().size());
+ for (const auto &renderViewBuilderJob : renderViewBuilder.renderViewCommandUpdaterJobs()) {
+ QVERIFY(renderViewBuilder.syncRenderViewPostCommandUpdateJob()->dependencies().contains(renderViewBuilderJob));
}
}
}
@@ -472,7 +441,7 @@ private Q_SLOTS:
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
renderViewBuilder.renderViewJob()->run();
@@ -487,21 +456,18 @@ private Q_SLOTS:
Qt3DRender::QViewport *viewport = new Qt3DRender::QViewport();
Qt3DRender::QClearBuffers *clearBuffer = new Qt3DRender::QClearBuffers(viewport);
Qt3DRender::TestAspect testAspect(buildSimpleScene(viewport));
+ Qt3DRender::Render::OpenGL::Renderer *renderer = testAspect.renderer();
// THEN
Qt3DRender::Render::FrameGraphNode *leafNode = testAspect.nodeManagers()->frameGraphManager()->lookupNode(clearBuffer->id());
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setLightGathererCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
- renderViewBuilder.buildJobHierachy();
- renderViewBuilder.lightGathererJob()->run();
+ renderer->lightGathererJob()->run();
// THEN
- QCOMPARE(renderViewBuilder.lightGathererJob()->lights().size(), 2);
- QVERIFY(renderViewBuilder.lightGathererJob()->takeEnvironmentLight() != nullptr);
+ QCOMPARE(renderer->lightGathererJob()->lights().size(), 2);
+ QVERIFY(renderer->lightGathererJob()->takeEnvironmentLight() != nullptr);
}
void checkRenderableEntitiesFilteringExecution()
@@ -510,20 +476,17 @@ private Q_SLOTS:
Qt3DRender::QViewport *viewport = new Qt3DRender::QViewport();
Qt3DRender::QClearBuffers *clearBuffer = new Qt3DRender::QClearBuffers(viewport);
Qt3DRender::TestAspect testAspect(buildSimpleScene(viewport));
+ Qt3DRender::Render::OpenGL::Renderer *renderer = testAspect.renderer();
// THEN
Qt3DRender::Render::FrameGraphNode *leafNode = testAspect.nodeManagers()->frameGraphManager()->lookupNode(clearBuffer->id());
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setRenderableCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
- renderViewBuilder.buildJobHierachy();
- renderViewBuilder.renderableEntityFilterJob()->run();
+ renderer->renderableEntityFilterJob()->run();
// THEN
- QCOMPARE(renderViewBuilder.renderableEntityFilterJob()->filteredEntities().size(), 1);
+ QCOMPARE(renderer->renderableEntityFilterJob()->filteredEntities().size(), 1);
}
void checkComputableEntitiesFilteringExecution()
@@ -532,20 +495,17 @@ private Q_SLOTS:
Qt3DRender::QViewport *viewport = new Qt3DRender::QViewport();
Qt3DRender::QClearBuffers *clearBuffer = new Qt3DRender::QClearBuffers(viewport);
Qt3DRender::TestAspect testAspect(buildSimpleScene(viewport));
+ Qt3DRender::Render::OpenGL::Renderer *renderer = testAspect.renderer();
// THEN
Qt3DRender::Render::FrameGraphNode *leafNode = testAspect.nodeManagers()->frameGraphManager()->lookupNode(clearBuffer->id());
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
- renderViewBuilder.setComputableCacheNeedsToBeRebuilt(true);
- renderViewBuilder.prepareJobs();
- renderViewBuilder.buildJobHierachy();
- renderViewBuilder.computableEntityFilterJob()->run();
+ renderer->computableEntityFilterJob()->run();
// THEN
- QCOMPARE(renderViewBuilder.computableEntityFilterJob()->filteredEntities().size(), 1);
+ QCOMPARE(renderer->computableEntityFilterJob()->filteredEntities().size(), 1);
}
void checkSyncRenderViewInitializationExecution()
@@ -568,7 +528,7 @@ private Q_SLOTS:
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
@@ -581,7 +541,7 @@ private Q_SLOTS:
// WHEN
renderViewBuilder.renderViewJob()->run();
- renderViewBuilder.syncRenderViewInitializationJob()->run();
+ renderViewBuilder.syncRenderViewPostInitializationJob()->run();
// THEN
QCOMPARE(renderViewBuilder.frustumCullingJob()->isActive(), true);
@@ -592,7 +552,7 @@ private Q_SLOTS:
}
{
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.setLayerCacheNeedsToBeRebuilt(true);
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
@@ -608,7 +568,7 @@ private Q_SLOTS:
// WHEN
renderViewBuilder.renderViewJob()->run();
- renderViewBuilder.syncRenderViewInitializationJob()->run();
+ renderViewBuilder.syncRenderViewPostInitializationJob()->run();
// THEN
QCOMPARE(renderViewBuilder.frustumCullingJob()->isActive(), true);
@@ -638,7 +598,7 @@ private Q_SLOTS:
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
@@ -647,7 +607,7 @@ private Q_SLOTS:
// WHEN
renderViewBuilder.renderViewJob()->run();
- renderViewBuilder.syncFrustumCullingJob()->run();
+ renderViewBuilder.syncPreFrustumCullingJob()->run();
// THEN
QCOMPARE(convertToQMatrix4x4(renderViewBuilder.frustumCullingJob()->viewProjection()), camera->projectionMatrix() * camera->viewMatrix());
@@ -662,24 +622,29 @@ private Q_SLOTS:
Qt3DRender::QLayer *layer = new Qt3DRender::QLayer();
layerFilter->addLayer(layer);
Qt3DRender::TestAspect testAspect(buildEntityFilterTestScene(viewport, layer));
+ Qt3DRender::Render::OpenGL::Renderer *renderer = testAspect.renderer();
// THEN
Qt3DRender::Render::FrameGraphNode *leafNode = testAspect.nodeManagers()->frameGraphManager()->lookupNode(layerFilter->id());
QVERIFY(leafNode != nullptr);
// WHEN
- Qt3DRender::Render::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+ renderer->markDirty(Qt3DRender::Render::AbstractRenderer::AllDirty, nullptr);
+
+ Qt3DRender::Render::OpenGL::RenderViewBuilder renderViewBuilder(leafNode, 0, testAspect.renderer());
+
renderViewBuilder.setLayerCacheNeedsToBeRebuilt(true);
- renderViewBuilder.setRenderableCacheNeedsToBeRebuilt(true);
renderViewBuilder.prepareJobs();
renderViewBuilder.buildJobHierachy();
+ renderer->renderableEntityFilterJob()->run();
+ renderer->cacheRenderableEntitiesJob()->run();
+
renderViewBuilder.renderViewJob()->run();
- renderViewBuilder.renderableEntityFilterJob()->run();
- renderViewBuilder.syncRenderViewInitializationJob()->run();
+ renderViewBuilder.syncRenderViewPostInitializationJob()->run();
renderViewBuilder.filterEntityByLayerJob()->run();
- QVector<Qt3DRender::Render::Entity *> renderableEntity = renderViewBuilder.renderableEntityFilterJob()->filteredEntities();
+ QVector<Qt3DRender::Render::Entity *> renderableEntity = renderer->renderableEntityFilterJob()->filteredEntities();
QVector<Qt3DRender::Render::Entity *> filteredEntity = renderViewBuilder.filterEntityByLayerJob()->filteredEntities();
// THEN
@@ -689,7 +654,7 @@ private Q_SLOTS:
std::sort(renderableEntity.begin(), renderableEntity.end());
// WHEN
- renderableEntity = Qt3DRender::Render::RenderViewBuilder::entitiesInSubset(renderableEntity, filteredEntity);
+ renderableEntity = Qt3DRender::Render::OpenGL::RenderViewBuilder::entitiesInSubset(renderableEntity, filteredEntity);
// THEN
QCOMPARE(renderableEntity.size(), 100);
diff --git a/tests/auto/render/renderviews/renderviews.pro b/tests/auto/render/opengl/renderviews/renderviews.pro
index 046c00696..7efbaec14 100644
--- a/tests/auto/render/renderviews/renderviews.pro
+++ b/tests/auto/render/opengl/renderviews/renderviews.pro
@@ -8,5 +8,8 @@ CONFIG += testcase
SOURCES += tst_renderviews.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/renderviews/tst_renderviews.cpp b/tests/auto/render/opengl/renderviews/tst_renderviews.cpp
index 5c377788b..6d01122d1 100644
--- a/tests/auto/render/renderviews/tst_renderviews.cpp
+++ b/tests/auto/render/opengl/renderviews/tst_renderviews.cpp
@@ -28,12 +28,17 @@
#include <QtTest/QTest>
#include <qbackendnodetester.h>
-#include <private/renderview_p.h>
#include <private/memorybarrier_p.h>
-#include <private/renderviewjobutils_p.h>
-#include <private/rendercommand_p.h>
#include <testpostmanarbiter.h>
#include <testrenderer.h>
+#include <private/shader_p.h>
+#include <Qt3DRender/qshaderprogram.h>
+#include <renderview_p.h>
+#include <renderviewjobutils_p.h>
+#include <rendercommand_p.h>
+#include <renderer_p.h>
+#include <glresourcemanagers_p.h>
+#include <private/shader_p.h>
QT_BEGIN_NAMESPACE
@@ -41,6 +46,8 @@ namespace Qt3DRender {
namespace Render {
+namespace OpenGL {
+
namespace {
void compareShaderParameterPacks(const ShaderParameterPack &t1,
@@ -49,16 +56,11 @@ void compareShaderParameterPacks(const ShaderParameterPack &t1,
const PackUniformHash hash1 = t1.uniforms();
const PackUniformHash hash2 = t2.uniforms();
- QCOMPARE(hash1.size(), hash2.size());
-
- auto it = hash1.constBegin();
- const auto end = hash1.constEnd();
+ QCOMPARE(hash1.keys.size(), hash2.keys.size());
- while (it != end) {
- const auto h2It = hash2.find(it.key());
- QVERIFY(h2It != hash2.cend());
- QCOMPARE(it.value(), h2It.value());
- ++it;
+ for (int i = 0, m = hash1.keys.size(); i < m; ++i) {
+ const int key = hash1.keys.at(i);
+ QCOMPARE(hash1.value(key), hash2.value(key));
}
}
@@ -67,6 +69,7 @@ void compareShaderParameterPacks(const ShaderParameterPack &t1,
class tst_RenderViews : public Qt3DCore::QBackendNodeTester
{
Q_OBJECT
+
private Q_SLOTS:
void checkRenderViewSizeFitsWithAllocator()
@@ -124,7 +127,7 @@ private Q_SLOTS:
QCOMPARE(backendBarrier.waitOperations(), barriers);
// WHEN
- Qt3DRender::Render::setRenderViewConfigFromFrameGraphLeafNode(&renderView, &backendBarrier);
+ Qt3DRender::Render::OpenGL::setRenderViewConfigFromFrameGraphLeafNode(&renderView, &backendBarrier);
// THEN
QCOMPARE(backendBarrier.waitOperations(), renderView.memoryBarrier());
@@ -135,15 +138,20 @@ private Q_SLOTS:
void checkRenderCommandBackToFrontSorting()
{
// GIVEN
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ 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) {
- RenderCommand *c = new RenderCommand();
- c->m_depth = float(i);
+ RenderCommand c;
+ c.m_depth = float(i);
rawCommands.push_back(c);
}
@@ -153,34 +161,40 @@ private Q_SLOTS:
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands.size(), sortedCommands.size());
for (int j = 1; j < sortedCommands.size(); ++j)
- QVERIFY(sortedCommands.at(j - 1)->m_depth > sortedCommands.at(j)->m_depth);
+ 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;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ 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 = new RenderCommand();
- c->m_shaderDna = dnas[i % 5];
+ RenderCommand c;
+ c.m_glShader = dnas[i % 5];
rawCommands.push_back(c);
}
@@ -190,26 +204,27 @@ private Q_SLOTS:
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
+ 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");
@@ -220,68 +235,96 @@ 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);
- RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ Qt3DRender::Render::NodeManagers nodeManagers;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ renderer.setNodeManagers(&nodeManagers);
- for (int i = 0, m = programDNAs.size(); i < m; ++i) {
- RenderCommand *c = new RenderCommand();
- c->m_shaderDna = programDNAs.at(i);
- c->m_parameterPack = rawParameters.at(i);
+ 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 = shaders.size(); i < m; ++i) {
+ RenderCommand c;
+ 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();
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands, sortedCommands);
- for (int i = 0, m = programDNAs.size(); i < m; ++i) {
- const RenderCommand *c = sortedCommands.at(i);
- QCOMPARE(c->m_shaderDna, programDNAs.at(i));
- compareShaderParameterPacks(c->m_parameterPack, expectedMinimizedParameters.at(i));
+ for (int i = 0, m = shaders.size(); i < m; ++i) {
+ const RenderCommand c = sortedCommands.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;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ 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) {
- RenderCommand *c = new RenderCommand();
- c->m_depth = float(i);
+ RenderCommand c;
+ c.m_depth = float(i);
rawCommands.push_back(c);
}
@@ -291,26 +334,32 @@ private Q_SLOTS:
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands.size(), sortedCommands.size());
for (int j = 1; j < sortedCommands.size(); ++j)
- QVERIFY(sortedCommands.at(j - 1)->m_depth < sortedCommands.at(j)->m_depth);
+ 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;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ 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) {
- RenderCommand *c = new RenderCommand();
- c->m_changeCost = i;
+ RenderCommand c;
+ c.m_changeCost = i;
rawCommands.push_back(c);
}
@@ -320,30 +369,37 @@ private Q_SLOTS:
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands.size(), sortedCommands.size());
for (int j = 1; j < sortedCommands.size(); ++j)
- QVERIFY(sortedCommands.at(j - 1)->m_changeCost > sortedCommands.at(j)->m_changeCost);
+ 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;
+ Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
RenderView renderView;
- QVector<RenderCommand *> rawCommands;
+ 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] = {
@@ -357,25 +413,25 @@ private Q_SLOTS:
200
};
- auto buildRC = [] (ProgramDNA dna, float depth, int changeCost) {
- RenderCommand *c = new RenderCommand();
- c->m_shaderDna = dna;
- c->m_depth = depth;
- c->m_changeCost = changeCost;
+ auto buildRC = [] (GLShader *dna, float depth, int changeCost) {
+ RenderCommand c;
+ c.m_glShader = dna;
+ c.m_depth = depth;
+ c.m_changeCost = changeCost;
return c;
};
- RenderCommand *c5 = buildRC(dna[3], depth[1], stateChangeCost[1]);
- RenderCommand *c3 = buildRC(dna[3], depth[0], stateChangeCost[1]);
- RenderCommand *c4 = buildRC(dna[2], depth[1], stateChangeCost[1]);
- RenderCommand *c8 = buildRC(dna[1], depth[1], stateChangeCost[1]);
- RenderCommand *c0 = buildRC(dna[0], depth[2], stateChangeCost[1]);
+ RenderCommand c5 = buildRC(dna[3], depth[1], stateChangeCost[1]);
+ RenderCommand c3 = buildRC(dna[3], depth[0], stateChangeCost[1]);
+ RenderCommand c4 = buildRC(dna[2], depth[1], stateChangeCost[1]);
+ RenderCommand c8 = buildRC(dna[1], depth[1], stateChangeCost[1]);
+ RenderCommand c0 = buildRC(dna[0], depth[2], stateChangeCost[1]);
- RenderCommand *c2 = buildRC(dna[2], depth[2], stateChangeCost[0]);
- RenderCommand *c9 = buildRC(dna[2], depth[0], stateChangeCost[0]);
- RenderCommand *c1 = buildRC(dna[1], depth[0], stateChangeCost[0]);
- RenderCommand *c7 = buildRC(dna[0], depth[2], stateChangeCost[0]);
- RenderCommand *c6 = buildRC(dna[0], depth[1], stateChangeCost[0]);
+ RenderCommand c2 = buildRC(dna[2], depth[2], stateChangeCost[0]);
+ RenderCommand c9 = buildRC(dna[2], depth[0], stateChangeCost[0]);
+ RenderCommand c1 = buildRC(dna[1], depth[0], stateChangeCost[0]);
+ RenderCommand c7 = buildRC(dna[0], depth[2], stateChangeCost[0]);
+ RenderCommand c6 = buildRC(dna[0], depth[1], stateChangeCost[0]);
rawCommands << c0 << c1 << c2 << c3 << c4 << c5 << c6 << c7 << c8 << c9;
@@ -385,12 +441,9 @@ private Q_SLOTS:
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands.size(), sortedCommands.size());
- for (RenderCommand *rc : sortedCommands)
- qDebug() << rc->m_changeCost << rc->m_shaderDna << rc->m_depth;
-
// Ordered by higher state, higher shaderDNA and higher depth
QCOMPARE(c0, sortedCommands.at(4));
QCOMPARE(c3, sortedCommands.at(1));
@@ -405,6 +458,7 @@ private Q_SLOTS:
QCOMPARE(c9, sortedCommands.at(6));
// RenderCommands are deleted by RenderView dtor
+ renderer.shutdown();
}
void checkRenderCommandTextureSorting()
@@ -421,61 +475,60 @@ private Q_SLOTS:
Qt3DCore::QNodeId tex3 = Qt3DCore::QNodeId::createId();
Qt3DCore::QNodeId tex4 = Qt3DCore::QNodeId::createId();
- RenderCommand *a = new RenderCommand();
+ RenderCommand a;
{
ShaderParameterPack pack;
pack.setTexture(0, 0, tex1);
pack.setTexture(1, 0, tex3);
pack.setTexture(2, 0, tex4);
pack.setTexture(3, 0, tex2);
- a->m_parameterPack = pack;
+ a.m_parameterPack = pack;
}
- RenderCommand *b = new RenderCommand();
- RenderCommand *c = new RenderCommand();
+ RenderCommand b;
+ RenderCommand c;
{
ShaderParameterPack pack;
pack.setTexture(0, 0, tex1);
pack.setTexture(3, 0, tex2);
- c->m_parameterPack = pack;
+ c.m_parameterPack = pack;
}
- RenderCommand *d = new RenderCommand();
+ RenderCommand d;
{
ShaderParameterPack pack;
pack.setTexture(1, 0, tex3);
pack.setTexture(2, 0, tex4);
- d->m_parameterPack = pack;
+ d.m_parameterPack = pack;
}
- RenderCommand *e = new RenderCommand();
+ RenderCommand e;
{
ShaderParameterPack pack;
pack.setTexture(3, 0, tex2);
- e->m_parameterPack = pack;
+ e.m_parameterPack = pack;
}
- RenderCommand *f = new RenderCommand();
+ RenderCommand f;
{
ShaderParameterPack pack;
pack.setTexture(3, 0, tex2);
- f->m_parameterPack = pack;
+ f.m_parameterPack = pack;
}
- RenderCommand *g = new RenderCommand();
+ RenderCommand g;
{
ShaderParameterPack pack;
pack.setTexture(0, 0, tex1);
pack.setTexture(1, 0, tex3);
pack.setTexture(2, 0, tex4);
pack.setTexture(3, 0, tex2);
- g->m_parameterPack = pack;
+ g.m_parameterPack = pack;
}
// WHEN
- QVector<RenderCommand *> rawCommands = {a, b, c, d, e, f, g};
+ QVector<RenderCommand> rawCommands = {a, b, c, d, e, f, g};
renderView.addSortType(sortTypes);
renderView.setCommands(rawCommands);
renderView.sort();
// THEN
- const QVector<RenderCommand *> sortedCommands = renderView.commands();
- qDebug() << rawCommands << sortedCommands;
+ const QVector<RenderCommand> sortedCommands = renderView.commands();
QCOMPARE(rawCommands.size(), sortedCommands.size());
QCOMPARE(sortedCommands.at(0), a);
QCOMPARE(sortedCommands.at(1), g);
@@ -489,6 +542,8 @@ private Q_SLOTS:
private:
};
+} // OpenGL
+
} // Render
} // Qt3DRender
@@ -496,6 +551,6 @@ private:
QT_END_NAMESPACE
//APPLESS_
-QTEST_MAIN(Qt3DRender::Render::tst_RenderViews)
+QTEST_MAIN(Qt3DRender::Render::OpenGL::tst_RenderViews)
#include "tst_renderviews.moc"
diff --git a/tests/auto/render/renderviewutils/renderviewutils.pro b/tests/auto/render/opengl/renderviewutils/renderviewutils.pro
index 90d8a2562..e9c9f8d51 100644
--- a/tests/auto/render/renderviewutils/renderviewutils.pro
+++ b/tests/auto/render/opengl/renderviewutils/renderviewutils.pro
@@ -8,5 +8,8 @@ CONFIG += testcase
SOURCES += tst_renderviewutils.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp b/tests/auto/render/opengl/renderviewutils/tst_renderviewutils.cpp
index 6d349f994..6b714b9e1 100644
--- a/tests/auto/render/renderviewutils/tst_renderviewutils.cpp
+++ b/tests/auto/render/opengl/renderviewutils/tst_renderviewutils.cpp
@@ -29,7 +29,8 @@
#include <QtTest/QTest>
#include <qbackendnodetester.h>
#include <Qt3DCore/qdynamicpropertyupdatedchange.h>
-#include <Qt3DRender/private/renderviewjobutils_p.h>
+#include <renderviewjobutils_p.h>
+#include <shadervariables_p.h>
#include <Qt3DRender/private/shaderdata_p.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/stringtoint_p.h>
@@ -107,11 +108,11 @@ public:
return m_scalar;
}
- QHash<QString, Qt3DRender::Render::ShaderUniform> buildUniformMap(const QString &blockName)
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> buildUniformMap(const QString &blockName)
{
- QHash<QString, Qt3DRender::Render::ShaderUniform> uniforms;
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> uniforms;
- uniforms.insert(blockName + QStringLiteral(".scalar"), Qt3DRender::Render::ShaderUniform());
+ uniforms.insert(blockName + QStringLiteral(".scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
return uniforms;
}
@@ -148,11 +149,11 @@ public:
return m_texture;
}
- QHash<QString, Qt3DRender::Render::ShaderUniform> buildUniformMap(const QString &blockName)
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> buildUniformMap(const QString &blockName)
{
- QHash<QString, Qt3DRender::Render::ShaderUniform> uniforms;
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> uniforms;
- uniforms.insert(blockName + QStringLiteral(".texture"), Qt3DRender::Render::ShaderUniform());
+ uniforms.insert(blockName + QStringLiteral(".texture"), Qt3DRender::Render::OpenGL::ShaderUniform());
return uniforms;
}
@@ -189,11 +190,11 @@ public:
return m_array;
}
- QHash<QString, Qt3DRender::Render::ShaderUniform> buildUniformMap(const QString &blockName)
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> buildUniformMap(const QString &blockName)
{
- QHash<QString, Qt3DRender::Render::ShaderUniform> uniforms;
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> uniforms;
- uniforms.insert(blockName + QStringLiteral(".array[0]"), Qt3DRender::Render::ShaderUniform());
+ uniforms.insert(blockName + QStringLiteral(".array[0]"), Qt3DRender::Render::OpenGL::ShaderUniform());
return uniforms;
}
@@ -244,12 +245,12 @@ public:
return m_array;
}
- virtual QHash<QString, Qt3DRender::Render::ShaderUniform> buildUniformMap(const QString &blockName)
+ virtual QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> buildUniformMap(const QString &blockName)
{
- QHash<QString, Qt3DRender::Render::ShaderUniform> uniforms;
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> uniforms;
- uniforms.insert(blockName + QStringLiteral(".scalar"), Qt3DRender::Render::ShaderUniform());
- uniforms.insert(blockName + QStringLiteral(".array[0]"), Qt3DRender::Render::ShaderUniform());
+ uniforms.insert(blockName + QStringLiteral(".scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
+ uniforms.insert(blockName + QStringLiteral(".array[0]"), Qt3DRender::Render::OpenGL::ShaderUniform());
return uniforms;
}
@@ -298,17 +299,17 @@ public:
return m_inner;
}
- QHash<QString, Qt3DRender::Render::ShaderUniform> buildUniformMap(const QString &blockName) override
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> buildUniformMap(const QString &blockName) override
{
- QHash<QString, Qt3DRender::Render::ShaderUniform> innerUniforms;
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> innerUniforms;
StructShaderData *innerData = nullptr;
if ((innerData = qobject_cast<StructShaderData *>(m_inner)) != nullptr)
innerUniforms = innerData->buildUniformMap(QStringLiteral(".inner"));
- QHash<QString, Qt3DRender::Render::ShaderUniform> uniforms = StructShaderData::buildUniformMap(blockName);
- QHash<QString, Qt3DRender::Render::ShaderUniform>::const_iterator it = innerUniforms.begin();
- const QHash<QString, Qt3DRender::Render::ShaderUniform>::const_iterator end = innerUniforms.end();
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform> uniforms = StructShaderData::buildUniformMap(blockName);
+ QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform>::const_iterator it = innerUniforms.begin();
+ const QHash<QString, Qt3DRender::Render::OpenGL::ShaderUniform>::const_iterator end = innerUniforms.end();
while (it != end) {
uniforms.insert(blockName + it.key(), it.value());
@@ -361,7 +362,7 @@ void tst_RenderViewUtils::topLevelScalarValueNoUniforms()
QVERIFY(backendShaderData != nullptr);
// WHEB
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -390,7 +391,7 @@ void tst_RenderViewUtils::topLevelScalarValue()
QVERIFY(backendShaderData != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -403,8 +404,8 @@ void tst_RenderViewUtils::topLevelScalarValue()
QCOMPARE(blockBuilder.activeUniformNamesToValue.count(), 1);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
- const Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
+ const Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
while (it != end) {
// THEN
@@ -432,7 +433,7 @@ void tst_RenderViewUtils::topLevelTextureValueNoUniforms()
QVERIFY(backendShaderData != nullptr);
// WHEB
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -463,7 +464,7 @@ void tst_RenderViewUtils::topLevelTextureValue()
QVERIFY(backendShaderData != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -476,8 +477,8 @@ void tst_RenderViewUtils::topLevelTextureValue()
QCOMPARE(blockBuilder.activeUniformNamesToValue.count(), 1);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
- const Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
+ const Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
while (it != end) {
// THEN
@@ -505,7 +506,7 @@ void tst_RenderViewUtils::topLevelArrayValue()
QVERIFY(backendShaderData != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -518,8 +519,8 @@ void tst_RenderViewUtils::topLevelArrayValue()
QCOMPARE(blockBuilder.activeUniformNamesToValue.count(), 1);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
- const Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
+ const Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
while (it != end) {
// THEN
@@ -570,13 +571,13 @@ void tst_RenderViewUtils::nestedShaderDataValue()
QVERIFY(backendShaderData3 != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[0].scalar"), Qt3DRender::Render::ShaderUniform());
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[1].scalar"), Qt3DRender::Render::ShaderUniform());
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[2].scalar"), Qt3DRender::Render::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[0].scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[1].scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[2].scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
// build name-value map
blockBuilder.buildActiveUniformNameValueMapStructHelper(backendArrayShaderData, QStringLiteral("MyBlock"));
@@ -646,7 +647,7 @@ void tst_RenderViewUtils::topLevelStructValue()
QVERIFY(backendShaderData != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
@@ -659,8 +660,8 @@ void tst_RenderViewUtils::topLevelStructValue()
QCOMPARE(blockBuilder.activeUniformNamesToValue.count(), blockBuilder.uniforms.count());
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
- const Qt3DRender::Render::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator it = blockBuilder.activeUniformNamesToValue.begin();
+ const Qt3DRender::Render::OpenGL::UniformBlockValueBuilderHash::const_iterator end = blockBuilder.activeUniformNamesToValue.end();
while (it != end) {
// THEN
@@ -692,13 +693,13 @@ void tst_RenderViewUtils::topLevelDynamicProperties()
QVERIFY(backendShaderData != nullptr);
// WHEN
- Qt3DRender::Render::UniformBlockValueBuilder blockBuilder;
+ Qt3DRender::Render::OpenGL::UniformBlockValueBuilder blockBuilder;
blockBuilder.shaderDataManager = manager.data();
blockBuilder.textureManager = textureManager.data();
blockBuilder.updatedPropertiesOnly = false;
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.scalar"), Qt3DRender::Render::ShaderUniform());
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[0]"), Qt3DRender::Render::ShaderUniform());
- blockBuilder.uniforms.insert(QStringLiteral("MyBlock.texture"), Qt3DRender::Render::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.scalar"), Qt3DRender::Render::OpenGL::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.array[0]"), Qt3DRender::Render::OpenGL::ShaderUniform());
+ blockBuilder.uniforms.insert(QStringLiteral("MyBlock.texture"), Qt3DRender::Render::OpenGL::ShaderUniform());
// build name-value map
blockBuilder.buildActiveUniformNameValueMapStructHelper(backendShaderData, QStringLiteral("MyBlock"));
diff --git a/tests/auto/render/textures/textures.pro b/tests/auto/render/opengl/textures/textures.pro
index 8a7553a54..a116756af 100644
--- a/tests/auto/render/textures/textures.pro
+++ b/tests/auto/render/opengl/textures/textures.pro
@@ -8,5 +8,8 @@ CONFIG += testcase
SOURCES += tst_textures.cpp
-include(../../core/common/common.pri)
-include(../commons/commons.pri)
+include(../../../core/common/common.pri)
+include(../../commons/commons.pri)
+
+# Link Against OpenGL Renderer Plugin
+include(../opengl_render_plugin.pri)
diff --git a/tests/auto/render/textures/tst_textures.cpp b/tests/auto/render/opengl/textures/tst_textures.cpp
index 555bd09a3..5343a6fde 100644
--- a/tests/auto/render/textures/tst_textures.cpp
+++ b/tests/auto/render/opengl/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>
@@ -33,13 +37,13 @@
#include <Qt3DRender/qtextureimage.h>
#include <Qt3DRender/qtexturedata.h>
-#include <Qt3DRender/private/renderer_p.h>
+#include <renderer_p.h>
+#include <glresourcemanagers_p.h>
+#include <gltexture_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>
#include <testrenderer.h>
@@ -218,7 +222,7 @@ private Q_SLOTS:
{
QSKIP("Texture Sharing is now disabled");
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
renderer.setNodeManagers(mgrs.data());
// GIVEN
@@ -238,15 +242,15 @@ 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();
}
void shouldCreateDifferentGLTexturess()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
renderer.setNodeManagers(mgrs.data());
// GIVEN
@@ -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;
+ QVector<Qt3DRender::Render::OpenGL::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);
@@ -301,9 +306,11 @@ private Q_SLOTS:
void shouldCreateDifferentGLTexturesWhenUsingSharedTextureIds()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
renderer.setNodeManagers(mgrs.data());
+ Qt3DRender::Render::OpenGL::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::OpenGL::GLTexture *glt1 = glMgrs->glTextureManager()->lookupResource(bt1->peerId());
+ Qt3DRender::Render::OpenGL::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::OpenGL::GLTexture *glt1 = glMgrs->glTextureManager()->lookupResource(bt1->peerId());
+ Qt3DRender::Render::OpenGL::GLTexture *glt2 = glMgrs->glTextureManager()->lookupResource(bt2->peerId());
QVERIFY(glt1 != glt2);
QCOMPARE(glt1->sharedTextureId(), bt1->sharedTextureId());
QCOMPARE(glt2->sharedTextureId(), bt2->sharedTextureId());
@@ -372,7 +379,7 @@ private Q_SLOTS:
void generatorsShouldCreateSameData()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
renderer.setNodeManagers(mgrs.data());
// GIVEN
@@ -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);
@@ -431,7 +438,7 @@ private Q_SLOTS:
void checkTextureImageCleanupState()
{
// GIVEN
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
TestTextureImage img(1);
img.setLayer(2);
img.setMipLevel(3);
@@ -455,7 +462,7 @@ private Q_SLOTS:
void checkTextureImageInitializeFromPeer()
{
// GIVEN
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
TestTextureImage img(1);
{
@@ -587,7 +594,7 @@ private Q_SLOTS:
void checkTextureImageProperlyReleaseGenerator()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager();
Qt3DRender::Render::TextureImageManager *texImgMgr = mgrs->textureImageManager();
renderer.setNodeManagers(mgrs.data());
@@ -627,7 +634,7 @@ private Q_SLOTS:
void checkTextureIsMarkedForDeletion()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager();
renderer.setNodeManagers(mgrs.data());
@@ -661,7 +668,7 @@ private Q_SLOTS:
void checkTextureDestructionReconstructionWithinSameLoop()
{
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager();
renderer.setNodeManagers(mgrs.data());
@@ -700,7 +707,7 @@ private Q_SLOTS:
{
// GIVEN
QScopedPointer<Qt3DRender::Render::NodeManagers> mgrs(new Qt3DRender::Render::NodeManagers());
- Qt3DRender::Render::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
+ Qt3DRender::Render::OpenGL::Renderer renderer(Qt3DRender::QRenderAspect::Synchronous);
Qt3DRender::Render::TextureManager *texMgr = mgrs->textureManager();
Qt3DRender::Render::TextureImageManager *texImgMgr = mgrs->textureImageManager();
renderer.setNodeManagers(mgrs.data());
diff --git a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
index 5191b1a36..f1587c27c 100644
--- a/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
+++ b/tests/auto/render/pickboundingvolumejob/tst_pickboundingvolumejob.cpp
@@ -45,10 +45,12 @@
#include <Qt3DRender/QNoPicking>
#include <Qt3DRender/QPickEvent>
#include <Qt3DRender/QPickTriangleEvent>
+#include <Qt3DRender/QPickingSettings>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/entity_p.h>
#include <Qt3DRender/qrenderaspect.h>
+#include <Qt3DRender/private/rendersettings_p.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
#include <Qt3DRender/private/pickboundingvolumejob_p.h>
#include <Qt3DRender/private/pickboundingvolumeutils_p.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 7ff54f6fa..51b59bffc 100644
--- a/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp
+++ b/tests/auto/render/proximityfiltering/tst_proximityfiltering.cpp
@@ -38,6 +38,10 @@
#include <Qt3DRender/private/entity_p.h>
#include <Qt3DRender/private/filterproximitydistancejob_p.h>
#include <Qt3DRender/private/updatetreeenabledjob_p.h>
+#include <Qt3DRender/private/updateworldtransformjob_p.h>
+#include <Qt3DRender/private/updateworldboundingvolumejob_p.h>
+#include <Qt3DRender/private/calcboundingvolumejob_p.h>
+#include <Qt3DRender/private/expandboundingvolumejob_p.h>
#include <Qt3DRender/qproximityfilter.h>
#include "testaspect.h"
@@ -117,14 +121,20 @@ private Q_SLOTS:
{
Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity();
- Qt3DCore::QEntity *childEntity1 = new Qt3DCore::QEntity(rootEntity);
- Qt3DCore::QEntity *childEntity2 = new Qt3DCore::QEntity(rootEntity);
- Qt3DCore::QEntity *childEntity3 = new Qt3DCore::QEntity(rootEntity);
+ Qt3DCore::QEntity *targetEntity = new Qt3DCore::QEntity(rootEntity);
+ Qt3DCore::QEntity *childEntity1 = buildEntityAtDistance(50.0f, rootEntity);
+ Qt3DCore::QEntity *childEntity2 = buildEntityAtDistance(25.0f, rootEntity);
+ Qt3DCore::QEntity *childEntity3 = buildEntityAtDistance(75.0f, rootEntity);
+
+ Qt3DRender::QProximityFilter *proximityFilter = new Qt3DRender::QProximityFilter(rootEntity);
+ proximityFilter->setDistanceThreshold(200.0f);
+ proximityFilter->setEntity(targetEntity);
QTest::newRow("ShouldSelectAll") << rootEntity
- << Qt3DCore::QNodeIdVector()
+ << (Qt3DCore::QNodeIdVector() << proximityFilter->id())
<< (Qt3DCore::QNodeIdVector()
<< rootEntity->id()
+ << targetEntity->id()
<< childEntity1->id()
<< childEntity2->id()
<< childEntity3->id()
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/qcamera/tst_qcamera.cpp b/tests/auto/render/qcamera/tst_qcamera.cpp
index 0dcbce63f..fae8aa14e 100644
--- a/tests/auto/render/qcamera/tst_qcamera.cpp
+++ b/tests/auto/render/qcamera/tst_qcamera.cpp
@@ -49,6 +49,7 @@
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/transform_p.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
+#include <Qt3DRender/private/updateworldtransformjob_p.h>
QT_BEGIN_NAMESPACE
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/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 f5989fcd4..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>
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/raycaster/tst_raycaster.cpp b/tests/auto/render/raycaster/tst_raycaster.cpp
index 72ef396d7..57a1bcf47 100644
--- a/tests/auto/render/raycaster/tst_raycaster.cpp
+++ b/tests/auto/render/raycaster/tst_raycaster.cpp
@@ -32,7 +32,6 @@
#include <Qt3DRender/qpickevent.h>
#include <Qt3DRender/qraycaster.h>
#include <Qt3DCore/private/qbackendnode_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include "testpostmanarbiter.h"
#include "testrenderer.h"
diff --git a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
index 1ff899936..daec0b86c 100644
--- a/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
+++ b/tests/auto/render/raycastingjob/tst_raycastingjob.cpp
@@ -38,6 +38,7 @@
#include <Qt3DCore/private/qaspectmanager_p.h>
#include <Qt3DCore/private/qscene_p.h>
#include <Qt3DCore/private/qaspectengine_p.h>
+#include <Qt3DCore/private/qaspectjob_p.h>
#include <QtQuick/qquickwindow.h>
#include <Qt3DRender/QCamera>
diff --git a/tests/auto/render/render.pro b/tests/auto/render/render.pro
index 180ff7ac1..14fc74883 100644
--- a/tests/auto/render/render.pro
+++ b/tests/auto/render/render.pro
@@ -4,7 +4,6 @@ qtConfig(private_tests) {
SUBDIRS += \
entity \
renderpass \
- qgraphicsutils \
shader \
shaderbuilder \
texture \
@@ -42,7 +41,6 @@ qtConfig(private_tests) {
# boundingvolumedebug \
ddstextures \
ktxtextures \
- shadercache \
layerfiltering \
filterentitybycomponent \
genericlambdajob \
@@ -126,19 +124,8 @@ QT_FOR_CONFIG += 3drender-private
qtConfig(qt3d-opengl-renderer):qtConfig(private_tests) {
SUBDIRS += \
- filtercompatibletechniquejob \
- graphicshelpergl3_3 \
- graphicshelpergl3_2 \
- graphicshelpergl2 \
- materialparametergathererjob \
- textures \
- renderer \
- renderviewutils \
- renderviews \
- renderqueue \
- renderviewbuilder \
- sendrendercapturejob \
- gltexture
+ opengl \
+ scene2d
qtConfig(qt3d-extras) {
SUBDIRS += \
@@ -159,8 +146,6 @@ qtConfig(qt3d-opengl-renderer):qtConfig(private_tests) {
scene2d
}
- !macos: SUBDIRS += graphicshelpergl4
-
qtConfig(qt3d-simd-avx2): SUBDIRS += alignedresourcesmanagers-avx
qtConfig(qt3d-simd-sse2):!qtConfig(qt3d-simd-avx2): SUBDIRS += alignedresourcesmanagers-sse
}
diff --git a/tests/auto/render/scene2d/tst_scene2d.cpp b/tests/auto/render/scene2d/tst_scene2d.cpp
index fcb4c0908..b0a7fbeb8 100644
--- a/tests/auto/render/scene2d/tst_scene2d.cpp
+++ b/tests/auto/render/scene2d/tst_scene2d.cpp
@@ -209,6 +209,7 @@ private Q_SLOTS:
QScopedPointer<TestWindow> testWindow(new TestWindow());
Scene2DSharedObjectPtr sharedObject(new Scene2DSharedObject(nullptr));
+ TestRenderer renderer;
QScopedPointer<Scene2D> scene2d(new Scene2D());
QScopedPointer<NodeManagers> nodeManagers(new NodeManagers());
Qt3DRender::QGeometry *geometry = new Qt3DRender::QGeometry();
@@ -218,7 +219,6 @@ private Q_SLOTS:
Qt3DRender::QBuffer *dataBuffer =new Qt3DRender::QBuffer();
QScopedPointer<Qt3DCore::QEntity> entity(new Qt3DCore::QEntity());
entity->addComponent(geometryRenderer);
- TestRenderer renderer;
renderer.setNodeManagers(nodeManagers.data());
scene2d->setRenderer(&renderer);
scene2d->setEnabled(true);
@@ -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/segmentvisitor/tst_segmentvisitor.cpp b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp
index 4db12136a..fc65d0854 100644
--- a/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp
+++ b/tests/auto/render/segmentvisitor/tst_segmentvisitor.cpp
@@ -426,12 +426,15 @@ private Q_SLOTS:
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
- indexData.resize(sizeof(uint) * 2 * 4);
+ indexData.resize(sizeof(uint) * 7);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 2;
iDataPtr[3] = 3;
+ iDataPtr[4] = static_cast<uint>(-1);
+ iDataPtr[5] = 0;
+ iDataPtr[6] = 1;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
@@ -450,7 +453,7 @@ private Q_SLOTS:
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
- indexAttribute->setCount(4);
+ indexAttribute->setCount(7);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
@@ -458,6 +461,8 @@ private Q_SLOTS:
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineStrip);
+ geometryRenderer->setPrimitiveRestartEnabled(true);
+ geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
@@ -480,10 +485,11 @@ private Q_SLOTS:
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
- QCOMPARE(visitor.segmentCount(), uint(3));
+ QCOMPARE(visitor.segmentCount(), uint(4));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
+ QVERIFY(visitor.verifySegment(3, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
}
void testVisitLineLoop()
@@ -588,12 +594,16 @@ private Q_SLOTS:
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
- indexData.resize(sizeof(uint) * 2 * 4);
+ indexData.resize(sizeof(uint) * 8);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
iDataPtr[2] = 2;
iDataPtr[3] = 3;
+ iDataPtr[4] = static_cast<uint>(-1);
+ iDataPtr[5] = 0;
+ iDataPtr[6] = 1;
+ iDataPtr[7] = 2;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
@@ -612,7 +622,7 @@ private Q_SLOTS:
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
- indexAttribute->setCount(4);
+ indexAttribute->setCount(8);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
@@ -620,6 +630,8 @@ private Q_SLOTS:
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::LineLoop);
+ geometryRenderer->setPrimitiveRestartEnabled(true);
+ geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
@@ -642,11 +654,14 @@ private Q_SLOTS:
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
- QCOMPARE(visitor.segmentCount(), uint(4));
+ QCOMPARE(visitor.segmentCount(), uint(7));
QVERIFY(visitor.verifySegment(0, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifySegment(1, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
QVERIFY(visitor.verifySegment(2, 2,3, Vector3D(1,1,0), Vector3D(0,1,0)));
QVERIFY(visitor.verifySegment(3, 3,0, Vector3D(0,1,0), Vector3D(0,0,0)));
+ QVERIFY(visitor.verifySegment(4, 0,1, Vector3D(0,0,0), Vector3D(1,0,0)));
+ QVERIFY(visitor.verifySegment(5, 1,2, Vector3D(1,0,0), Vector3D(1,1,0)));
+ QVERIFY(visitor.verifySegment(6, 2,0, Vector3D(1,1,0), Vector3D(0,0,0)));
}
void testVisitLineAdjacency()
diff --git a/tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro b/tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro
deleted file mode 100644
index 6aff0bebd..000000000
--- a/tests/auto/render/sendrendercapturejob/sendrendercapturejob.pro
+++ /dev/null
@@ -1,12 +0,0 @@
-TEMPLATE = app
-
-TARGET = tst_sendrendercapturejob
-
-QT += core-private 3dcore 3dcore-private 3drender 3drender-private testlib
-
-CONFIG += testcase
-
-SOURCES += tst_sendrendercapturejob.cpp
-
-include(../commons/commons.pri)
-include(../../core/common/common.pri)
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/skeleton/tst_skeleton.cpp b/tests/auto/render/skeleton/tst_skeleton.cpp
index 6af055fb0..63ed51058 100644
--- a/tests/auto/render/skeleton/tst_skeleton.cpp
+++ b/tests/auto/render/skeleton/tst_skeleton.cpp
@@ -34,9 +34,7 @@
#include <Qt3DCore/qskeletonloader.h>
#include <Qt3DCore/private/qnode_p.h>
#include <Qt3DCore/private/qscene_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <Qt3DCore/private/qbackendnode_p.h>
-#include <Qt3DCore/private/qpropertyupdatedchangebase_p.h>
#include <qbackendnodetester.h>
#include <testpostmanarbiter.h>
#include <testrenderer.h>
@@ -49,24 +47,6 @@ Q_DECLARE_METATYPE(Qt3DRender::Render::JointInfo)
Q_DECLARE_METATYPE(Qt3DRender::Render::SkeletonData)
Q_DECLARE_METATYPE(Qt3DCore::Sqt)
-namespace {
-
-void linearizeTreeHelper(QJoint *joint, QVector<QJoint *> &joints)
-{
- joints.push_back(joint);
- for (const auto child : joint->childJoints())
- linearizeTreeHelper(child, joints);
-}
-
-QVector<QJoint *> linearizeTree(QJoint *rootJoint)
-{
- QVector<QJoint *> joints;
- linearizeTreeHelper(rootJoint, joints);
- return joints;
-}
-
-}
-
class tst_Skeleton : public Qt3DCore::QBackendNodeTester
{
Q_OBJECT
@@ -155,7 +135,6 @@ private Q_SLOTS:
backendSkeleton.setRenderer(&renderer);
backendSkeleton.setSkeletonManager(nodeManagers.skeletonManager());
backendSkeleton.setDataType(Skeleton::File);
- Qt3DCore::QPropertyUpdatedChangePtr updateChange;
// Initialize to ensure skeleton manager is set
QSkeletonLoader skeleton;
@@ -219,70 +198,6 @@ private Q_SLOTS:
joint->setName(name);
QTest::newRow("inverseBind") << m << localPose << name << joint;
}
-
- void checkCreateFrontendJoints_data()
- {
- QTest::addColumn<SkeletonData>("skeletonData");
- QTest::addColumn<QJoint *>("expectedRootJoint");
-
- QTest::newRow("empty") << SkeletonData() << (QJoint*)nullptr;
-
- SkeletonData skeletonData;
- JointInfo rootJointInfo;
- skeletonData.joints.push_back(rootJointInfo);
- skeletonData.jointNames.push_back(QLatin1String("rootJoint"));
- skeletonData.localPoses.push_back(Qt3DCore::Sqt());
- const int childCount = 10;
- for (int i = 0; i < childCount; ++i) {
- JointInfo childJointInfo;
- childJointInfo.parentIndex = 0;
- skeletonData.joints.push_back(childJointInfo);
-
- const float x = static_cast<float>(i);
- Qt3DCore::Sqt localPose;
- localPose.translation = QVector3D(x, x, x);
- skeletonData.localPoses.push_back(localPose);
-
- skeletonData.jointNames.push_back(QString("Child-%1").arg(i));
- }
-
- QJoint *rootJoint = new QJoint();
- for (int i = 0; i < childCount; ++i) {
- QJoint *childJoint = new QJoint();
- const float x = static_cast<float>(i);
- childJoint->setTranslation(QVector3D(x, x, x));
- rootJoint->addChildJoint(childJoint);
- }
-
- QTest::newRow("wide") << skeletonData << rootJoint;
-
- skeletonData.joints.clear();
- skeletonData.joints.push_back(rootJointInfo);
- for (int i = 0; i < childCount; ++i) {
- JointInfo childJointInfo;
- childJointInfo.parentIndex = i;
- skeletonData.joints.push_back(childJointInfo);
-
- const float x = static_cast<float>(i);
- Qt3DCore::Sqt localPose;
- localPose.translation = QVector3D(x, x, x);
- skeletonData.localPoses.push_back(localPose);
-
- skeletonData.jointNames.push_back(QString("Child-%1").arg(i));
- }
-
- rootJoint = new QJoint();
- QJoint *previousJoint = rootJoint;
- for (int i = 0; i < childCount; ++i) {
- QJoint *childJoint = new QJoint();
- const float x = static_cast<float>(i);
- childJoint->setTranslation(QVector3D(x, x, x));
- previousJoint->addChildJoint(childJoint);
- previousJoint = childJoint;
- }
-
- QTest::newRow("deep") << skeletonData << rootJoint;
- }
};
QTEST_APPLESS_MAIN(tst_Skeleton)
diff --git a/tests/auto/render/technique/tst_technique.cpp b/tests/auto/render/technique/tst_technique.cpp
index 5b6fdb4a4..b36d00fee 100644
--- a/tests/auto/render/technique/tst_technique.cpp
+++ b/tests/auto/render/technique/tst_technique.cpp
@@ -34,7 +34,6 @@
#include <Qt3DRender/qrenderpass.h>
#include <Qt3DRender/private/qtechnique_p.h>
#include <Qt3DRender/private/technique_p.h>
-#include <Qt3DRender/private/shaderparameterpack_p.h>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/managers_p.h>
#include <Qt3DRender/private/filterkey_p.h>
diff --git a/tests/auto/render/transform/tst_transform.cpp b/tests/auto/render/transform/tst_transform.cpp
index 476c47393..a3fcdb9c8 100644
--- a/tests/auto/render/transform/tst_transform.cpp
+++ b/tests/auto/render/transform/tst_transform.cpp
@@ -32,7 +32,6 @@
#include <Qt3DCore/private/qtransform_p.h>
#include <Qt3DRender/private/transform_p.h>
#include <Qt3DRender/private/updateworldtransformjob_p.h>
-#include <Qt3DCore/qpropertyupdatedchange.h>
#include <private/qbackendnode_p.h>
#include "qbackendnodetester.h"
#include "testrenderer.h"
diff --git a/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp b/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp
index 287a17b84..24d7ff643 100644
--- a/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp
+++ b/tests/auto/render/trianglesextractor/tst_trianglesextractor.cpp
@@ -30,7 +30,6 @@
#include <Qt3DRender/private/shader_p.h>
#include <Qt3DRender/qshaderprogram.h>
#include <Qt3DRender/private/nodemanagers_p.h>
-#include <Qt3DRender/private/renderer_p.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/private/geometryrenderermanager_p.h>
diff --git a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp
index 8dfda0eea..66f67e08a 100644
--- a/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp
+++ b/tests/auto/render/trianglevisitor/tst_trianglevisitor.cpp
@@ -454,7 +454,7 @@ private Q_SLOTS:
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
- indexData.resize(sizeof(uint) * 3 * 4);
+ indexData.resize(sizeof(uint) * 4 * 4);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
@@ -468,6 +468,10 @@ private Q_SLOTS:
iDataPtr[9] = 4;
iDataPtr[10] = 3;
iDataPtr[11] = 2;
+ iDataPtr[12] = static_cast<uint>(-1);
+ iDataPtr[13] = 0;
+ iDataPtr[14] = 1;
+ iDataPtr[15] = 2;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
@@ -486,7 +490,7 @@ private Q_SLOTS:
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
- indexAttribute->setCount(3*4);
+ indexAttribute->setCount(4*4);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
@@ -494,6 +498,8 @@ private Q_SLOTS:
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleStrip);
+ geometryRenderer->setPrimitiveRestartEnabled(true);
+ geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
@@ -516,7 +522,7 @@ private Q_SLOTS:
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
- QVERIFY(visitor.triangleCount() == 8);
+ QCOMPARE(visitor.triangleCount(), 9U);
QVERIFY(visitor.verifyTriangle(0, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1)));
QVERIFY(visitor.verifyTriangle(1, 3,2,1, Vector3D(0,0,1), Vector3D(0,1,0), Vector3D(1,0,0)));
QVERIFY(visitor.verifyTriangle(2, 4,3,2, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(0,1,0)));
@@ -525,6 +531,7 @@ private Q_SLOTS:
QVERIFY(visitor.verifyTriangle(5, 4,0,1, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(1,0,0)));
QVERIFY(visitor.verifyTriangle(6, 3,4,0, Vector3D(0,0,1), Vector3D(1,0,0), Vector3D(0,0,1)));
QVERIFY(visitor.verifyTriangle(7, 2,3,4, Vector3D(0,1,0), Vector3D(0,0,1), Vector3D(1,0,0)));
+ QVERIFY(visitor.verifyTriangle(8, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1)));
}
void testVisitTriangleFan()
@@ -643,7 +650,7 @@ private Q_SLOTS:
simulateInitializationSync(dataBuffer.data(), backendBuffer);
QByteArray indexData;
- indexData.resize(sizeof(uint) * 3 * 2);
+ indexData.resize(sizeof(uint) * 10);
uint *iDataPtr = reinterpret_cast<uint *>(indexData.data());
iDataPtr[0] = 0;
iDataPtr[1] = 1;
@@ -651,6 +658,10 @@ private Q_SLOTS:
iDataPtr[3] = 3;
iDataPtr[4] = 4;
iDataPtr[5] = 5;
+ iDataPtr[6] = static_cast<uint>(-1);
+ iDataPtr[7] = 0;
+ iDataPtr[8] = 1;
+ iDataPtr[9] = 2;
indexDataBuffer->setData(indexData);
Buffer *backendIndexBuffer = nodeManagers->bufferManager()->getOrCreateResource(indexDataBuffer->id());
@@ -669,7 +680,7 @@ private Q_SLOTS:
indexAttribute->setBuffer(indexDataBuffer.data());
indexAttribute->setVertexBaseType(Qt3DRender::QAttribute::UnsignedInt);
- indexAttribute->setCount(3*2);
+ indexAttribute->setCount(10);
indexAttribute->setAttributeType(Qt3DRender::QAttribute::IndexAttribute);
geometry->addAttribute(positionAttribute.data());
@@ -677,6 +688,8 @@ private Q_SLOTS:
geometryRenderer->setGeometry(geometry);
geometryRenderer->setPrimitiveType(Qt3DRender::QGeometryRenderer::TriangleFan);
+ geometryRenderer->setPrimitiveRestartEnabled(true);
+ geometryRenderer->setRestartIndexValue(-1);
Attribute *backendAttribute = nodeManagers->attributeManager()->getOrCreateResource(positionAttribute->id());
backendAttribute->setRenderer(&renderer);
@@ -699,11 +712,12 @@ private Q_SLOTS:
visitor.apply(backendRenderer, Qt3DCore::QNodeId());
// THEN
- QVERIFY(visitor.triangleCount() == 4);
+ QCOMPARE(visitor.triangleCount(), 5U);
QVERIFY(visitor.verifyTriangle(0, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1)));
QVERIFY(visitor.verifyTriangle(1, 3,2,0, Vector3D(0,0,1), Vector3D(0,1,0), Vector3D(0,0,1)));
QVERIFY(visitor.verifyTriangle(2, 4,3,0, Vector3D(1,0,0), Vector3D(0,0,1), Vector3D(0,0,1)));
QVERIFY(visitor.verifyTriangle(3, 5,4,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1)));
+ QVERIFY(visitor.verifyTriangle(4, 2,1,0, Vector3D(0,1,0), Vector3D(1,0,0), Vector3D(0,0,1)));
}
void testVisitTrianglesAdjacency()
diff --git a/tests/auto/render/uniform/tst_uniform.cpp b/tests/auto/render/uniform/tst_uniform.cpp
index 5f946afa3..d7775eb62 100644
--- a/tests/auto/render/uniform/tst_uniform.cpp
+++ b/tests/auto/render/uniform/tst_uniform.cpp
@@ -112,7 +112,7 @@ private Q_SLOTS:
QCOMPARE(v.constData<float>()[0], 572.0f);
QCOMPARE(v.constData<float>()[1], 355.0f);
QCOMPARE(v.constData<float>()[2], 383.0f);
- QCOMPARE(v.constData<float>()[4], 0.0f);
+ QCOMPARE(v.constData<float>()[3], 0.0f);
}
{
// GIVEN
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/benchmarks/render/jobs/jobs.pro b/tests/benchmarks/render/jobs/jobs.pro
index bfd0f1317..71b0ef409 100644
--- a/tests/benchmarks/render/jobs/jobs.pro
+++ b/tests/benchmarks/render/jobs/jobs.pro
@@ -7,3 +7,7 @@ QT += testlib core core-private 3dcore 3dcore-private 3drender 3drender-private
SOURCES += tst_bench_jobs.cpp
DEFINES += QT3D_RENDER_UNIT_TESTS
+DEFINES += QT_BUILD_INTERNAL
+
+# Link Against OpenGL Renderer Plugin
+include(../../../auto/render/opengl/opengl_render_plugin.pri)
diff --git a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
index b611f3cdc..85b5e8c89 100644
--- a/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
+++ b/tests/benchmarks/render/jobs/tst_bench_jobs.cpp
@@ -41,7 +41,6 @@
#include <Qt3DRender/qcamera.h>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
-#include <Qt3DRender/private/renderer_p.h>
#include <Qt3DRender/private/nodemanagers_p.h>
#include <Qt3DRender/private/updateworldtransformjob_p.h>
#include <Qt3DQuick/QQmlAspectEngine>
@@ -50,6 +49,7 @@
#include <Qt3DCore/private/qaspectmanager_p.h>
#include <Qt3DCore/private/qnodevisitor_p.h>
#include <Qt3DCore/private/qnode_p.h>
+#include <renderer_p.h>
#include <QQmlComponent>
#include <QScopedPointer>
@@ -87,32 +87,32 @@ namespace Qt3DRender {
QVector<Qt3DCore::QAspectJobPtr> worldTransformJob()
{
- static_cast<Render::Renderer *>(d_func()->m_renderer)->m_worldTransformJob->setRoot(d_func()->m_renderer->sceneRoot());
- return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_worldTransformJob;
+ static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_worldTransformJob->setRoot(d_func()->m_renderer->sceneRoot());
+ return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_worldTransformJob;
}
QVector<Qt3DCore::QAspectJobPtr> updateBoundingJob()
{
- static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateWorldBoundingVolumeJob->setManager(d_func()->m_renderer->nodeManagers()->renderNodesManager());
- return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateWorldBoundingVolumeJob;
+ static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_updateWorldBoundingVolumeJob->setManager(d_func()->m_renderer->nodeManagers()->renderNodesManager());
+ return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_updateWorldBoundingVolumeJob;
}
QVector<Qt3DCore::QAspectJobPtr> calculateBoundingVolumeJob()
{
- static_cast<Render::Renderer *>(d_func()->m_renderer)->m_calculateBoundingVolumeJob->setRoot(d_func()->m_renderer->sceneRoot());
- return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_calculateBoundingVolumeJob;
+ static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_calculateBoundingVolumeJob->setRoot(d_func()->m_renderer->sceneRoot());
+ return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_calculateBoundingVolumeJob;
}
QVector<Qt3DCore::QAspectJobPtr> framePreparationJob()
{
- static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob->setManagers(d_func()->m_renderer->nodeManagers());
- return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob;
+ static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob->setManagers(d_func()->m_renderer->nodeManagers());
+ return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_updateShaderDataTransformJob;
}
QVector<Qt3DCore::QAspectJobPtr> frameCleanupJob()
{
- static_cast<Render::Renderer *>(d_func()->m_renderer)->m_cleanupJob->setRoot(d_func()->m_renderer->sceneRoot());
- return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::Renderer *>(d_func()->m_renderer)->m_cleanupJob;
+ static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_cleanupJob->setRoot(d_func()->m_renderer->sceneRoot());
+ return QVector<Qt3DCore::QAspectJobPtr>() << static_cast<Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_cleanupJob;
}
QVector<Qt3DCore::QAspectJobPtr> renderBinJobs()
@@ -140,7 +140,7 @@ namespace Qt3DRender {
for (const auto &node: nodes)
d_func()->createBackendNode(node);
- static_cast<Qt3DRender::Render::Renderer *>(d_func()->m_renderer)->m_renderSceneRoot =
+ static_cast<Qt3DRender::Render::OpenGL::Renderer *>(d_func()->m_renderer)->m_renderSceneRoot =
d_func()->m_renderer->nodeManagers()
->lookupResource<Qt3DRender::Render::Entity, Qt3DRender::Render::EntityManager>(root->id());
}
diff --git a/tests/benchmarks/render/materialparametergathering/materialparametergathering.pro b/tests/benchmarks/render/materialparametergathering/materialparametergathering.pro
index e227a08a0..a20372163 100644
--- a/tests/benchmarks/render/materialparametergathering/materialparametergathering.pro
+++ b/tests/benchmarks/render/materialparametergathering/materialparametergathering.pro
@@ -12,3 +12,6 @@ include(../../../auto/render/commons/commons.pri)
# Needed to use the TestAspect
DEFINES += QT_BUILD_INTERNAL
+
+# Link Against OpenGL Renderer Plugin
+include(../../../auto/render/opengl/opengl_render_plugin.pri)
diff --git a/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp b/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp
index 210d82dcf..340bfdda4 100644
--- a/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp
+++ b/tests/benchmarks/render/materialparametergathering/tst_bench_materialparametergathering.cpp
@@ -37,7 +37,7 @@
#include <Qt3DRender/private/entity_p.h>
#include <Qt3DRender/qrenderaspect.h>
#include <Qt3DRender/private/qrenderaspect_p.h>
-#include <Qt3DRender/private/materialparametergathererjob_p.h>
+#include <materialparametergathererjob_p.h>
#include <Qt3DRender/private/technique_p.h>
#include <Qt3DRender/private/techniquemanager_p.h>
#include <Qt3DExtras/qphongmaterial.h>
@@ -90,9 +90,9 @@ public:
return d_func()->m_renderer->nodeManagers();
}
- Render::MaterialParameterGathererJobPtr materialGathererJob() const
+ Render::OpenGL::MaterialParameterGathererJobPtr materialGathererJob() const
{
- Render::MaterialParameterGathererJobPtr job = Render::MaterialParameterGathererJobPtr::create();
+ Render::OpenGL::MaterialParameterGathererJobPtr job = Render::OpenGL::MaterialParameterGathererJobPtr::create();
job->setNodeManagers(nodeManagers());
return job;
}
@@ -136,7 +136,7 @@ private Q_SLOTS:
QScopedPointer<Qt3DRender::TestAspect> aspect(new Qt3DRender::TestAspect(buildTestScene(2000)));
// WHEN
- Qt3DRender::Render::MaterialParameterGathererJobPtr gatheringJob = aspect->materialGathererJob();
+ Qt3DRender::Render::OpenGL::MaterialParameterGathererJobPtr gatheringJob = aspect->materialGathererJob();
gatheringJob->setHandles(aspect->nodeManagers()->materialManager()->activeHandles());
QBENCHMARK {
diff --git a/tests/manual/compute-manual/ComputeFrameGraph.qml b/tests/manual/compute-manual/ComputeFrameGraph.qml
new file mode 100644
index 000000000..47d57161c
--- /dev/null
+++ b/tests/manual/compute-manual/ComputeFrameGraph.qml
@@ -0,0 +1,91 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+
+Viewport {
+ property alias camera: selector.camera
+
+ RenderSurfaceSelector {
+ id: surfaceSelector
+
+ // Clear Buffer
+ ClearBuffers {
+ buffers: ClearBuffers.ColorDepthBuffer
+ NoDraw {}
+ }
+
+ // Compute Pass
+ DispatchCompute {
+ // 1024 x 1024 particles
+ // We will launch 1024 local workgroup that will work
+ // on 1024 particles each
+ workGroupX: 1024; workGroupY: 1; workGroupZ: 1
+ TechniqueFilter {
+ matchAll: [
+ FilterKey { name: "type"; value: "compute"}
+ ]
+ }
+ }
+
+ // Draw particles from buffer computed in the Compute Pass
+ CameraSelector {
+ id: selector
+ TechniqueFilter {
+ MemoryBarrier { waitFor: MemoryBarrier.VertexAttributeArray }
+ matchAll: [
+ FilterKey { name: "type"; value: "draw"}
+ ]
+ }
+ }
+ }
+}
+
diff --git a/tests/manual/compute-manual/ComputeMaterial.qml b/tests/manual/compute-manual/ComputeMaterial.qml
new file mode 100644
index 000000000..9116a8b66
--- /dev/null
+++ b/tests/manual/compute-manual/ComputeMaterial.qml
@@ -0,0 +1,118 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+
+Material {
+ property Buffer dataBuffer;
+ property real particleStep: 0.4
+ property real finalCollisionFactor: 0.2
+
+ parameters: [
+ Parameter { name: "particleStep"; value: particleStep },
+ Parameter { name: "finalCollisionFactor"; value: finalCollisionFactor }
+ ]
+
+ ShaderProgram {
+ id: computeShader
+ computeShaderCode: loadSource("qrc:/particles.comp")
+ }
+
+ ShaderProgram {
+ id: drawShader
+ vertexShaderCode: loadSource("qrc:/particles.vert")
+ fragmentShaderCode: loadSource("qrc:/particles.frag")
+ }
+
+ effect: Effect {
+ techniques: [
+ Technique {
+ renderPasses: [
+ RenderPass {
+ shaderProgram: computeShader
+ // We set the buffer as the parameter data
+ parameters: [
+ Parameter { name: "Particles"; value: dataBuffer }
+ ]
+ }
+ ]
+ filterKeys: [
+ FilterKey { name: "type"; value: "compute" }
+ ]
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ profile: GraphicsApiFilter.CoreProfile
+ majorVersion: 4
+ minorVersion: 3
+ }
+ },
+ Technique {
+ renderPasses: [
+ RenderPass {
+ shaderProgram: drawShader
+ // We assume the mesh to be drawn will also receive
+ // Vertex buffers attributes that will be used to position and color
+ }
+ ]
+ filterKeys: [
+ FilterKey { name: "type"; value: "draw" }
+ ]
+ graphicsApiFilter {
+ api: GraphicsApiFilter.OpenGL
+ profile: GraphicsApiFilter.CoreProfile
+ majorVersion: 4
+ minorVersion: 3
+ }
+ }
+ ] // techniques
+ }
+}
+
diff --git a/tests/manual/compute-manual/ParticlesScene.qml b/tests/manual/compute-manual/ParticlesScene.qml
new file mode 100644
index 000000000..68572f6b4
--- /dev/null
+++ b/tests/manual/compute-manual/ParticlesScene.qml
@@ -0,0 +1,200 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import Qt3D.Extras 2.14
+import Qt3D.Input 2.14
+
+Entity {
+
+ property alias computeMode: particlesComputeJob.runType
+
+ function triggerCompute(frames) {
+ particlesComputeJob.trigger(frames)
+ }
+
+ components: [
+ RenderSettings {
+ ComputeFrameGraph {
+ camera: sceneCamera
+ }
+ // explicitly set RenderingPolicy to AlwaysRender, as changes in the
+ // scene won't be reflected in actual Qt scene-graph changes (due to
+ // GPU compute calls)
+ renderPolicy: RenderSettings.Always
+ },
+ InputSettings {}
+ ]
+
+ FirstPersonCameraController { camera: sceneCamera }
+
+ Camera {
+ id: sceneCamera
+ projectionType: CameraLens.PerspectiveProjection
+ viewCenter: Qt.vector3d(0, 0, 0)
+ position: Qt.vector3d(0, 20, -800)
+ nearPlane: 0.1
+ farPlane: 1000
+ fieldOfView: 60
+ }
+
+ property int particlesCount: 1024 * 1024
+ readonly property int floatSize: 4
+
+ function buildParticlesBuffer() {
+ var byteSizeOfParticleData = 8;
+ var bufferData = new Float32Array(particlesCount * byteSizeOfParticleData);
+ for (var x = 0; x < 1024; ++x) {
+ for (var z = 0; z < 1024; ++z) {
+ var i = x * 1024 + z;
+ var positionIdx = i * byteSizeOfParticleData;
+ var colorIdx = i * byteSizeOfParticleData + 8;
+
+ bufferData[positionIdx] = -1024 + x * 2;
+ bufferData[positionIdx + 1] = 0;
+ bufferData[positionIdx + 2] = -1024 + z * 2;
+ bufferData[positionIdx + 3] = 1.0;
+
+ bufferData[colorIdx] = 0.25 + Math.sin(x / 1024) * 0.75;
+ bufferData[colorIdx + 1] = 0.25 + Math.sin(z / 1024) * 0.75;
+ bufferData[colorIdx + 2] = 0.25 + Math.sin(x / 1024) * 0.75;
+ bufferData[colorIdx + 3] = 1.0;
+ }
+ }
+ return bufferData
+ }
+
+ Buffer {
+ id: particleBuffer
+ type: Buffer.VertexBuffer
+ // struct ParticleData
+ // {
+ // vec3 position; // Aligned to 4 floats
+ // vec3 color; // Aligned to 4 floats
+ // };
+ data: buildParticlesBuffer()
+ }
+
+ Attribute {
+ id: particlePositionDataAttribute
+ name: "particlePosition"
+ attributeType: Attribute.VertexAttribute
+ vertexBaseType: Attribute.Float
+ vertexSize: 3
+ divisor: 1
+ byteStride: 8 * floatSize
+ buffer: particleBuffer
+ }
+
+ Attribute {
+ id: particleColorDataAttribute
+ name: "particleColor"
+ attributeType: Attribute.VertexAttribute
+ vertexBaseType: Attribute.Float
+ vertexSize: 3
+ divisor: 1
+ byteOffset: 4 * floatSize
+ byteStride: 8 * floatSize
+ buffer: particleBuffer
+ }
+
+ ComputeMaterial {
+ id: computeMaterial
+ dataBuffer: particleBuffer
+ }
+
+ ComputeCommand {
+ id: particlesComputeJob
+ onRunTypeChanged: {
+ // Don't forget to re-enable the command
+ // when switching back to continuous
+ if (runType === ComputeCommand.Continuous)
+ enabled = true
+ }
+ }
+
+ Entity {
+ id: particleComputeEntity
+ components: [
+ particlesComputeJob,
+ computeMaterial
+ ]
+ }
+
+ SphereGeometry {
+ id: sphereGeometry
+ rings: 10
+ slices: 10
+ radius: 1
+ // Additional Attributes
+ attributes: [
+ particlePositionDataAttribute,
+ particleColorDataAttribute
+ ]
+ }
+
+ Entity {
+ id: particleRenderEntity
+ readonly property GeometryRenderer particlesRenderer: GeometryRenderer {
+ instanceCount: particlesCount
+ indexOffset: 0
+ firstInstance: 0
+ primitiveType: GeometryRenderer.Triangles
+ geometry: sphereGeometry
+ }
+
+ components: [
+ particlesRenderer,
+ computeMaterial
+ ]
+ }
+}
+
diff --git a/tests/manual/compute-manual/compute-manual.pro b/tests/manual/compute-manual/compute-manual.pro
new file mode 100644
index 000000000..e2a9116db
--- /dev/null
+++ b/tests/manual/compute-manual/compute-manual.pro
@@ -0,0 +1,14 @@
+!include( ../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3dquick 3dinput quick qml
+
+HEADERS += \
+
+
+RESOURCES += \
+ compute-manual.qrc
+
+SOURCES += \
+ main.cpp
diff --git a/tests/manual/compute-manual/compute-manual.qrc b/tests/manual/compute-manual/compute-manual.qrc
new file mode 100644
index 000000000..0f94fddd5
--- /dev/null
+++ b/tests/manual/compute-manual/compute-manual.qrc
@@ -0,0 +1,11 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ <file>ComputeFrameGraph.qml</file>
+ <file>ComputeMaterial.qml</file>
+ <file>particles.frag</file>
+ <file>particles.vert</file>
+ <file>ParticlesScene.qml</file>
+ <file>particles.comp</file>
+ </qresource>
+</RCC>
diff --git a/tests/manual/compute-manual/main.cpp b/tests/manual/compute-manual/main.cpp
new file mode 100644
index 000000000..afc9df36a
--- /dev/null
+++ b/tests/manual/compute-manual/main.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQuickView>
+
+int main(int argc, char* argv[])
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView view;
+
+ view.resize(1024, 1024);
+ view.setResizeMode(QQuickView::SizeRootObjectToView);
+ view.setSource(QUrl("qrc:/main.qml"));
+ view.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/compute-manual/main.qml b/tests/manual/compute-manual/main.qml
new file mode 100644
index 000000000..a76c8ae0c
--- /dev/null
+++ b/tests/manual/compute-manual/main.qml
@@ -0,0 +1,109 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.14
+import QtQuick.Scene3D 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.1
+import Qt3D.Render 2.14
+
+Item {
+
+ Scene3D {
+ anchors.fill: parent
+ aspects: ["input", "logic"]
+ focus: true
+ ParticlesScene {
+ id: scene
+ computeMode: runModeCombo.currentIndex === 0 ? ComputeCommand.Continuous : ComputeCommand.Manual
+ }
+ }
+
+ RowLayout {
+ id: colorLayout
+ anchors.left: parent.left
+ anchors.leftMargin: 35
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: 35
+ spacing: 15
+
+ RowLayout {
+ Text {
+ text: "Run Mode:"
+ color: "white"
+ }
+ ComboBox {
+ id: runModeCombo
+ model: ["Continuous", "Manual"]
+ }
+ }
+ RowLayout {
+ visible: runModeCombo.currentIndex === 1
+ Text {
+ color: "white"
+ text: "Frames"
+ }
+ SpinBox {
+ id: frameCountSpinBox
+ value: 5
+ from: 1
+ to: 10
+ stepSize: 1
+ }
+ Button {
+ text: "Trigger"
+ onClicked: {
+ // Trigger Compute Manual
+ scene.triggerCompute(frameCountSpinBox.value)
+ }
+ }
+ }
+ }
+}
diff --git a/tests/manual/compute-manual/particles.comp b/tests/manual/compute-manual/particles.comp
new file mode 100644
index 000000000..b05e49c1d
--- /dev/null
+++ b/tests/manual/compute-manual/particles.comp
@@ -0,0 +1,31 @@
+#version 430 core
+
+uniform float time;
+
+layout (local_size_x = 1024) in;
+
+struct ParticleData
+{
+ vec4 position;
+ vec4 color;
+};
+
+// Particles from previouse frame
+layout (std430, binding = 0) coherent buffer Particles
+{
+ ParticleData particles[];
+} data;
+
+void main(void)
+{
+ uint globalId = gl_GlobalInvocationID.x;
+
+ // Retrieve current particle from previous frame
+ ParticleData currentParticle = data.particles[globalId];
+
+ // New position = old position + sin(time)
+ currentParticle.position = currentParticle.position + vec4(0.0, 1.0, 0.0, 0.0) * sin(time * globalId);
+
+ // Save updated particle
+ data.particles[globalId] = currentParticle;
+}
diff --git a/tests/manual/compute-manual/particles.frag b/tests/manual/compute-manual/particles.frag
new file mode 100644
index 000000000..3f11b9868
--- /dev/null
+++ b/tests/manual/compute-manual/particles.frag
@@ -0,0 +1,33 @@
+#version 430 core
+
+out vec4 color;
+
+in VertexBlock
+{
+ flat vec3 color;
+ vec3 pos;
+ vec3 normal;
+} frag_in;
+
+const vec4 lightPosition = vec4(0.0, 0.0, 0.0, 0.0);
+const vec3 lightIntensity = vec3(1.0, 1.0, 1.0);
+const vec3 ka = vec3(0.1, 0.1, 0.1);
+const vec3 ks = vec3(0.8, 0.8, 0.8);
+const float shininess = 50.0;
+
+vec3 ads()
+{
+ vec3 n = normalize( frag_in.normal);
+ vec3 s = normalize( vec3(lightPosition) - frag_in.pos );
+ vec3 v = normalize( -frag_in.pos );
+ vec3 h = normalize( v + s );
+ return lightIntensity * (ka +
+ frag_in.color * max( dot(s, frag_in.normal ), 0.0 ) +
+ ks * pow( max( dot( h, n ), 0.0 ), shininess ) );
+}
+
+
+void main(void)
+{
+ color = vec4(ads(), 1.0);
+}
diff --git a/tests/manual/compute-manual/particles.vert b/tests/manual/compute-manual/particles.vert
new file mode 100644
index 000000000..5f2da2a00
--- /dev/null
+++ b/tests/manual/compute-manual/particles.vert
@@ -0,0 +1,27 @@
+#version 430 core
+
+in vec3 vertexPosition;
+in vec3 vertexNormal;
+
+in vec3 particlePosition;
+in vec3 particleColor;
+
+out VertexBlock
+{
+ flat vec3 color;
+ vec3 pos;
+ vec3 normal;
+} v_out;
+
+uniform mat4 mvp;
+uniform mat3 modelViewNormal;
+uniform mat4 modelView;
+
+void main(void)
+{
+ vec4 pos = vec4(vertexPosition.xyz, 1.0) + vec4(particlePosition, 0.0);
+ gl_Position = mvp * pos;
+ v_out.pos = vec4(modelView * pos).xyz;
+ v_out.normal = normalize(modelViewNormal * vertexNormal);
+ v_out.color = mix(particleColor * 0.2, particleColor, smoothstep(0.5, 0.8, abs(v_out.normal).z));
+}
diff --git a/tests/manual/manual-renderloop/main.cpp b/tests/manual/manual-renderloop/main.cpp
new file mode 100644
index 000000000..f2a49cb86
--- /dev/null
+++ b/tests/manual/manual-renderloop/main.cpp
@@ -0,0 +1,211 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:LGPL$
+** 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 Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** 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-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QTimer>
+#include <QOpenGLContext>
+#include <QWindow>
+#include <qmath.h>
+
+#include <Qt3DCore/QNode>
+#include <Qt3DCore/QEntity>
+#include <Qt3DCore/QTransform>
+#include <Qt3DCore/QAspectEngine>
+
+#include <Qt3DExtras/QTorusMesh>
+#include <Qt3DExtras/QForwardRenderer>
+#include <Qt3DExtras/QPhongMaterial>
+
+#include <Qt3DRender/QCamera>
+#include <Qt3DRender/QCameraLens>
+#include <Qt3DRender/QCameraSelector>
+#include <Qt3DRender/QMesh>
+#include <Qt3DRender/QPointLight>
+#include <Qt3DRender/QRenderAspect>
+#include <Qt3DRender/QRenderSettings>
+#include <Qt3DRender/QRenderSurfaceSelector>
+#include <Qt3DRender/private/qrenderaspect_p.h>
+
+
+class ManualRenderer
+{
+public:
+ ManualRenderer()
+ : m_aspectEngine(new Qt3DCore::QAspectEngine())
+ , m_renderAspect(new Qt3DRender::QRenderAspect(Qt3DRender::QRenderAspect::Synchronous))
+ {
+ }
+
+ ~ManualRenderer() {
+ m_aspectEngine->setRootEntity(Qt3DCore::QEntityPtr());
+ m_aspectEngine->unregisterAspect(m_renderAspect);
+ delete m_renderAspect;
+ delete m_aspectEngine;
+ }
+
+ void initialize(QWindow *window, QOpenGLContext *glCtx)
+ {
+ m_aspectEngine->registerAspect(m_renderAspect);
+ m_aspectEngine->setRunMode(Qt3DCore::QAspectEngine::Manual);
+
+ Qt3DRender::QRenderAspectPrivate *dRenderAspect = static_cast<decltype(dRenderAspect)>
+ (Qt3DRender::QRenderAspectPrivate::get(m_renderAspect));
+ dRenderAspect->renderInitialize(glCtx);
+
+ m_rootEntity.reset(createSceneTree(window));
+ m_aspectEngine->setRootEntity(m_rootEntity);
+ }
+
+ void render() {
+ qDebug() << Q_FUNC_INFO << "Updating Scene";
+ updateScene();
+ qDebug() << Q_FUNC_INFO << "Processing Frame";
+ // Launch jobs to process the frame
+ m_aspectEngine->processFrame();
+ qDebug() << Q_FUNC_INFO << "Rendering Frame";
+ // Submit Render Queues
+ Qt3DRender::QRenderAspectPrivate *dRenderAspect = static_cast<decltype(dRenderAspect)>
+ (Qt3DRender::QRenderAspectPrivate::get(m_renderAspect));
+ dRenderAspect->renderSynchronous(true);
+ }
+
+private:
+ Qt3DCore::QEntity *createSceneTree(QWindow *surface) {
+ // Root entity in the 3D scene.
+ Qt3DCore::QEntity *rootEntity = new Qt3DCore::QEntity;
+ auto camera = new Qt3DRender::QCamera(rootEntity);
+ camera->lens()->setPerspectiveProjection(45.0f, 16.0f/9.0f, 0.1f, 1000.0f);
+ camera->setPosition(QVector3D(0, 0, 40.0f));
+ camera->setViewCenter(QVector3D(0, 0, 0));
+
+ // Torus
+ Qt3DCore::QEntity *torusEntity = new Qt3DCore::QEntity(rootEntity);
+ auto material = new Qt3DExtras::QPhongMaterial(rootEntity);
+ auto torusTransform = new Qt3DCore::QTransform;
+ auto torusMesh = new Qt3DExtras::QTorusMesh;
+
+ torusMesh->setRadius(5);
+ torusMesh->setMinorRadius(1);
+ torusMesh->setRings(100);
+ torusMesh->setSlices(20);
+
+ torusTransform->setScale3D(QVector3D(1.5, 1, 0.5));
+ torusTransform->setRotation(QQuaternion::fromAxisAndAngle(QVector3D(1, 0, 0), 45.0f));
+
+ torusEntity->addComponent(torusMesh);
+ torusEntity->addComponent(material);
+ torusEntity->addComponent(torusTransform);
+
+ // FrameGraph
+ auto forwardRenderer = new Qt3DExtras::QForwardRenderer();
+ forwardRenderer->setSurface(surface);
+ forwardRenderer->setCamera(camera);
+ forwardRenderer->setClearColor(QColor(Qt::black));
+
+ auto renderSettings = new Qt3DRender::QRenderSettings();
+ renderSettings->setActiveFrameGraph(forwardRenderer);
+ rootEntity->addComponent(renderSettings);
+
+ return rootEntity;
+ }
+
+ void updateScene()
+ {
+ static int angle = 0;
+ // Update camera position
+ auto camera = m_rootEntity->findChild<Qt3DRender::QCamera *>();
+ Q_ASSERT(camera);
+
+ const double angleRad = qDegreesToRadians(double(angle));
+ const QVector3D newPos(qSin(angleRad), 0.0, qCos(angleRad));
+ camera->setPosition(newPos * 40.0f);
+
+ qDebug() << Q_FUNC_INFO << "Camera Transform Matrix" << camera->transform()->matrix();
+ qDebug() << Q_FUNC_INFO << "Camera ViewMatrix" << camera->viewMatrix();
+
+ angle = (angle + 1) % 360;
+ }
+
+ Qt3DCore::QEntityPtr m_rootEntity;
+ Qt3DCore::QAspectEngine *m_aspectEngine;
+ Qt3DRender::QRenderAspect *m_renderAspect;
+};
+
+int main(int ac, char **av)
+{
+ QSurfaceFormat format = QSurfaceFormat::defaultFormat();
+#ifdef QT_OPENGL_ES_2
+ format.setRenderableType(QSurfaceFormat::OpenGLES);
+#else
+ if (QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGL) {
+ format.setVersion(4, 3);
+ format.setProfile(QSurfaceFormat::CoreProfile);
+ }
+#endif
+ format.setDepthBufferSize(24);
+ format.setSamples(4);
+ format.setStencilBufferSize(8);
+ QSurfaceFormat::setDefaultFormat(format);
+
+ QGuiApplication app(ac, av);
+
+ QWindow win;
+ win.setSurfaceType(QSurface::OpenGLSurface);
+ win.resize(1024, 768);
+ win.setFormat(format);
+ win.show();
+
+ QOpenGLContext ctx;
+ ctx.setFormat(format);
+ const bool ctxCreated = ctx.create();
+
+ if (!ctxCreated) {
+ qWarning() << "Failed to create GL context";
+ return -1;
+ }
+
+ ManualRenderer renderer;
+ renderer.initialize(&win, &ctx);
+
+ QTimer t;
+ QObject::connect(&t, &QTimer::timeout, [&] { renderer.render(); });
+ t.start(16);
+
+ return app.exec();
+}
diff --git a/tests/manual/manual-renderloop/manual-renderloop.pro b/tests/manual/manual-renderloop/manual-renderloop.pro
new file mode 100644
index 000000000..d126a48c5
--- /dev/null
+++ b/tests/manual/manual-renderloop/manual-renderloop.pro
@@ -0,0 +1,8 @@
+!include( ../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3drender-private 3dinput 3dextras
+
+SOURCES += \
+ main.cpp
diff --git a/tests/manual/manual.pro b/tests/manual/manual.pro
index 1182886d3..2f630e0d9 100644
--- a/tests/manual/manual.pro
+++ b/tests/manual/manual.pro
@@ -67,7 +67,13 @@ SUBDIRS += \
qtbug-76766 \
shader-image-qml \
scene3d-in-sync \
- compressed_textures
+ compressed_textures \
+ subtree-enabler-qml \
+ scene3d-visibility \
+ manual-renderloop
+
+!macos:!uikit: SUBDIRS += compute-manual
+
qtHaveModule(multimedia): {
SUBDIRS += \
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
diff --git a/tests/manual/scene3d-visibility/main.cpp b/tests/manual/scene3d-visibility/main.cpp
new file mode 100644
index 000000000..8886263f4
--- /dev/null
+++ b/tests/manual/scene3d-visibility/main.cpp
@@ -0,0 +1,66 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QGuiApplication>
+#include <QQuickView>
+
+int main(int argc, char **argv)
+{
+ QGuiApplication app(argc, argv);
+
+ QQuickView view;
+
+ view.resize(500, 500);
+ view.setResizeMode(QQuickView::SizeRootObjectToView);
+ view.setSource(QUrl("qrc:/main.qml"));
+ view.show();
+
+ return app.exec();
+}
diff --git a/tests/manual/scene3d-visibility/main.qml b/tests/manual/scene3d-visibility/main.qml
new file mode 100644
index 000000000..ccfa3227f
--- /dev/null
+++ b/tests/manual/scene3d-visibility/main.qml
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.14
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import Qt3D.Input 2.14
+import Qt3D.Extras 2.14
+import QtQuick.Scene3D 2.14
+
+Item {
+ id: root
+
+ Timer {
+ running: true
+ repeat: true
+ interval: 2000
+ onTriggered: scene3d.visible = !scene3d.visible
+ }
+
+ // Scene3D
+ Scene3D {
+ id: scene3d
+ visible: false
+ readonly property double halfWidth: width * 0.5
+
+ focus: true
+ anchors.fill: parent
+ // Make sure to define the input aspect if we want to handle inputs
+ aspects: ["render", "input"]
+ multisample: false
+
+ Entity { // Root
+ id: sceneRoot
+ components: [
+ RenderSettings {
+ activeFrameGraph: ForwardRenderer {
+ id: forwardRenderer
+ camera: mainCamera
+ clearColor: "yellow"
+ }
+ },
+ // Event Source is the Scene3D in that case
+ InputSettings { }
+ ]
+
+ Camera {
+ id: mainCamera
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ nearPlane : 0.1
+ farPlane : 1000.0
+ position: Qt.vector3d( 0.0, 0.0, -40.0 )
+ upVector: Qt.vector3d( 0.0, 1.0, 0.0 )
+ viewCenter: Qt.vector3d( 0.0, 0.0, 0.0 )
+ }
+
+ PhongMaterial {
+ id: material
+ }
+
+ TorusMesh {
+ id: torusMesh
+ radius: 5
+ minorRadius: 1
+ rings: 100
+ slices: 20
+ }
+
+ SphereMesh {
+ id: sphereMesh
+ radius: 3
+ }
+
+ Transform {
+ id: torusTransform
+ scale3D: Qt.vector3d(1.5, 1, 0.5)
+ rotation: fromAxisAndAngle(Qt.vector3d(1, 0, 0), 45)
+ }
+
+ Transform {
+ id: sphereTransform
+ property real userAngle: 0.0
+ matrix: {
+ var m = Qt.matrix4x4();
+ m.rotate(userAngle, Qt.vector3d(0, 1, 0));
+ m.translate(Qt.vector3d(20, 0, 0));
+ return m;
+ }
+
+ onWorldMatrixChanged: console.log("Sphere WorldMatrix " + worldMatrix)
+ }
+
+ NumberAnimation {
+ target: sphereTransform
+ property: "userAngle"
+ duration: 1000
+ from: 0
+ to: 360
+ loops: Animation.Infinite
+ running: true
+ }
+
+ Entity {
+ id: torusEntity
+ components: [ torusMesh, material, torusTransform ]
+ }
+ Entity {
+ id: sphereEntity
+ components: [ sphereMesh, material, sphereTransform ]
+ }
+ }
+ }
+}
diff --git a/tests/manual/scene3d-visibility/scene3d-visibility.pro b/tests/manual/scene3d-visibility/scene3d-visibility.pro
new file mode 100644
index 000000000..a1c20a502
--- /dev/null
+++ b/tests/manual/scene3d-visibility/scene3d-visibility.pro
@@ -0,0 +1,10 @@
+QT += qml quick 3dinput
+
+SOURCES += \
+ main.cpp
+
+OTHER_FILES += \
+ main.qml
+
+RESOURCES += \
+ scene3d-visibility.qrc
diff --git a/tests/manual/scene3d-visibility/scene3d-visibility.qrc b/tests/manual/scene3d-visibility/scene3d-visibility.qrc
new file mode 100644
index 000000000..5f6483ac3
--- /dev/null
+++ b/tests/manual/scene3d-visibility/scene3d-visibility.qrc
@@ -0,0 +1,5 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ </qresource>
+</RCC>
diff --git a/tests/manual/sharedtexture/main.cpp b/tests/manual/sharedtexture/main.cpp
index a85f90ee6..6f2ef42f2 100644
--- a/tests/manual/sharedtexture/main.cpp
+++ b/tests/manual/sharedtexture/main.cpp
@@ -137,8 +137,7 @@ int main(int argc, char* argv[])
// Multimedia player
TextureWidget textureWidget;
- VideoPlayerThread *videoPlayer = new VideoPlayerThread(&textureWidget);
- videoPlayer->start();
+ VideoPlayer *videoPlayer = new VideoPlayer(&textureWidget);
textureWidget.resize(800, 600);
textureWidget.show();
diff --git a/tests/manual/sharedtexture/videoplayer.cpp b/tests/manual/sharedtexture/videoplayer.cpp
index f970116b5..2e52b85e0 100644
--- a/tests/manual/sharedtexture/videoplayer.cpp
+++ b/tests/manual/sharedtexture/videoplayer.cpp
@@ -57,8 +57,6 @@ TextureWidget::TextureWidget(QWidget *parent)
: QOpenGLWidget(parent)
, m_texture(QOpenGLTexture::Target2D)
{
- // Lock mutex so that we never process a frame until we have been initialized
- m_mutex.lock();
}
// Main thread
@@ -104,14 +102,11 @@ void TextureWidget::initializeGL()
qDebug() << Q_FUNC_INFO << context()->shareContext();
m_vao.create();
- // Allow rendering/frame acquisition to go on
- m_mutex.unlock();
}
// Main thread
void TextureWidget::paintGL()
{
- QMutexLocker lock(&m_mutex);
glViewport(0, 0, width(), height());
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
@@ -131,12 +126,8 @@ void TextureWidget::paintGL()
m_shader.release();
}
-// Video Player thread
void TextureWidget::setVideoFrame(const QVideoFrame &frame)
{
- // Ensure we won't be rendering while we are processing the frame
- QMutexLocker lock(&m_mutex);
-
QVideoFrame f = frame;
// Map frame
@@ -194,16 +185,14 @@ bool GLVideoSurface::present(const QVideoFrame &frame)
return true;
}
-VideoPlayerThread::VideoPlayerThread(TextureWidget *textureWidget)
- : QThread(textureWidget)
+VideoPlayer::VideoPlayer(TextureWidget *textureWidget)
+ : QObject(textureWidget)
, m_player(new QMediaPlayer(nullptr, QMediaPlayer::VideoSurface))
, m_surface(new GLVideoSurface())
{
- m_player->moveToThread(this);
- m_player->setMedia(QUrl("https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4"));
+ m_player->setMedia(QUrl("https://www.sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4"));
// Tell player to render on GLVideoSurface
- m_surface->moveToThread(this);
m_player->setVideoOutput(m_surface.get());
// Display errors
@@ -218,16 +207,13 @@ VideoPlayerThread::VideoPlayerThread(TextureWidget *textureWidget)
m_player->play();
});
- // Start playing when thread starts
- QObject::connect(this, &QThread::started, this, [this] { m_player->play(); });
-
- // Direct connection between 2 objects living in different threads
QObject::connect(m_surface.get(), &GLVideoSurface::onNewFrame,
textureWidget, &TextureWidget::setVideoFrame, Qt::DirectConnection);
+
+ // Start playing
+ m_player->play();
}
-VideoPlayerThread::~VideoPlayerThread()
+VideoPlayer::~VideoPlayer()
{
- exit(0);
- wait();
}
diff --git a/tests/manual/sharedtexture/videoplayer.h b/tests/manual/sharedtexture/videoplayer.h
index 377ea57fe..a96cb16b1 100644
--- a/tests/manual/sharedtexture/videoplayer.h
+++ b/tests/manual/sharedtexture/videoplayer.h
@@ -48,9 +48,6 @@
**
****************************************************************************/
-#include <QThread>
-#include <QMutex>
-
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLVertexArrayObject>
@@ -90,7 +87,6 @@ private:
QOpenGLVertexArrayObject m_vao;
QOpenGLShaderProgram m_shader;
QOpenGLTexture m_texture;
- QMutex m_mutex;
};
@@ -108,12 +104,12 @@ Q_SIGNALS:
};
-class VideoPlayerThread : public QThread
+class VideoPlayer : public QObject
{
Q_OBJECT
public:
- VideoPlayerThread(TextureWidget *textureWidget);
- ~VideoPlayerThread();
+ VideoPlayer(TextureWidget *textureWidget);
+ ~VideoPlayer();
private:
TextureWidget *m_textureWidget;
diff --git a/tests/manual/sharedtextureqml/main.cpp b/tests/manual/sharedtextureqml/main.cpp
index 5c7ae9cff..c0a79e6f8 100644
--- a/tests/manual/sharedtextureqml/main.cpp
+++ b/tests/manual/sharedtextureqml/main.cpp
@@ -108,8 +108,7 @@ int main(int argc, char* argv[])
// Multimedia player
TextureWidget textureWidget;
- VideoPlayerThread *videoPlayer = new VideoPlayerThread(&textureWidget);
- videoPlayer->start();
+ VideoPlayer *videoPlayer = new VideoPlayer(&textureWidget);
textureWidget.resize(800, 600);
textureWidget.show();
diff --git a/tests/manual/subtree-enabler-qml/FrameGraph.qml b/tests/manual/subtree-enabler-qml/FrameGraph.qml
new file mode 100644
index 000000000..b9cdce9ea
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/FrameGraph.qml
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import QtQuick 2.14 as QQ2
+
+RenderSettings {
+ id: frameGraph
+
+ property alias leftCamera: cameraSelectorLeftViewport.camera;
+ property alias rightCamera: cameraSelectorRightViewport.camera;
+ property alias window: surfaceSelector.surface
+
+ activeFrameGraph: RenderSurfaceSelector {
+ id: surfaceSelector
+
+ Viewport {
+ id: mainViewport
+ normalizedRect: Qt.rect(0, 0, 1, 1)
+
+ ClearBuffers {
+ buffers: ClearBuffers.ColorDepthBuffer
+ clearColor: Qt.rgba(0.6, 0.6, 0.6, 1.0)
+ NoDraw {}
+ }
+
+ Viewport {
+ id: leftViewport
+ normalizedRect: Qt.rect(0, 0, 0.5, 0.5)
+ CameraSelector { id: cameraSelectorLeftViewport }
+ }
+
+ SubtreeEnabler {
+ id: enabler
+ enabled: true
+
+ QQ2.Timer {
+ running: true
+ repeat: true
+ interval: 1000
+ onTriggered: enabler.enabled = !enabler.enabled
+ }
+
+ Viewport {
+ id: rightViewport
+ normalizedRect: Qt.rect(0.5, 0.5, 0.5, 0.5)
+ CameraSelector { id: cameraSelectorRightViewport }
+ }
+ }
+ }
+ }
+}
diff --git a/tests/manual/subtree-enabler-qml/SimpleCamera.qml b/tests/manual/subtree-enabler-qml/SimpleCamera.qml
new file mode 100644
index 000000000..a1ef6d01c
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/SimpleCamera.qml
@@ -0,0 +1,79 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+
+Entity {
+ id: root
+
+ property vector3d position: Qt.vector3d(0.0, 0.0, 10.0)
+ property vector3d viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
+ property vector3d upVector: Qt.vector3d(0.0, 1.0, 0.0)
+ property CameraLens lens: null
+
+ components: [lens, transform]
+
+ Transform {
+ id: transform
+ matrix: {
+ var m = Qt.matrix4x4();
+ m.translate(root.position)
+ var zAxis = root.position.minus(root.viewCenter).normalized()
+ var xAxis = root.upVector.crossProduct(zAxis).normalized();
+ var yAxis = zAxis.crossProduct(xAxis);
+ var r = Qt.matrix4x4(xAxis.x, yAxis.x, zAxis.x, 0,
+ xAxis.y, yAxis.y, zAxis.y, 0,
+ xAxis.z, yAxis.z, zAxis.z, 0,
+ 0, 0, 0, 1)
+ return m.times(r);
+ }
+ }
+}
diff --git a/tests/manual/subtree-enabler-qml/main.cpp b/tests/manual/subtree-enabler-qml/main.cpp
new file mode 100644
index 000000000..ce5b883bd
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/main.cpp
@@ -0,0 +1,64 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <Qt3DQuickExtras/qt3dquickwindow.h>
+#include <QGuiApplication>
+
+int main(int ac, char **av)
+{
+ QGuiApplication app(ac, av);
+ Qt3DExtras::Quick::Qt3DQuickWindow view;
+ view.setSource(QUrl("qrc:/main.qml"));
+ view.show();
+
+ return app.exec();
+}
+
+
diff --git a/tests/manual/subtree-enabler-qml/main.qml b/tests/manual/subtree-enabler-qml/main.qml
new file mode 100644
index 000000000..c2e530893
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/main.qml
@@ -0,0 +1,110 @@
+/****************************************************************************
+**
+** Copyright (C) 2019 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:BSD$
+** 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.
+**
+** BSD License Usage
+** Alternatively, you may use this file under the terms of the BSD license
+** as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of The Qt Company Ltd nor the names of its
+** contributors may be used to endorse or promote products derived
+** from this software without specific prior written permission.
+**
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.14
+import Qt3D.Core 2.14
+import Qt3D.Render 2.14
+import Qt3D.Input 2.14
+import Qt3D.Extras 2.14
+
+Entity {
+ id: rootNode
+ components: [frameGraph]
+
+ FrameGraph {
+ id: frameGraph
+ leftCamera: camera1
+ rightCamera: camera2
+ }
+
+ CameraLens {
+ id: cameraLens
+ projectionType: CameraLens.PerspectiveProjection
+ fieldOfView: 45
+ aspectRatio: 16/9
+ nearPlane: 0.01
+ farPlane: 1000.0
+ }
+
+ SimpleCamera {
+ id: camera1
+ lens: cameraLens
+ position: Qt.vector3d(10.0, 1.0, 10.0)
+ viewCenter: Qt.vector3d(0.0, 1.0, 0.0)
+ }
+
+ SimpleCamera {
+ id: camera2
+ lens: cameraLens
+ position: Qt.vector3d(0.0, 0.0, 5.0)
+ viewCenter: Qt.vector3d(0.0, 0.0, 0.0)
+ }
+
+ Entity {
+ id: sceneRoot
+ property real rotationAngle: 0
+
+ SequentialAnimation {
+ running: true
+ loops: Animation.Infinite
+ NumberAnimation { target: sceneRoot; property: "rotationAngle"; to: 360; duration: 4000; }
+ }
+
+ Entity {
+ components: [
+ Transform {
+ rotation: fromAxisAndAngle(Qt.vector3d(0, 0, 1), -sceneRoot.rotationAngle)
+ },
+ CylinderMesh {},
+ MetalRoughMaterial {}
+ ]
+ }
+ } // sceneRoot
+} // rootNode
diff --git a/tests/manual/subtree-enabler-qml/subtree-enabler-qml.pro b/tests/manual/subtree-enabler-qml/subtree-enabler-qml.pro
new file mode 100644
index 000000000..ddd0ae561
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/subtree-enabler-qml.pro
@@ -0,0 +1,17 @@
+!include( ../manual.pri ) {
+ error( "Couldn't find the manual.pri file!" )
+}
+
+QT += 3dcore 3drender 3dinput 3dquick qml quick 3dquickextras
+
+HEADERS += \
+
+SOURCES += \
+ main.cpp
+
+OTHER_FILES += \
+ main.qml
+
+RESOURCES += \
+ subtree-enabler-qml.qrc \
+
diff --git a/tests/manual/subtree-enabler-qml/subtree-enabler-qml.qrc b/tests/manual/subtree-enabler-qml/subtree-enabler-qml.qrc
new file mode 100644
index 000000000..e565b719f
--- /dev/null
+++ b/tests/manual/subtree-enabler-qml/subtree-enabler-qml.qrc
@@ -0,0 +1,7 @@
+<RCC>
+ <qresource prefix="/">
+ <file>main.qml</file>
+ <file>FrameGraph.qml</file>
+ <file>SimpleCamera.qml</file>
+ </qresource>
+</RCC>