diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2017-03-23 17:02:46 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2018-03-01 09:03:05 +0000 |
commit | c35f78e4e4871345fdb586c36a0e24839a243ae6 (patch) | |
tree | 0e6f44cfb19d241c8347d56acd945c12e51fe3ce /tests | |
parent | 912d3bdc6471053a61b747cac7376fba20c4e8a2 (diff) |
Add unit test to check memory alignment
Change-Id: I59b817f9972d0a6866f7cc57a4bcd6fe2cd097c9
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'tests')
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 } |