From 16558c887768f2c5500e8565df053b58f8dc91f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sun, 3 Jun 2018 21:38:00 +0200 Subject: [PATCH] GL: assert that addVertexBuffer() is called with a valid Buffer. --- src/Magnum/GL/Mesh.cpp | 4 ++++ src/Magnum/GL/Test/CMakeLists.txt | 2 +- src/Magnum/GL/Test/MeshGLTest.cpp | 34 +++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Magnum/GL/Mesh.cpp b/src/Magnum/GL/Mesh.cpp index 57d4712e9..0b8cf8291 100644 --- a/src/Magnum/GL/Mesh.cpp +++ b/src/Magnum/GL/Mesh.cpp @@ -338,6 +338,8 @@ Mesh& Mesh::addVertexBufferInstanced(Buffer& buffer, const UnsignedInt divisor, } Mesh& Mesh::setIndexBuffer(Buffer& buffer, GLintptr offset, MeshIndexType type, UnsignedInt start, UnsignedInt end) { + CORRADE_ASSERT(buffer.id(), + "GL::Mesh::setIndexBuffer(): empty or moved-out Buffer instance was passed", *this); #ifdef MAGNUM_TARGET_WEBGL CORRADE_ASSERT(buffer.targetHint() == Buffer::TargetHint::ElementArray, "GL::Mesh::setIndexBuffer(): the buffer has unexpected target hint, expected" << Buffer::TargetHint::ElementArray << "but got" << buffer.targetHint(), *this); @@ -595,6 +597,8 @@ void Mesh::attributePointerInternal(const Buffer& buffer, const GLuint location, } void Mesh::attributePointerInternal(AttributeLayout& attribute) { + CORRADE_ASSERT(attribute.buffer.id(), + "GL::Mesh::addVertexBuffer(): empty or moved-out Buffer instance was passed", ); (this->*Context::current().state().mesh->attributePointerImplementation)(attribute); } diff --git a/src/Magnum/GL/Test/CMakeLists.txt b/src/Magnum/GL/Test/CMakeLists.txt index 4e6264676..9052250a6 100644 --- a/src/Magnum/GL/Test/CMakeLists.txt +++ b/src/Magnum/GL/Test/CMakeLists.txt @@ -109,7 +109,7 @@ if(BUILD_GL_TESTS) corrade_add_test(GLContextGLTest ContextGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLCubeMapTextureGLTest CubeMapTextureGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLFramebufferGLTest FramebufferGLTest.cpp LIBRARIES MagnumOpenGLTester) - corrade_add_test(GLMeshGLTest MeshGLTest.cpp LIBRARIES MagnumOpenGLTester) + corrade_add_test(GLMeshGLTest MeshGLTest.cpp LIBRARIES MagnumGLTestLib MagnumOpenGLTester) corrade_add_test(GLRenderbufferGLTest RenderbufferGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTextureGLTest TextureGLTest.cpp LIBRARIES MagnumOpenGLTester) diff --git a/src/Magnum/GL/Test/MeshGLTest.cpp b/src/Magnum/GL/Test/MeshGLTest.cpp index d3edb7e48..e098a3004 100644 --- a/src/Magnum/GL/Test/MeshGLTest.cpp +++ b/src/Magnum/GL/Test/MeshGLTest.cpp @@ -23,6 +23,8 @@ DEALINGS IN THE SOFTWARE. */ +#include + #include "Magnum/Image.h" #include "Magnum/Mesh.h" #include "Magnum/GL/AbstractShaderProgram.h" @@ -115,10 +117,14 @@ struct MeshGLTest: OpenGLTester { void addVertexBufferMultiple(); void addVertexBufferMultipleGaps(); + void addVertexBufferMovedOutInstance(); + template void setIndexBuffer(); template void setIndexBufferRange(); void setIndexBufferUnsignedInt(); + void setIndexBufferMovedOutInstance(); + void unbindVAOWhenSettingIndexBufferData(); void unbindVAOBeforeEnteringExternalSection(); @@ -220,12 +226,16 @@ MeshGLTest::MeshGLTest() { addTests({&MeshGLTest::addVertexBufferMultiple, &MeshGLTest::addVertexBufferMultipleGaps, + &MeshGLTest::addVertexBufferMovedOutInstance, + &MeshGLTest::setIndexBuffer, &MeshGLTest::setIndexBuffer, &MeshGLTest::setIndexBufferRange, &MeshGLTest::setIndexBufferRange, &MeshGLTest::setIndexBufferUnsignedInt, + &MeshGLTest::setIndexBufferMovedOutInstance, + &MeshGLTest::unbindVAOWhenSettingIndexBufferData, &MeshGLTest::unbindVAOBeforeEnteringExternalSection, @@ -1641,6 +1651,18 @@ void MeshGLTest::addVertexBufferMultipleGaps() { CORRADE_COMPARE(value, Color4ub(64 + 15 + 97, 17 + 164 + 28, 56 + 17, 255)); } +void MeshGLTest::addVertexBufferMovedOutInstance() { + Buffer buffer{NoCreate}; + Mesh mesh; + + std::ostringstream out; + Error redirectError{&out}; + + mesh.addVertexBuffer(buffer, 0, Attribute<0, Float>{}); + + CORRADE_COMPARE(out.str(), "GL::Mesh::addVertexBuffer(): empty or moved-out Buffer instance was passed\n"); +} + namespace { const Float indexedVertexData[] = { 0.0f, /* Offset */ @@ -1795,6 +1817,18 @@ void MeshGLTest::setIndexBufferUnsignedInt() { CORRADE_COMPARE(value, indexedResult); } +void MeshGLTest::setIndexBufferMovedOutInstance() { + Buffer buffer{NoCreate}; + Mesh mesh; + + std::ostringstream out; + Error redirectError{&out}; + + mesh.setIndexBuffer(buffer, 0, MeshIndexType::UnsignedByte); + + CORRADE_COMPARE(out.str(), "GL::Mesh::setIndexBuffer(): empty or moved-out Buffer instance was passed\n"); +} + void MeshGLTest::unbindVAOWhenSettingIndexBufferData() { #ifndef MAGNUM_TARGET_GLES if(!Context::current().isExtensionSupported())