From 8090013e0a06e8d53059d37e7326ca3b8149d630 Mon Sep 17 00:00:00 2001 From: Pablo Escobar Date: Tue, 3 May 2022 19:13:24 +0200 Subject: [PATCH 1/2] GL,Text: verify buffer contents on GLES3 --- src/Magnum/GL/Test/BufferGLTest.cpp | 53 ++++----- src/Magnum/GL/Test/BufferImageGLTest.cpp | 112 +++++++----------- src/Magnum/GL/Test/CMakeLists.txt | 16 ++- src/Magnum/GL/Test/FramebufferGLTest.cpp | 10 +- .../GL/Test/TransformFeedbackGLTest.cpp | 77 ++++++------ src/Magnum/Text/Test/CMakeLists.txt | 3 + src/Magnum/Text/Test/RendererGLTest.cpp | 35 +++--- 7 files changed, 140 insertions(+), 166 deletions(-) diff --git a/src/Magnum/GL/Test/BufferGLTest.cpp b/src/Magnum/GL/Test/BufferGLTest.cpp index ef6d42202..171fa07fb 100644 --- a/src/Magnum/GL/Test/BufferGLTest.cpp +++ b/src/Magnum/GL/Test/BufferGLTest.cpp @@ -34,6 +34,10 @@ #include "Magnum/GL/Extensions.h" #include "Magnum/GL/OpenGLTester.h" +#ifndef MAGNUM_TARGET_GLES2 +#include "Magnum/DebugTools/BufferData.h" +#endif + #ifndef MAGNUM_TARGET_WEBGL #include #endif @@ -138,15 +142,14 @@ void BufferGLTest::constructFromData() { CORRADE_COMPARE(c.size(), 5*4); CORRADE_COMPARE(d.size(), 5*4); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES - CORRADE_COMPARE_AS(Containers::arrayCast(a.data()), + #ifndef MAGNUM_TARGET_GLES2 + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferData(a)), Containers::arrayView(data), TestSuite::Compare::Container); - CORRADE_COMPARE_AS(Containers::arrayCast(b.data()), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferData(b)), Containers::arrayView(data), TestSuite::Compare::Container); - CORRADE_COMPARE_AS(Containers::arrayCast(c.data()), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferData(c)), Containers::arrayView(data), TestSuite::Compare::Container); /* d's data is undefined, not testing */ @@ -307,10 +310,9 @@ void BufferGLTest::data() { MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(buffer.size(), 5*4); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 MAGNUM_VERIFY_NO_GL_ERROR(); - CORRADE_COMPARE_AS(Containers::arrayCast(buffer.data()), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferData(buffer)), Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -320,10 +322,9 @@ void BufferGLTest::data() { MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(buffer.size(), 5*4); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 MAGNUM_VERIFY_NO_GL_ERROR(); - CORRADE_COMPARE_AS(Containers::arrayCast(buffer.data()), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferData(buffer)), Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -334,10 +335,9 @@ void BufferGLTest::data() { MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(buffer.size(), 5*4); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 MAGNUM_VERIFY_NO_GL_ERROR(); - CORRADE_COMPARE_AS(Containers::arrayCast(buffer.subData(4, 3*4)), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferSubData(buffer, 4, 3*4)), Containers::arrayView(subData), TestSuite::Compare::Container); #endif @@ -347,10 +347,9 @@ void BufferGLTest::data() { MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(buffer.size(), 5*4); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 MAGNUM_VERIFY_NO_GL_ERROR(); - CORRADE_COMPARE_AS(Containers::arrayCast(buffer.subData(4, 3*4)), + CORRADE_COMPARE_AS(Containers::arrayCast(DebugTools::bufferSubData(buffer, 4, 3*4)), Containers::arrayView(subData), TestSuite::Compare::Container); #endif @@ -385,9 +384,8 @@ void BufferGLTest::map() { CORRADE_VERIFY(buffer.unmap()); MAGNUM_VERIFY_NO_GL_ERROR(); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES - Containers::Array changedContents = buffer.data(); + #ifndef MAGNUM_TARGET_GLES2 + Containers::Array changedContents = DebugTools::bufferData(buffer); CORRADE_COMPARE(changedContents.size(), 5); CORRADE_COMPARE(changedContents[3], 107); #endif @@ -417,9 +415,8 @@ void BufferGLTest::mapRange() { CORRADE_VERIFY(buffer.unmap()); MAGNUM_VERIFY_NO_GL_ERROR(); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES - Containers::Array changedContents = buffer.data(); + #ifndef MAGNUM_TARGET_GLES2 + Containers::Array changedContents = DebugTools::bufferData(buffer); CORRADE_COMPARE(changedContents.size(), 5); CORRADE_COMPARE(changedContents[4], 107); #endif @@ -457,9 +454,8 @@ void BufferGLTest::mapRangeExplicitFlush() { MAGNUM_VERIFY_NO_GL_ERROR(); /* Flushed range should be changed */ - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES - Containers::Array changedContents = buffer.data(); + #ifndef MAGNUM_TARGET_GLES2 + Containers::Array changedContents = DebugTools::bufferData(buffer); CORRADE_COMPARE(changedContents.size(), 5); CORRADE_COMPARE(changedContents[4], 107); #endif @@ -478,9 +474,8 @@ void BufferGLTest::copy() { Buffer::copy(buffer1, buffer2, 1, 2, 3); MAGNUM_VERIFY_NO_GL_ERROR(); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES - const Containers::Array subContents = buffer2.subData(2, 3); + #ifndef MAGNUM_TARGET_GLES2 + const Containers::Array subContents = DebugTools::bufferSubData(buffer2, 2, 3); CORRADE_COMPARE_AS(subContents, Containers::arrayView(data).slice(1, 4), TestSuite::Compare::Container); #endif diff --git a/src/Magnum/GL/Test/BufferImageGLTest.cpp b/src/Magnum/GL/Test/BufferImageGLTest.cpp index 915f48587..74691ce70 100644 --- a/src/Magnum/GL/Test/BufferImageGLTest.cpp +++ b/src/Magnum/GL/Test/BufferImageGLTest.cpp @@ -33,6 +33,10 @@ #include "Magnum/GL/PixelFormat.h" #include "Magnum/GL/OpenGLTester.h" +#ifndef MAGNUM_TARGET_GLES2 +#include "Magnum/DebugTools/BufferData.h" +#endif + namespace Magnum { namespace GL { namespace Test { namespace { struct BufferImageGLTest: OpenGLTester { @@ -98,10 +102,6 @@ void BufferImageGLTest::construct() { BufferImage2D a{PixelStorage{}.setAlignment(1), PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, data, BufferUsage::StaticDraw}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(a.storage().alignment(), 1); @@ -110,8 +110,9 @@ void BufferImageGLTest::construct() { CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.dataSize(), 3); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -122,10 +123,6 @@ void BufferImageGLTest::constructGeneric() { BufferImage2D a{PixelStorage{}.setAlignment(1), Magnum::PixelFormat::R8Unorm, {1, 3}, data, BufferUsage::StaticDraw}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(a.storage().alignment(), 1); @@ -134,8 +131,9 @@ void BufferImageGLTest::constructGeneric() { CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.dataSize(), 3); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -150,10 +148,6 @@ void BufferImageGLTest::constructCompressed() { CompressedPixelFormat::RGBAS3tcDxt1, {4, 4}, data, BufferUsage::StaticDraw}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -163,8 +157,9 @@ void BufferImageGLTest::constructCompressed() { CORRADE_COMPARE(a.size(), Vector2i(4, 4)); CORRADE_COMPARE(a.dataSize(), 8); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -179,10 +174,6 @@ void BufferImageGLTest::constructCompressedGeneric() { Magnum::CompressedPixelFormat::Bc1RGBAUnorm, {4, 4}, data, BufferUsage::StaticDraw}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -192,8 +183,9 @@ void BufferImageGLTest::constructCompressedGeneric() { CORRADE_COMPARE(a.size(), Vector2i(4, 4)); CORRADE_COMPARE(a.dataSize(), 8); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -208,10 +200,6 @@ void BufferImageGLTest::constructBuffer() { BufferImage2D a{PixelStorage{}.setAlignment(1), PixelFormat::Red, PixelType::UnsignedByte, {1, 3}, std::move(buffer), sizeof(data)}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_VERIFY(!buffer.id()); @@ -222,8 +210,9 @@ void BufferImageGLTest::constructBuffer() { CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.dataSize(), 3); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -238,10 +227,6 @@ void BufferImageGLTest::constructBufferGeneric() { BufferImage2D a{PixelStorage{}.setAlignment(1), Magnum::PixelFormat::R8Unorm, {1, 3}, std::move(buffer), sizeof(data)}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_VERIFY(!buffer.id()); @@ -252,8 +237,9 @@ void BufferImageGLTest::constructBufferGeneric() { CORRADE_COMPARE(a.size(), Vector2i(1, 3)); CORRADE_COMPARE(a.dataSize(), 3); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -272,10 +258,6 @@ void BufferImageGLTest::constructBufferCompressed() { CompressedPixelFormat::RGBAS3tcDxt1, {4, 4}, std::move(buffer), sizeof(data)}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -287,8 +269,9 @@ void BufferImageGLTest::constructBufferCompressed() { CORRADE_COMPARE(a.size(), Vector2i(4, 4)); CORRADE_COMPARE(a.dataSize(), 8); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -307,10 +290,6 @@ void BufferImageGLTest::constructBufferCompressedGeneric() { Magnum::CompressedPixelFormat::Bc1RGBAUnorm, {4, 4}, std::move(buffer), sizeof(data)}; - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -322,8 +301,9 @@ void BufferImageGLTest::constructBufferCompressedGeneric() { CORRADE_COMPARE(a.size(), Vector2i(4, 4)); CORRADE_COMPARE(a.dataSize(), 8); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data), TestSuite::Compare::Container); #endif @@ -487,10 +467,6 @@ void BufferImageGLTest::setData() { const UnsignedShort data2[2*4] = { 1, 2, 3, 4, 5, 6, 7, 8 }; a.setData(PixelFormat::RGBA, PixelType::UnsignedShort, {1, 2}, data2, BufferUsage::StaticDraw); - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(a.storage().alignment(), 4); @@ -499,8 +475,9 @@ void BufferImageGLTest::setData() { CORRADE_COMPARE(a.size(), Vector2i(1, 2)); CORRADE_COMPARE(a.dataSize(), 16); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(Containers::arrayCast(imageData), Containers::arrayView(data2), TestSuite::Compare::Container); @@ -515,10 +492,6 @@ void BufferImageGLTest::setDataGeneric() { const UnsignedShort data2[2*4] = { 1, 2, 3, 4, 5, 6, 7, 8 }; a.setData(Magnum::PixelFormat::RGBA16Unorm, {1, 2}, data2, BufferUsage::StaticDraw); - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(a.storage().alignment(), 4); @@ -527,8 +500,9 @@ void BufferImageGLTest::setDataGeneric() { CORRADE_COMPARE(a.size(), Vector2i(1, 2)); CORRADE_COMPARE(a.dataSize(), 16); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(Containers::arrayCast(imageData), Containers::arrayView(data2), TestSuite::Compare::Container); @@ -546,10 +520,6 @@ void BufferImageGLTest::setDataCompressed() { #endif CompressedPixelFormat::RGBAS3tcDxt3, {8, 4}, data2, BufferUsage::StaticDraw); - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -559,8 +529,9 @@ void BufferImageGLTest::setDataCompressed() { CORRADE_COMPARE(a.size(), Vector2i(8, 4)); CORRADE_COMPARE(a.dataSize(), 16); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data2), TestSuite::Compare::Container); #endif @@ -577,10 +548,6 @@ void BufferImageGLTest::setDataCompressedGeneric() { #endif Magnum::CompressedPixelFormat::Bc2RGBAUnorm, {8, 4}, data2, BufferUsage::StaticDraw); - #ifndef MAGNUM_TARGET_GLES - const auto imageData = a.buffer().data(); - #endif - MAGNUM_VERIFY_NO_GL_ERROR(); #ifndef MAGNUM_TARGET_GLES @@ -590,8 +557,9 @@ void BufferImageGLTest::setDataCompressedGeneric() { CORRADE_COMPARE(a.size(), Vector2i(8, 4)); CORRADE_COMPARE(a.dataSize(), 16); - /** @todo How to verify the contents in ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 + const auto imageData = DebugTools::bufferData(a.buffer()); + MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE_AS(imageData, Containers::arrayView(data2), TestSuite::Compare::Container); #endif diff --git a/src/Magnum/GL/Test/CMakeLists.txt b/src/Magnum/GL/Test/CMakeLists.txt index 5f9a38711..651848fb5 100644 --- a/src/Magnum/GL/Test/CMakeLists.txt +++ b/src/Magnum/GL/Test/CMakeLists.txt @@ -75,9 +75,7 @@ if(BUILD_GL_TESTS) find_package(Corrade REQUIRED PluginManager) corrade_add_test(GLAbstractTextureGLTest AbstractTextureGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) - corrade_add_test(GLBufferGLTest BufferGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLCubeMapTextureGLTest CubeMapTextureGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) - corrade_add_test(GLFramebufferGLTest FramebufferGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) corrade_add_test(GLMeshGLTest MeshGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) corrade_add_test(GLRenderbufferGLTest RenderbufferGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTextureGLTest TextureGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) @@ -89,6 +87,16 @@ if(BUILD_GL_TESTS) ${GLAbstractShaderProgramGLTest_RES} LIBRARIES MagnumOpenGLTester) + corrade_add_test(GLBufferGLTest BufferGLTest.cpp LIBRARIES MagnumOpenGLTester) + if(NOT MAGNUM_TARGET_GLES2) + target_link_libraries(GLBufferGLTest PRIVATE MagnumDebugTools) + endif() + + corrade_add_test(GLFramebufferGLTest FramebufferGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) + if(NOT MAGNUM_TARGET_GLES2) + target_link_libraries(GLFramebufferGLTest PRIVATE MagnumDebugTools) + endif() + corrade_add_test(GLContextGLTest ContextGLTest.cpp LIBRARIES MagnumOpenGLTester) if(NOT CORRADE_TARGET_EMSCRIPTEN) set(THREADS_PREFER_PTHREAD_FLAG TRUE) @@ -162,10 +170,10 @@ if(BUILD_GL_TESTS) endif() if(NOT MAGNUM_TARGET_GLES2) - corrade_add_test(GLBufferImageGLTest BufferImageGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) + corrade_add_test(GLBufferImageGLTest BufferImageGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib MagnumDebugTools) corrade_add_test(GLPrimitiveQueryGLTest PrimitiveQueryGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTextureArrayGLTest TextureArrayGLTest.cpp LIBRARIES MagnumOpenGLTester) - corrade_add_test(GLTransformFeedbackGLTest TransformFeedbackGLTest.cpp LIBRARIES MagnumOpenGLTester) + corrade_add_test(GLTransformFeedbackGLTest TransformFeedbackGLTest.cpp LIBRARIES MagnumOpenGLTester MagnumDebugTools) endif() if(NOT MAGNUM_TARGET_GLES2 AND NOT MAGNUM_TARGET_WEBGL) diff --git a/src/Magnum/GL/Test/FramebufferGLTest.cpp b/src/Magnum/GL/Test/FramebufferGLTest.cpp index e8a48276a..14d24611a 100644 --- a/src/Magnum/GL/Test/FramebufferGLTest.cpp +++ b/src/Magnum/GL/Test/FramebufferGLTest.cpp @@ -58,6 +58,10 @@ #include "Magnum/GL/RectangleTexture.h" #endif +#ifndef MAGNUM_TARGET_GLES2 +#include "Magnum/DebugTools/BufferData.h" +#endif + namespace Magnum { namespace GL { namespace Test { namespace { struct FramebufferGLTest: OpenGLTester { @@ -1742,9 +1746,9 @@ void FramebufferGLTest::readBuffer() { CORRADE_COMPARE(colorImage.size(), Vector2i(8, 16)); MAGNUM_VERIFY_NO_GL_ERROR(); - /** @todo How to test this on ES? */ - #ifndef MAGNUM_TARGET_GLES - auto colorData = colorImage.buffer().data(); + + #ifndef MAGNUM_TARGET_GLES2 + auto colorData = DebugTools::bufferData(colorImage.buffer()); CORRADE_COMPARE(colorData.size(), (DataOffset + 8*16)*sizeof(Color4ub)); CORRADE_COMPARE(Containers::arrayCast(colorData)[DataOffset], Color4ub(128, 64, 32, 17)); #endif diff --git a/src/Magnum/GL/Test/TransformFeedbackGLTest.cpp b/src/Magnum/GL/Test/TransformFeedbackGLTest.cpp index 25a3b008f..ec2863e53 100644 --- a/src/Magnum/GL/Test/TransformFeedbackGLTest.cpp +++ b/src/Magnum/GL/Test/TransformFeedbackGLTest.cpp @@ -24,8 +24,11 @@ */ #include +#include #include +#include +#include "Magnum/DebugTools/BufferData.h" #include "Magnum/Image.h" #include "Magnum/GL/AbstractShaderProgram.h" #include "Magnum/GL/Buffer.h" @@ -307,14 +310,11 @@ void TransformFeedbackGLTest::attachBase() { MAGNUM_VERIFY_NO_GL_ERROR(); - #ifdef MAGNUM_TARGET_WEBGL - CORRADE_SKIP("Can't map buffers on WebGL."); - #else - auto data = Containers::arrayCast(output.mapRead(0, 2*sizeof(Vector2))); - CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f)); - CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f)); - output.unmap(); - #endif + auto data = DebugTools::bufferData(output); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data), + Containers::arrayView({{1.0f, -1.0f}, {0.0f, 0.0f}}), + TestSuite::Compare::Container); } void TransformFeedbackGLTest::attachRange() { @@ -354,14 +354,11 @@ void TransformFeedbackGLTest::attachRange() { MAGNUM_VERIFY_NO_GL_ERROR(); - #ifdef MAGNUM_TARGET_WEBGL - CORRADE_SKIP("Can't map buffers on WebGL."); - #else - auto data = Containers::arrayCast(output.mapRead(256, 2*sizeof(Vector2))); - CORRADE_COMPARE(data[0], Vector2(1.0f, -1.0f)); - CORRADE_COMPARE(data[1], Vector2(0.0f, 0.0f)); - output.unmap(); - #endif + auto data = DebugTools::bufferSubData(output, 256, 2*sizeof(Vector2)); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data), + Containers::arrayView({{1.0f, -1.0f}, {0.0f, 0.0f}}), + TestSuite::Compare::Container); } struct XfbMultiShader: AbstractShaderProgram { @@ -445,19 +442,17 @@ void TransformFeedbackGLTest::attachBases() { MAGNUM_VERIFY_NO_GL_ERROR(); - #ifdef MAGNUM_TARGET_WEBGL - CORRADE_SKIP("Can't map buffers on WebGL."); - #else - auto data1 = Containers::arrayCast(output1.mapRead(0, 2*sizeof(Vector2))); - CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f)); - CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f)); - output1.unmap(); - - auto data2 = Containers::arrayCast(output2.mapRead(0, 2*sizeof(Float))); - CORRADE_COMPARE(data2[0], 0.0f); - CORRADE_COMPARE(data2[1], -2.0f); - output2.unmap(); - #endif + auto data1 = DebugTools::bufferData(output1); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data1), + Containers::arrayView({{1.0f, -1.0f}, {0.0f, 0.0f}}), + TestSuite::Compare::Container); + + auto data2 = DebugTools::bufferData(output2); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data2), + Containers::arrayView({0.0f, -2.0f}), + TestSuite::Compare::Container); } void TransformFeedbackGLTest::attachRanges() { @@ -502,19 +497,17 @@ void TransformFeedbackGLTest::attachRanges() { MAGNUM_VERIFY_NO_GL_ERROR(); - #ifdef MAGNUM_TARGET_WEBGL - CORRADE_SKIP("Can't map buffers on WebGL."); - #else - auto data1 = Containers::arrayCast(output1.mapRead(256, 2*sizeof(Vector2))); - CORRADE_COMPARE(data1[0], Vector2(1.0f, -1.0f)); - CORRADE_COMPARE(data1[1], Vector2(0.0f, 0.0f)); - output1.unmap(); - - auto data2 = Containers::arrayCast(output2.mapRead(512, 2*sizeof(Float))); - CORRADE_COMPARE(data2[0], 0.0f); - CORRADE_COMPARE(data2[1], -2.0f); - output2.unmap(); - #endif + auto data1 = DebugTools::bufferSubData(output1, 256, 2*sizeof(Vector2)); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data1), + Containers::arrayView({{1.0f, -1.0f}, {0.0f, 0.0f}}), + TestSuite::Compare::Container); + + auto data2 = DebugTools::bufferSubData(output2, 512, 2*sizeof(Float)); + MAGNUM_VERIFY_NO_GL_ERROR(); + CORRADE_COMPARE_AS(Containers::arrayCast(data2), + Containers::arrayView({0.0f, -2.0f}), + TestSuite::Compare::Container); } #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Text/Test/CMakeLists.txt b/src/Magnum/Text/Test/CMakeLists.txt index 9aac7e331..cdf641aa8 100644 --- a/src/Magnum/Text/Test/CMakeLists.txt +++ b/src/Magnum/Text/Test/CMakeLists.txt @@ -53,4 +53,7 @@ if(TARGET_GL AND BUILD_GL_TESTS) corrade_add_test(TextDistanceFieldGlyphCacheGLTest DistanceFieldGlyphCacheGLTest.cpp LIBRARIES MagnumText MagnumOpenGLTester) corrade_add_test(TextGlyphCacheGLTest GlyphCacheGLTest.cpp LIBRARIES MagnumText MagnumOpenGLTester) corrade_add_test(TextRendererGLTest RendererGLTest.cpp LIBRARIES MagnumText MagnumOpenGLTester) + if(NOT MAGNUM_TARGET_GLES2) + target_link_libraries(TextRendererGLTest PRIVATE MagnumDebugTools) + endif() endif() diff --git a/src/Magnum/Text/Test/RendererGLTest.cpp b/src/Magnum/Text/Test/RendererGLTest.cpp index 276f3fbc2..1907d8fcd 100644 --- a/src/Magnum/Text/Test/RendererGLTest.cpp +++ b/src/Magnum/Text/Test/RendererGLTest.cpp @@ -32,6 +32,10 @@ #include "Magnum/Text/AbstractFont.h" #include "Magnum/Text/Renderer.h" +#ifndef MAGNUM_TARGET_GLES2 +#include "Magnum/DebugTools/BufferData.h" +#endif + namespace Magnum { namespace Text { namespace Test { namespace { struct RendererGLTest: GL::OpenGLTester { @@ -187,10 +191,9 @@ void RendererGLTest::renderMesh() { /* Bounds */ CORRADE_COMPARE(bounds, Range2D({0.0f, -0.5f}, {5.0f, 1.0f}).translated(offset)); - /** @todo How to verify this on ES? */ - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 /* Vertex buffer contents */ - Containers::Array vertices = vertexBuffer.data(); + Containers::Array vertices = DebugTools::bufferData(vertexBuffer); CORRADE_COMPARE_AS(Containers::arrayCast(vertices), Containers::arrayView({ 0.0f + offset.x(), 0.5f + offset.y(), 0.0f, 10.0f, @@ -208,8 +211,8 @@ void RendererGLTest::renderMesh() { 5.0f + offset.x(), 1.0f + offset.y(), 18.0f, 10.0f, 5.0f + offset.x(), -0.5f + offset.y(), 18.0f, 0.0f }), TestSuite::Compare::Container); - - Containers::Array indices = indexBuffer.data(); + /* Index buffer contents */ + Containers::Array indices = DebugTools::bufferData(indexBuffer); CORRADE_COMPARE_AS(Containers::arrayCast(indices), Containers::arrayView({ 0, 1, 2, 1, 3, 2, @@ -220,10 +223,11 @@ void RendererGLTest::renderMesh() { } void RendererGLTest::renderMeshIndexType() { - #ifndef MAGNUM_TARGET_GLES + #ifndef MAGNUM_TARGET_GLES2 TestFont font; GL::Mesh mesh{NoCreate}; - GL::Buffer vertexBuffer, indexBuffer; + GL::Buffer vertexBuffer{GL::Buffer::TargetHint::Array}; + GL::Buffer indexBuffer{GL::Buffer::TargetHint::ElementArray}; /* Sizes: four vertices per glyph, each vertex has 2D position and 2D texture coordinates, each float is four bytes; six indices per glyph. */ @@ -232,7 +236,7 @@ void RendererGLTest::renderMeshIndexType() { std::tie(mesh, std::ignore) = Text::Renderer3D::render(font, nullGlyphCache, 1.0f, std::string(64, 'a'), vertexBuffer, indexBuffer, GL::BufferUsage::StaticDraw); MAGNUM_VERIFY_NO_GL_ERROR(); - Containers::Array indicesByte = indexBuffer.data(); + Containers::Array indicesByte = DebugTools::bufferData(indexBuffer); CORRADE_COMPARE(vertexBuffer.size(), 256*(2 + 2)*4); CORRADE_COMPARE(indicesByte.size(), 64*6); CORRADE_COMPARE_AS(Containers::arrayCast(indicesByte).prefix(18), @@ -246,7 +250,7 @@ void RendererGLTest::renderMeshIndexType() { std::tie(mesh, std::ignore) = Text::Renderer3D::render(font, nullGlyphCache, 1.0f, std::string(65, 'a'), vertexBuffer, indexBuffer, GL::BufferUsage::StaticDraw); MAGNUM_VERIFY_NO_GL_ERROR(); - Containers::Array indicesShort = indexBuffer.data(); + Containers::Array indicesShort = DebugTools::bufferData(indexBuffer); CORRADE_COMPARE(vertexBuffer.size(), 260*(2 + 2)*4); CORRADE_COMPARE(indicesShort.size(), 65*6*2); CORRADE_COMPARE_AS(Containers::arrayCast(indicesShort).prefix(18), @@ -256,7 +260,7 @@ void RendererGLTest::renderMeshIndexType() { 8, 9, 10, 9, 11, 10 }), TestSuite::Compare::Container); #else - CORRADE_SKIP("Can't verify buffer contents on OpenGL ES."); + CORRADE_SKIP("Can't verify buffer contents on OpenGL ES 2.0."); #endif } @@ -280,9 +284,9 @@ void RendererGLTest::mutableText() { renderer.reserve(4, GL::BufferUsage::DynamicDraw, GL::BufferUsage::DynamicDraw); MAGNUM_VERIFY_NO_GL_ERROR(); CORRADE_COMPARE(renderer.capacity(), 4); - /** @todo How to verify this on ES? */ - #ifndef MAGNUM_TARGET_GLES - Containers::Array indices = renderer.indexBuffer().data(); + + #ifndef MAGNUM_TARGET_GLES2 + Containers::Array indices = DebugTools::bufferData(renderer.indexBuffer()); CORRADE_COMPARE_AS(Containers::arrayCast(indices).prefix(24), Containers::arrayView({ 0, 1, 2, 1, 3, 2, @@ -301,9 +305,8 @@ void RendererGLTest::mutableText() { /* Aligned to line/left, no offset needed */ - /** @todo How to verify this on ES? */ - #ifndef MAGNUM_TARGET_GLES - Containers::Array vertices = renderer.vertexBuffer().data(); + #ifndef MAGNUM_TARGET_GLES2 + Containers::Array vertices = DebugTools::bufferData(renderer.vertexBuffer()); CORRADE_COMPARE_AS(Containers::arrayCast(vertices).prefix(48), Containers::arrayView({ 0.0f, 0.5f, 0.0f, 10.0f, From e9acbdb677ad2905cd4ccad9a98a51b6dc5fc9da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 15 May 2022 15:47:48 +0200 Subject: [PATCH 2/2] GL,DebugTools: "fix" global symbol duplication between test libraries. If a GL test library would link to MagnumOpenGLTesterTestLib (which has CORRADE_GRACEFUL_ASSERT enabled to be able to verify assertions) and then to MagnumDebugTools for DebugTools::bufferData(), it'd mean there's one GL::Context global from MagnumGLTestLib and one from MagnumGL. Then, depending on whatever random order the linker uses, different parts of the library would see a different global, ultimately leading to a dreaded GL::Context::current(): no current context assertion. Right now this only manifested on the macOS static CI build, but depending on a phase of the moon could happen for any platform in any circumstance. First attempt was to switch to linking to MagnumDebugToolsTestLib and then making MagnumDebugToolsTestLib depend on MagnumGLTestLib instead of MagnumGL, HOWEVER because DebugTools also depend on Primitives and Shaders and whatnot for some features, it just moved the conflict between MagnumGL and MagnumGLTestLib elsewhere -- and ASan started loudly complaining about GL::defaultFramebuffer being duplicated. So instead there's now a dedicated subset of DebugTools just for the GL test themselves, containing currently just DebugTools::bufferData(), as nothing else is needed ATM. It may grow further when needed, such as with textureImage(), or CompareImage, etc. But of course that wouldn't be enough -- MagnumOpenGLTesterTestLib actually still links to MagnumGL for Other Reasons, meaning we have to pass it last to prefer symbols from MagnumGLTestLib which have graceful asserts enabled. Hopefully this works well enough, otherwise I'd have to figure out yet another variant of the fix. --- src/Magnum/DebugTools/CMakeLists.txt | 26 ++++++++++++++++++++++++++ src/Magnum/GL/Test/CMakeLists.txt | 21 ++++++++++++++++++--- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/Magnum/DebugTools/CMakeLists.txt b/src/Magnum/DebugTools/CMakeLists.txt index 2618fbab7..e369aa67a 100644 --- a/src/Magnum/DebugTools/CMakeLists.txt +++ b/src/Magnum/DebugTools/CMakeLists.txt @@ -181,6 +181,32 @@ if(BUILD_TESTS) endif() endif() + # A subset of DebugTools used by GL's own tests that link to + # MagnumGLTestLib (or MagnumOpenGLTesterTestLib), linking also to + # MagnumGLTestLibMagnumGL. We can't link those to MagnumDebugToolsTestLib + # because it depends on MagnumGL instead, which would lead to the + # GL::Context global to be duplicated, causing the dreaded + # + # GL::Context::current(): no current context + # + # assertion. We however also can't link MagnumDebugToolsTestLib to + # MagnumGLTestLib, because the other libraries it depends on (MeshTools, + # Shaders...) link to MagnumGL and so the same problem would just reappear + # elsewhere. + if(TARGET_GL AND BUILD_GL_TESTS AND NOT (MAGNUM_TARGET_WEBGL AND MAGNUM_TARGET_GLES2)) + add_library(MagnumDebugToolsGLTestLibSubset ${SHARED_OR_STATIC} + # Add more files if needed + BufferData.cpp + BufferData.h) + set_target_properties(MagnumDebugToolsGLTestLibSubset PROPERTIES DEBUG_POSTFIX "-d") + target_compile_definitions(MagnumDebugToolsGLTestLibSubset PRIVATE + "CORRADE_GRACEFUL_ASSERT" "MagnumDebugTools_EXPORTS") + if(BUILD_STATIC_PIC) + set_target_properties(MagnumDebugToolsGLTestLibSubset PROPERTIES POSITION_INDEPENDENT_CODE ON) + endif() + target_link_libraries(MagnumDebugToolsGLTestLibSubset PUBLIC Magnum MagnumGLTestLib) + endif() + add_subdirectory(Test) endif() diff --git a/src/Magnum/GL/Test/CMakeLists.txt b/src/Magnum/GL/Test/CMakeLists.txt index 651848fb5..a51ee2fda 100644 --- a/src/Magnum/GL/Test/CMakeLists.txt +++ b/src/Magnum/GL/Test/CMakeLists.txt @@ -92,9 +92,17 @@ if(BUILD_GL_TESTS) target_link_libraries(GLBufferGLTest PRIVATE MagnumDebugTools) endif() - corrade_add_test(GLFramebufferGLTest FramebufferGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib) + corrade_add_test(GLFramebufferGLTest FramebufferGLTest.cpp) + # See DebugTools/CMakeLists.txt for details about + # MagnumDebugToolsGLTestLibSubset. It also has to be before + # MagnumOpenGLTesterTestLib to pick GL symbols with CORRADE_GRACEFUL_ASSERT + # over ones without... because MagnumOpenGLTesterTestLib is actually + # linking to MagnumGL on Linux and macOS. + # TODO fix MagnumOpenGLTesterTestLib to link to MagnumGLTestLib always if(NOT MAGNUM_TARGET_GLES2) - target_link_libraries(GLFramebufferGLTest PRIVATE MagnumDebugTools) + target_link_libraries(GLFramebufferGLTest PRIVATE MagnumDebugToolsGLTestLibSubset MagnumOpenGLTesterTestLib) + else() + target_link_libraries(GLFramebufferGLTest PRIVATE MagnumOpenGLTesterTestLib) endif() corrade_add_test(GLContextGLTest ContextGLTest.cpp LIBRARIES MagnumOpenGLTester) @@ -170,7 +178,14 @@ if(BUILD_GL_TESTS) endif() if(NOT MAGNUM_TARGET_GLES2) - corrade_add_test(GLBufferImageGLTest BufferImageGLTest.cpp LIBRARIES MagnumOpenGLTesterTestLib MagnumDebugTools) + # See DebugTools/CMakeLists.txt for details about + # MagnumDebugToolsGLTestLibSubset. It also has to be before + # MagnumOpenGLTesterTestLib to pick GL symbols with + # CORRADE_GRACEFUL_ASSERT over ones without... because + # MagnumOpenGLTesterTestLib is actually linking to MagnumGL on Linux + # and macOS. + # TODO fix MagnumOpenGLTesterTestLib to link to MagnumGLTestLib always + corrade_add_test(GLBufferImageGLTest BufferImageGLTest.cpp LIBRARIES MagnumDebugToolsGLTestLibSubset MagnumOpenGLTesterTestLib) corrade_add_test(GLPrimitiveQueryGLTest PrimitiveQueryGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTextureArrayGLTest TextureArrayGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTransformFeedbackGLTest TransformFeedbackGLTest.cpp LIBRARIES MagnumOpenGLTester MagnumDebugTools)