diff --git a/src/Magnum/Trade/Test/MeshDataTest.cpp b/src/Magnum/Trade/Test/MeshDataTest.cpp index 2f6bb90da..ba042b7a2 100644 --- a/src/Magnum/Trade/Test/MeshDataTest.cpp +++ b/src/Magnum/Trade/Test/MeshDataTest.cpp @@ -114,6 +114,11 @@ struct MeshDataTest: TestSuite::Tester { void constructIndexlessNotOwned(); void constructAttributelessNotOwned(); + #ifndef CORRADE_TARGET_32BIT + void constructIndicesOver4GB(); + void constructAttributeOver4GB(); + #endif + void constructIndexDataButNotIndexed(); void constructAttributelessImplicitVertexCount(); void constructIndicesNotContained(); @@ -299,6 +304,11 @@ MeshDataTest::MeshDataTest() { &MeshDataTest::constructAttributelessNotOwned}, Containers::arraySize(SingleNotOwnedData)); + #ifndef CORRADE_TARGET_32BIT + addTests({&MeshDataTest::constructIndicesOver4GB, + &MeshDataTest::constructAttributeOver4GB}); + #endif + addTests({&MeshDataTest::constructIndexDataButNotIndexed, &MeshDataTest::constructAttributelessImplicitVertexCount, &MeshDataTest::constructIndicesNotContained, @@ -2245,6 +2255,29 @@ void MeshDataTest::constructAttributelessNotOwned() { CORRADE_COMPARE(data.attributeCount(), 0); } +#ifndef CORRADE_TARGET_32BIT +void MeshDataTest::constructIndicesOver4GB() { + /* For some reason 2500 doesn't trigger an assertion, 3000 does */ + Containers::ArrayView indexData{reinterpret_cast(0xdeadbeef), 3000ull*1000*1000}; + + MeshIndexData indices{indexData}; + MeshData data{MeshPrimitive::Triangles, {}, indexData, indices, 5}; + CORRADE_COMPARE(data.indices().data(), indexData.begin()); + CORRADE_COMPARE(data.indices().size(), indexData.size()); +} + +void MeshDataTest::constructAttributeOver4GB() { + /* For some reason 2500 doesn't trigger an assertion, 3000 does */ + Containers::ArrayView vertexData{reinterpret_cast(0xdeadbeef), 3000ull*1000*1000}; + + MeshData data{MeshPrimitive::Triangles, {}, vertexData, { + MeshAttributeData{meshAttributeCustom(15), vertexData} + }}; + CORRADE_COMPARE(data.attribute(0).data(), vertexData.begin()); + CORRADE_COMPARE(data.attribute(0).size(), vertexData.size()); +} +#endif + void MeshDataTest::constructIndexDataButNotIndexed() { CORRADE_SKIP_IF_NO_ASSERT(); diff --git a/src/Magnum/Trade/Test/SceneDataTest.cpp b/src/Magnum/Trade/Test/SceneDataTest.cpp index f50829087..e51e7de4e 100644 --- a/src/Magnum/Trade/Test/SceneDataTest.cpp +++ b/src/Magnum/Trade/Test/SceneDataTest.cpp @@ -139,6 +139,11 @@ struct SceneDataTest: TestSuite::Tester { void constructDeprecatedBoth2DAnd3D(); #endif + #ifndef CORRADE_TARGET_32BIT + void constructMappingOver4GB(); + void constructFieldOver4GB(); + #endif + void constructDuplicateField(); void constructDuplicateCustomField(); void constructInconsistentMappingType(); @@ -489,6 +494,11 @@ SceneDataTest::SceneDataTest() { addTests({&SceneDataTest::constructDeprecatedBoth2DAnd3D}); #endif + #ifndef CORRADE_TARGET_32BIT + addTests({&SceneDataTest::constructMappingOver4GB, + &SceneDataTest::constructFieldOver4GB}); + #endif + addTests({&SceneDataTest::constructDuplicateField, &SceneDataTest::constructDuplicateCustomField, &SceneDataTest::constructInconsistentMappingType, @@ -3533,6 +3543,30 @@ void SceneDataTest::constructDeprecatedBoth2DAnd3D() { } #endif +#ifndef CORRADE_TARGET_32BIT +void SceneDataTest::constructMappingOver4GB() { + Containers::ArrayView mappingData{reinterpret_cast(0xdeadbeef), 3000ull*1000*1000}; + Containers::StridedArrayView1D fieldData{mappingData, reinterpret_cast(mappingData.data()), 3000ull*1000*1000, 0}; + + SceneData data{SceneMappingType::UnsignedInt, 1, {}, mappingData, { + SceneFieldData{sceneFieldCustom(15), mappingData, fieldData}, + }}; + CORRADE_COMPARE(data.mapping(0).data(), mappingData.begin()); + CORRADE_COMPARE(data.mapping(0).size(), mappingData.size()); +} + +void SceneDataTest::constructFieldOver4GB() { + Containers::ArrayView fieldData{reinterpret_cast(0xdeadbeef), 3000ull*1000*1000}; + Containers::StridedArrayView1D mappingData{fieldData, reinterpret_cast(fieldData.data()), 3000ull*1000*1000, 0}; + + SceneData data{SceneMappingType::UnsignedByte, 1, {}, fieldData, { + SceneFieldData{sceneFieldCustom(15), mappingData, fieldData}, + }}; + CORRADE_COMPARE(data.field(0).data(), fieldData.begin()); + CORRADE_COMPARE(data.field(0).size(), fieldData.size()); +} +#endif + void SceneDataTest::constructDuplicateField() { CORRADE_SKIP_IF_NO_ASSERT();