diff --git a/src/Magnum/Test/MeshGLTest.cpp b/src/Magnum/Test/MeshGLTest.cpp index c82cfe9f5..c998fc0a2 100644 --- a/src/Magnum/Test/MeshGLTest.cpp +++ b/src/Magnum/Test/MeshGLTest.cpp @@ -111,6 +111,8 @@ struct MeshGLTest: OpenGLTester { void setIndexBufferRange(); void setIndexBufferUnsignedInt(); + void unbindVAOWhenSettingIndexBufferData(); + #ifndef MAGNUM_TARGET_GLES void setBaseVertex(); #endif @@ -202,6 +204,8 @@ MeshGLTest::MeshGLTest() { &MeshGLTest::setIndexBufferRange, &MeshGLTest::setIndexBufferUnsignedInt, + &MeshGLTest::unbindVAOWhenSettingIndexBufferData, + #ifndef MAGNUM_TARGET_GLES &MeshGLTest::setBaseVertex, #endif @@ -1454,6 +1458,50 @@ void MeshGLTest::setIndexBufferUnsignedInt() { CORRADE_COMPARE(value, indexedResult); } +void MeshGLTest::unbindVAOWhenSettingIndexBufferData() { + #ifndef MAGNUM_TARGET_GLES + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::vertex_array_object::string() + std::string(" is not available.")); + if(Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::ARB::direct_state_access::string() + std::string(" is active with circumvents the issue tested here.")); + if(Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::EXT::direct_state_access::string() + std::string(" is active with circumvents the issue tested here.")); + #elif defined(MAGNUM_TARGET_GLES2) + if(!Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::GL::OES::vertex_array_object::string() + std::string(" is not available.")); + #endif + + typedef Attribute<0, Float> Attribute; + + const Float data[] = { -0.7f, Math::unpack(92), Math::unpack(32) }; + Buffer buffer{Buffer::TargetHint::Array}; + buffer.setData(data, BufferUsage::StaticDraw); + + Buffer indices{Buffer::TargetHint::ElementArray}; + indices.setData(std::vector{5, 0}, BufferUsage::StaticDraw); + + Mesh mesh; + mesh.addVertexBuffer(buffer, 4, Attribute{}) + .setIndexBuffer(indices, 0, Mesh::IndexType::UnsignedByte); + + /* This buffer should have no effect on the mesh above */ + Buffer otherIndices{Buffer::TargetHint::ElementArray}; + otherIndices.setData(std::vector{100, 1}, BufferUsage::StaticDraw); + + MAGNUM_VERIFY_NO_ERROR(); + + const auto value = Checker(FloatShader("float", "vec4(valueInterpolated, 0.0, 0.0, 0.0)"), + #ifndef MAGNUM_TARGET_GLES2 + RenderbufferFormat::RGBA8, + #else + RenderbufferFormat::RGBA4, + #endif + mesh).get(PixelFormat::RGBA, PixelType::UnsignedByte); + + MAGNUM_VERIFY_NO_ERROR(); + CORRADE_COMPARE(value, 92); +} + #ifndef MAGNUM_TARGET_GLES void MeshGLTest::setBaseVertex() { if(!Context::current().isExtensionSupported())