// Copyright (C) 2017 Paul Lemire // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include #include #include using namespace Qt3DCore; using HMatrix = Qt3DCore::QHandle; using HCameraLens = Qt3DCore::QHandle; 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 #ifdef __SSE2__ private Q_SLOTS: void checkAllocationAndAlignmentMatrix4x4() { // GIVEN MatrixManager manager; // WHEN for (uint i = 0; i < std::numeric_limits::max(); ++i) manager.getOrCreateResource(Qt3DCore::QNodeId::createId()); // THEN // Shouldn't crash const std::vector &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::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::max(); ++i) manager.getOrCreateResource(Qt3DCore::QNodeId::createId()); // THEN // Shouldn't crash const std::vector &activeHandles = manager.activeHandles(); for (const HCameraLens &handle : activeHandles) { // WHEN Qt3DRender::Render::CameraLens *lens = manager.data(handle); // THEN # ifdef __AVX2__ QCOMPARE(int((uintptr_t)lens % 32), 0); # else QCOMPARE(int((uintptr_t)lens % 16), 0); # endif } } #endif // __SSE2__ }; QTEST_MAIN(tst_AlignedResourcesManagersSSE) #include "tst_alignedresourcesmanagers-sse.moc"