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 #endif
Buffer::Buffer(const TargetHint targetHint): _targetHint{targetHint}, Buffer::Buffer(const TargetHint targetHint): _targetHint{targetHint}
#ifdef CORRADE_TARGET_NACL #ifdef CORRADE_TARGET_NACL
_mappedBuffer{nullptr}, , _mappedBuffer{nullptr}
#endif #endif
_created{false}
{ {
glGenBuffers(1, &_id); (this->*Context::current()->state().buffer->createImplementation)();
CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding); 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() { Buffer::~Buffer() {
/* Moved out, nothing to do */ /* Moved out, nothing to do */
if(!_id) return; 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 * @param targetHint Target hint, see @ref setTargetHint() for more
* information * information
* *
* Creates new OpenGL buffer. * Creates new OpenGL buffer object. If @extension{ARB,direct_state_access}
* @see @fn_gl{GenBuffers} * (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); explicit Buffer(TargetHint targetHint = TargetHint::Array);
@ -784,7 +786,7 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
/** /**
* @brief Destructor * @brief Destructor
* *
* Deletes associated OpenGL buffer. * Deletes associated OpenGL buffer object.
* @see @fn_gl{DeleteBuffers} * @see @fn_gl{DeleteBuffers}
*/ */
~Buffer(); ~Buffer();
@ -1175,6 +1177,11 @@ class MAGNUM_EXPORT Buffer: public AbstractObject {
#endif #endif
#endif #endif
void MAGNUM_LOCAL createImplementationDefault();
#ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL createImplementationDSA();
#endif
void MAGNUM_LOCAL createIfNotAlready(); void MAGNUM_LOCAL createIfNotAlready();
Buffer& setLabelInternal(Containers::ArrayReference<const char> label); 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} , maxAtomicCounterBindings{0}, maxShaderStorageBindings{0}, shaderStorageOffsetAlignment{0}, uniformOffsetAlignment{0}, maxUniformBindings{0}
#endif #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 #ifndef MAGNUM_TARGET_GLES
if(context.isExtensionSupported<Extensions::GL::EXT::direct_state_access>()) { if(context.isExtensionSupported<Extensions::GL::EXT::direct_state_access>()) {
extensions.push_back(Extensions::GL::EXT::direct_state_access::string()); 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(*bindRangesImplementation)(Buffer::Target, UnsignedInt, Containers::ArrayReference<const std::tuple<Buffer*, GLintptr, GLsizeiptr>>);
void(*copyImplementation)(Buffer&, Buffer&, GLintptr, GLintptr, GLsizeiptr); void(*copyImplementation)(Buffer&, Buffer&, GLintptr, GLintptr, GLsizeiptr);
#endif #endif
void(Buffer::*createImplementation)();
void(Buffer::*getParameterImplementation)(GLenum, GLint*); void(Buffer::*getParameterImplementation)(GLenum, GLint*);
#ifndef MAGNUM_TARGET_GLES2 #ifndef MAGNUM_TARGET_GLES2
void(Buffer::*getSubDataImplementation)(GLintptr, GLsizeiptr, GLvoid*); void(Buffer::*getSubDataImplementation)(GLintptr, GLsizeiptr, GLvoid*);

Loading…
Cancel
Save