diff --git a/src/Magnum/Implementation/MeshState.cpp b/src/Magnum/Implementation/MeshState.cpp index 03977de2a..e2e595c91 100644 --- a/src/Magnum/Implementation/MeshState.cpp +++ b/src/Magnum/Implementation/MeshState.cpp @@ -96,6 +96,14 @@ MeshState::MeshState(Context& context, std::vector& extensions): cu } #endif + #ifndef MAGNUM_TARGET_GLES + /* DSA create implementation (other cases handled above) */ + if(context.isExtensionSupported()) { + extensions.push_back(Extensions::GL::ARB::direct_state_access::string()); + createImplementation = &Mesh::createImplementationVAODSA; + } + #endif + #ifdef MAGNUM_TARGET_GLES /* Multi draw implementation on ES */ if(context.isExtensionSupported()) { diff --git a/src/Magnum/Mesh.cpp b/src/Magnum/Mesh.cpp index c55e01ec6..ceb4cb7f6 100644 --- a/src/Magnum/Mesh.cpp +++ b/src/Magnum/Mesh.cpp @@ -335,7 +335,6 @@ void Mesh::createImplementationDefault() { } void Mesh::createImplementationVAO() { - _created = false; #ifndef MAGNUM_TARGET_GLES2 glGenVertexArrays(1, &_id); #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) @@ -343,9 +342,17 @@ void Mesh::createImplementationVAO() { #else CORRADE_ASSERT_UNREACHABLE(); #endif + _created = false; CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding); } +#ifndef MAGNUM_TARGET_GLES +void Mesh::createImplementationVAODSA() { + glCreateVertexArrays(1, &_id); + _created = true; +} +#endif + void Mesh::destroyImplementationDefault() {} void Mesh::destroyImplementationVAO() { diff --git a/src/Magnum/Mesh.h b/src/Magnum/Mesh.h index 072cd654c..fbae5fe19 100644 --- a/src/Magnum/Mesh.h +++ b/src/Magnum/Mesh.h @@ -424,8 +424,11 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * * If @extension{ARB,vertex_array_object} (part of OpenGL 3.0), OpenGL * ES 3.0 or @es_extension{OES,vertex_array_object} in OpenGL ES 2.0 is - * available, vertex array object is created. - * @see @ref setPrimitive(), @ref setCount(), @fn_gl{GenVertexArrays} + * available, vertex array object is created. If @extension{ARB,direct_state_access} + * (part of OpenGL 4.5) is not supported, the vertex array object is + * created on first use. + * @see @ref setPrimitive(), @ref setCount(), @fn_gl{CreateVertexArrays}, + * eventually @fn_gl{GenVertexArrays} */ explicit Mesh(MeshPrimitive primitive = MeshPrimitive::Triangles); @@ -440,7 +443,7 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { * * If @extension{ARB,vertex_array_object} (part of OpenGL 3.0), OpenGL * ES 3.0 or @es_extension{OES,vertex_array_object} in OpenGL ES 2.0 is - * available, vertex array object is deleted. + * available, associated vertex array object is deleted. * @see @fn_gl{DeleteVertexArrays} */ ~Mesh(); @@ -954,6 +957,9 @@ class MAGNUM_EXPORT Mesh: public AbstractObject { void MAGNUM_LOCAL createImplementationDefault(); void MAGNUM_LOCAL createImplementationVAO(); + #ifndef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL createImplementationVAODSA(); + #endif void MAGNUM_LOCAL destroyImplementationDefault(); void MAGNUM_LOCAL destroyImplementationVAO();