Browse Source

ARB_direct_state_access support for creating buffers.

pull/69/head
Vladimír Vondruš 12 years ago
parent
commit
db5b17938b
  1. 19
      src/Magnum/Buffer.cpp
  2. 13
      src/Magnum/Buffer.h
  3. 12
      src/Magnum/Implementation/BufferState.cpp
  4. 1
      src/Magnum/Implementation/BufferState.h

19
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;

13
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<const char> label);

12
src/Magnum/Implementation/BufferState.cpp

@ -86,6 +86,18 @@ BufferState::BufferState(Context& context, std::vector<std::string>& extensions)
, maxAtomicCounterBindings{0}, maxShaderStorageBindings{0}, shaderStorageOffsetAlignment{0}, uniformOffsetAlignment{0}, maxUniformBindings{0}
#endif
{
/* Create implementation */
#ifndef MAGNUM_TARGET_GLES
if(context.isExtensionSupported<Extensions::GL::ARB::direct_state_access>()) {
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::GL::EXT::direct_state_access>()) {
extensions.push_back(Extensions::GL::EXT::direct_state_access::string());

1
src/Magnum/Implementation/BufferState.h

@ -51,6 +51,7 @@ struct BufferState {
void(*bindRangesImplementation)(Buffer::Target, UnsignedInt, Containers::ArrayReference<const std::tuple<Buffer*, GLintptr, GLsizeiptr>>);
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*);

Loading…
Cancel
Save