diff --git a/src/Magnum/Buffer.cpp b/src/Magnum/Buffer.cpp index 5670a5714..c992b72b4 100644 --- a/src/Magnum/Buffer.cpp +++ b/src/Magnum/Buffer.cpp @@ -162,16 +162,27 @@ void Buffer::copy(Buffer& read, Buffer& write, const GLintptr readOffset, const } #endif -Buffer::Buffer(const TargetHint targetHint): _targetHint{targetHint}, +Buffer::Buffer(const TargetHint targetHint): _targetHint{targetHint} #ifdef CORRADE_TARGET_NACL - _mappedBuffer{nullptr}, + , _mappedBuffer{nullptr} #endif - _created{false} { - glGenBuffers(1, &_id); + (this->*Context::current()->state().buffer->createImplementation)(); CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding); } +void Buffer::createImplementationDefault() { + glGenBuffers(1, &_id); + _created = false; +} + +#ifndef MAGNUM_TARGET_GLES +void Buffer::createImplementationDSA() { + glCreateBuffers(1, &_id); + _created = true; +} +#endif + Buffer::~Buffer() { /* Moved out, nothing to do */ if(!_id) return; diff --git a/src/Magnum/Buffer.h b/src/Magnum/Buffer.h index 3f4927cba..060a6778e 100644 --- a/src/Magnum/Buffer.h +++ b/src/Magnum/Buffer.h @@ -761,8 +761,10 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { * @param targetHint Target hint, see @ref setTargetHint() for more * information * - * Creates new OpenGL buffer. - * @see @fn_gl{GenBuffers} + * Creates new OpenGL buffer object. If @extension{ARB,direct_state_access} + * (part of OpenGL 4.5) is not supported, the buffer is created on + * first use. + * @see @fn_gl{CreateBuffers}, eventually @fn_gl{GenBuffers} */ explicit Buffer(TargetHint targetHint = TargetHint::Array); @@ -784,7 +786,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { /** * @brief Destructor * - * Deletes associated OpenGL buffer. + * Deletes associated OpenGL buffer object. * @see @fn_gl{DeleteBuffers} */ ~Buffer(); @@ -1175,6 +1177,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject { #endif #endif + void MAGNUM_LOCAL createImplementationDefault(); + #ifndef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL createImplementationDSA(); + #endif + void MAGNUM_LOCAL createIfNotAlready(); Buffer& setLabelInternal(Containers::ArrayReference label); diff --git a/src/Magnum/Implementation/BufferState.cpp b/src/Magnum/Implementation/BufferState.cpp index 42102971e..3e4114f00 100644 --- a/src/Magnum/Implementation/BufferState.cpp +++ b/src/Magnum/Implementation/BufferState.cpp @@ -86,6 +86,18 @@ BufferState::BufferState(Context& context, std::vector& extensions) , maxAtomicCounterBindings{0}, maxShaderStorageBindings{0}, shaderStorageOffsetAlignment{0}, uniformOffsetAlignment{0}, maxUniformBindings{0} #endif { + /* Create implementation */ + #ifndef MAGNUM_TARGET_GLES + if(context.isExtensionSupported()) { + extensions.push_back(Extensions::GL::ARB::direct_state_access::string()); + createImplementation = &Buffer::createImplementationDSA; + + } else + #endif + { + createImplementation = &Buffer::createImplementationDefault; + } + #ifndef MAGNUM_TARGET_GLES if(context.isExtensionSupported()) { extensions.push_back(Extensions::GL::EXT::direct_state_access::string()); diff --git a/src/Magnum/Implementation/BufferState.h b/src/Magnum/Implementation/BufferState.h index 41a8dc908..29eaabec0 100644 --- a/src/Magnum/Implementation/BufferState.h +++ b/src/Magnum/Implementation/BufferState.h @@ -51,6 +51,7 @@ struct BufferState { void(*bindRangesImplementation)(Buffer::Target, UnsignedInt, Containers::ArrayReference>); void(*copyImplementation)(Buffer&, Buffer&, GLintptr, GLintptr, GLsizeiptr); #endif + void(Buffer::*createImplementation)(); void(Buffer::*getParameterImplementation)(GLenum, GLint*); #ifndef MAGNUM_TARGET_GLES2 void(Buffer::*getSubDataImplementation)(GLintptr, GLsizeiptr, GLvoid*);