summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2017-03-23 17:02:46 +0100
committerPaul Lemire <paul.lemire@kdab.com>2018-03-01 09:03:05 +0000
commitc35f78e4e4871345fdb586c36a0e24839a243ae6 (patch)
tree0e6f44cfb19d241c8347d56acd945c12e51fe3ce /tests
parent912d3bdc6471053a61b747cac7376fba20c4e8a2 (diff)
Add unit test to check memory alignment
Change-Id: I59b817f9972d0a6866f7cc57a4bcd6fe2cd097c9 Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/render/alignedresourcesmanagers-avx/alignedresourcesmanagers-avx.pro9
-rw-r--r--tests/auto/render/alignedresourcesmanagers-avx/tst_alignedresourcesmanagers-avx.cpp123
-rw-r--r--tests/auto/render/alignedresourcesmanagers-sse/alignedresourcesmanagers-sse.pro9
-rw-r--r--tests/auto/render/alignedresourcesmanagers-sse/tst_alignedresourcesmanagers-sse.cpp123
-rw-r--r--tests/auto/render/render.pro3
5 files changed, 267 insertions, 0 deletions
diff --git a/tests/auto/render/alignedresourcesmanagers-avx/alignedresourcesmanagers-avx.pro b/tests/auto/render/alignedresourcesmanagers-avx/alignedresourcesmanagers-avx.pro
new file mode 100644
index 000000000..28ec7337d
--- /dev/null
+++ b/tests/auto/render/alignedresourcesmanagers-avx/alignedresourcesmanagers-avx.pro
@@ -0,0 +1,9 @@
+TARGET = tst_alignedresourcesmanagers-avx
+CONFIG += testcase simd
+TEMPLATE = app
+
+SOURCES += tst_alignedresourcesmanagers-avx.cpp
+
+QT += testlib 3dcore 3dcore-private 3drender 3drender-private
+
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_AVX2
diff --git a/tests/auto/render/alignedresourcesmanagers-avx/tst_alignedresourcesmanagers-avx.cpp b/tests/auto/render/alignedresourcesmanagers-avx/tst_alignedresourcesmanagers-avx.cpp
new file mode 100644
index 000000000..c89592e63
--- /dev/null
+++ b/tests/auto/render/alignedresourcesmanagers-avx/tst_alignedresourcesmanagers-avx.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Paul Lemire <paul.lemire350@gmail.com>
+** 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/qnodeid.h>
+#include <Qt3DCore/private/matrix4x4_avx2_p.h>
+#include <Qt3DCore/private/qresourcemanager_p.h>
+#include <Qt3DRender/private/cameralens_p.h>
+
+using namespace Qt3DCore;
+
+using HMatrix = Qt3DCore::QHandle<Matrix4x4_AVX2>;
+using HCameraLens = Qt3DCore::QHandle<Qt3DRender::Render::CameraLens>;
+
+class MatrixManager : public Qt3DCore::QResourceManager<
+ Matrix4x4_AVX2,
+ Qt3DCore::QNodeId,
+ Qt3DCore::NonLockingPolicy>
+{
+public:
+ MatrixManager() {}
+};
+
+class CameraLensManager : public Qt3DCore::QResourceManager<
+ Qt3DRender::Render::CameraLens,
+ Qt3DCore::QNodeId,
+ Qt3DCore::NonLockingPolicy>
+{
+public:
+ CameraLensManager() {}
+};
+
+
+class tst_AlignedResourcesManagersAVX: public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+
+ void checkAllocationAndAlignmentMatrix4x4()
+ {
+ // GIVEN
+ MatrixManager manager;
+
+ // WHEN
+ for (uint i = 0; i < std::numeric_limits<ushort>::max(); ++i)
+ manager.getOrCreateResource(Qt3DCore::QNodeId::createId());
+
+ // THEN
+ // Shouldn't crash
+
+ const QVector<HMatrix> activeHandles = manager.activeHandles();
+ for (const HMatrix handle : activeHandles) {
+ // WHEN
+ Matrix4x4_AVX2 *mat = manager.data(handle);
+ // THEN
+ QCOMPARE(int((uintptr_t)mat % 32), 0);
+ }
+
+ // WHEN
+ for (uint i = 2; i < std::numeric_limits<ushort>::max(); ++i) {
+ Matrix4x4_AVX2 *mat1 = manager.data(activeHandles.at(i - 2));
+ Matrix4x4_AVX2 *mat2 = manager.data(activeHandles.at(i - 1));
+ Matrix4x4_AVX2 *mat3 = manager.data(activeHandles.at(i));
+
+ // WHEN
+ *mat3 = (*mat2 * *mat1);
+
+ // THEN
+ // Shouldn't crash
+ }
+ }
+
+ void checkAllocationAndAlignmentCameraLens()
+ {
+ // GIVEN
+ CameraLensManager manager;
+
+ // WHEN
+ for (uint i = 0; i < std::numeric_limits<ushort>::max(); ++i)
+ manager.getOrCreateResource(Qt3DCore::QNodeId::createId());
+
+ // THEN
+ // Shouldn't crash
+
+ const QVector<HCameraLens> activeHandles = manager.activeHandles();
+ for (const HCameraLens handle : activeHandles) {
+ // WHEN
+ Qt3DRender::Render::CameraLens *lens = manager.data(handle);
+ // THEN
+ QCOMPARE(int((uintptr_t)lens % 32), 0);
+ }
+ }
+};
+
+QTEST_MAIN(tst_AlignedResourcesManagersAVX)
+
+#include "tst_alignedresourcesmanagers-avx.moc"
diff --git a/tests/auto/render/alignedresourcesmanagers-sse/alignedresourcesmanagers-sse.pro b/tests/auto/render/alignedresourcesmanagers-sse/alignedresourcesmanagers-sse.pro
new file mode 100644
index 000000000..d9a490266
--- /dev/null
+++ b/tests/auto/render/alignedresourcesmanagers-sse/alignedresourcesmanagers-sse.pro
@@ -0,0 +1,9 @@
+TARGET = tst_alignedresourcesmanagers-avx
+CONFIG += testcase simd
+TEMPLATE = app
+
+SOURCES += tst_alignedresourcesmanagers-sse.cpp
+
+QT += testlib 3dcore 3dcore-private 3drender 3drender-private
+
+QMAKE_CXXFLAGS += $$QMAKE_CFLAGS_SSE2
diff --git a/tests/auto/render/alignedresourcesmanagers-sse/tst_alignedresourcesmanagers-sse.cpp b/tests/auto/render/alignedresourcesmanagers-sse/tst_alignedresourcesmanagers-sse.cpp
new file mode 100644
index 000000000..e4ab187c4
--- /dev/null
+++ b/tests/auto/render/alignedresourcesmanagers-sse/tst_alignedresourcesmanagers-sse.cpp
@@ -0,0 +1,123 @@
+/****************************************************************************
+**
+** Copyright (C) 2017 Paul Lemire <paul.lemire350@gmail.com>
+** 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/qnodeid.h>
+#include <Qt3DCore/private/matrix4x4_sse_p.h>
+#include <Qt3DCore/private/qresourcemanager_p.h>
+#include <Qt3DRender/private/cameralens_p.h>
+
+using namespace Qt3DCore;
+
+using HMatrix = Qt3DCore::QHandle<Matrix4x4_SSE>;
+using HCameraLens = Qt3DCore::QHandle<Qt3DRender::Render::CameraLens>;
+
+class MatrixManager : public Qt3DCore::QResourceManager<
+ Matrix4x4_SSE,
+ Qt3DCore::QNodeId,
+ Qt3DCore::NonLockingPolicy>
+{
+public:
+ MatrixManager() {}
+};
+
+class CameraLensManager : public Qt3DCore::QResourceManager<
+ Qt3DRender::Render::CameraLens,
+ Qt3DCore::QNodeId,
+ Qt3DCore::NonLockingPolicy>
+{
+public:
+ CameraLensManager() {}
+};
+
+
+class tst_AlignedResourcesManagersSSE: public QObject
+{
+ Q_OBJECT
+
+private Q_SLOTS:
+
+ void checkAllocationAndAlignmentMatrix4x4()
+ {
+ // GIVEN
+ MatrixManager manager;
+
+ // WHEN
+ for (uint i = 0; i < std::numeric_limits<ushort>::max(); ++i)
+ manager.getOrCreateResource(Qt3DCore::QNodeId::createId());
+
+ // THEN
+ // Shouldn't crash
+
+ const QVector<HMatrix> activeHandles = manager.activeHandles();
+ for (const HMatrix handle : activeHandles) {
+ // WHEN
+ Matrix4x4_SSE *mat = manager.data(handle);
+ // THEN
+ QCOMPARE(int((uintptr_t)mat % 16), 0);
+ }
+
+ // WHEN
+ for (uint i = 2; i < std::numeric_limits<ushort>::max(); ++i) {
+ Matrix4x4_SSE *mat1 = manager.data(activeHandles.at(i - 2));
+ Matrix4x4_SSE *mat2 = manager.data(activeHandles.at(i - 1));
+ Matrix4x4_SSE *mat3 = manager.data(activeHandles.at(i));
+
+ // WHEN
+ *mat3 = (*mat2 * *mat1);
+
+ // THEN
+ // Shouldn't crash
+ }
+ }
+
+ void checkAllocationAndAlignmentCameraLens()
+ {
+ // GIVEN
+ CameraLensManager manager;
+
+ // WHEN
+ for (uint i = 0; i < std::numeric_limits<ushort>::max(); ++i)
+ manager.getOrCreateResource(Qt3DCore::QNodeId::createId());
+
+ // THEN
+ // Shouldn't crash
+
+ const QVector<HCameraLens> activeHandles = manager.activeHandles();
+ for (const HCameraLens handle : activeHandles) {
+ // WHEN
+ Qt3DRender::Render::CameraLens *lens = manager.data(handle);
+ // THEN
+ QCOMPARE(int((uintptr_t)lens % 16), 0);
+ }
+ }
+};
+
+QTEST_MAIN(tst_AlignedResourcesManagersSSE)
+
+#include "tst_alignedresourcesmanagers-sse.moc"
diff --git a/tests/auto/render/render.pro b/tests/auto/render/render.pro
index 6cb9aefcf..7a71ae264 100644
--- a/tests/auto/render/render.pro
+++ b/tests/auto/render/render.pro
@@ -143,4 +143,7 @@ qtConfig(private_tests) {
}
!macos: SUBDIRS += graphicshelpergl4
+
+ qtConfig(qt3d-simd-avx2): SUBDIRS += alignedresourcesmanagers-avx
+ qtConfig(qt3d-simd-sse2): SUBDIRS += alignedresourcesmanagers-sse
}