Browse Source

GL: assert that addVertexBuffer() is called with a valid Buffer.

pull/255/head
Vladimír Vondruš 8 years ago
parent
commit
16558c8877
  1. 4
      src/Magnum/GL/Mesh.cpp
  2. 2
      src/Magnum/GL/Test/CMakeLists.txt
  3. 34
      src/Magnum/GL/Test/MeshGLTest.cpp

4
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) { 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 #ifdef MAGNUM_TARGET_WEBGL
CORRADE_ASSERT(buffer.targetHint() == Buffer::TargetHint::ElementArray, 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); "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) { 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); (this->*Context::current().state().mesh->attributePointerImplementation)(attribute);
} }

2
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(GLContextGLTest ContextGLTest.cpp LIBRARIES MagnumOpenGLTester)
corrade_add_test(GLCubeMapTextureGLTest CubeMapTextureGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLCubeMapTextureGLTest CubeMapTextureGLTest.cpp LIBRARIES MagnumOpenGLTester)
corrade_add_test(GLFramebufferGLTest FramebufferGLTest.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(GLRenderbufferGLTest RenderbufferGLTest.cpp LIBRARIES MagnumOpenGLTester)
corrade_add_test(GLTextureGLTest TextureGLTest.cpp LIBRARIES MagnumOpenGLTester) corrade_add_test(GLTextureGLTest TextureGLTest.cpp LIBRARIES MagnumOpenGLTester)

34
src/Magnum/GL/Test/MeshGLTest.cpp

@ -23,6 +23,8 @@
DEALINGS IN THE SOFTWARE. DEALINGS IN THE SOFTWARE.
*/ */
#include <sstream>
#include "Magnum/Image.h" #include "Magnum/Image.h"
#include "Magnum/Mesh.h" #include "Magnum/Mesh.h"
#include "Magnum/GL/AbstractShaderProgram.h" #include "Magnum/GL/AbstractShaderProgram.h"
@ -115,10 +117,14 @@ struct MeshGLTest: OpenGLTester {
void addVertexBufferMultiple(); void addVertexBufferMultiple();
void addVertexBufferMultipleGaps(); void addVertexBufferMultipleGaps();
void addVertexBufferMovedOutInstance();
template<class T> void setIndexBuffer(); template<class T> void setIndexBuffer();
template<class T> void setIndexBufferRange(); template<class T> void setIndexBufferRange();
void setIndexBufferUnsignedInt(); void setIndexBufferUnsignedInt();
void setIndexBufferMovedOutInstance();
void unbindVAOWhenSettingIndexBufferData(); void unbindVAOWhenSettingIndexBufferData();
void unbindVAOBeforeEnteringExternalSection(); void unbindVAOBeforeEnteringExternalSection();
@ -220,12 +226,16 @@ MeshGLTest::MeshGLTest() {
addTests({&MeshGLTest::addVertexBufferMultiple, addTests({&MeshGLTest::addVertexBufferMultiple,
&MeshGLTest::addVertexBufferMultipleGaps, &MeshGLTest::addVertexBufferMultipleGaps,
&MeshGLTest::addVertexBufferMovedOutInstance,
&MeshGLTest::setIndexBuffer<GL::MeshIndexType>, &MeshGLTest::setIndexBuffer<GL::MeshIndexType>,
&MeshGLTest::setIndexBuffer<Magnum::MeshIndexType>, &MeshGLTest::setIndexBuffer<Magnum::MeshIndexType>,
&MeshGLTest::setIndexBufferRange<GL::MeshIndexType>, &MeshGLTest::setIndexBufferRange<GL::MeshIndexType>,
&MeshGLTest::setIndexBufferRange<Magnum::MeshIndexType>, &MeshGLTest::setIndexBufferRange<Magnum::MeshIndexType>,
&MeshGLTest::setIndexBufferUnsignedInt, &MeshGLTest::setIndexBufferUnsignedInt,
&MeshGLTest::setIndexBufferMovedOutInstance,
&MeshGLTest::unbindVAOWhenSettingIndexBufferData, &MeshGLTest::unbindVAOWhenSettingIndexBufferData,
&MeshGLTest::unbindVAOBeforeEnteringExternalSection, &MeshGLTest::unbindVAOBeforeEnteringExternalSection,
@ -1641,6 +1651,18 @@ void MeshGLTest::addVertexBufferMultipleGaps() {
CORRADE_COMPARE(value, Color4ub(64 + 15 + 97, 17 + 164 + 28, 56 + 17, 255)); 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 { namespace {
const Float indexedVertexData[] = { const Float indexedVertexData[] = {
0.0f, /* Offset */ 0.0f, /* Offset */
@ -1795,6 +1817,18 @@ void MeshGLTest::setIndexBufferUnsignedInt() {
CORRADE_COMPARE(value, indexedResult); 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() { void MeshGLTest::unbindVAOWhenSettingIndexBufferData() {
#ifndef MAGNUM_TARGET_GLES #ifndef MAGNUM_TARGET_GLES
if(!Context::current().isExtensionSupported<Extensions::ARB::vertex_array_object>()) if(!Context::current().isExtensionSupported<Extensions::ARB::vertex_array_object>())

Loading…
Cancel
Save