Browse Source

ARB_direct_state_access support for creating renderbuffers.

pull/69/head
Vladimír Vondruš 12 years ago
parent
commit
8aeb85875d
  1. 2
      src/Magnum/Implementation/FramebufferState.cpp
  2. 1
      src/Magnum/Implementation/FramebufferState.h
  3. 16
      src/Magnum/Renderbuffer.cpp
  4. 13
      src/Magnum/Renderbuffer.h

2
src/Magnum/Implementation/FramebufferState.cpp

@ -43,11 +43,13 @@ FramebufferState::FramebufferState(Context& context, std::vector<std::string>& e
if(context.isExtensionSupported<Extensions::GL::ARB::direct_state_access>()) {
extensions.push_back(Extensions::GL::ARB::direct_state_access::string());
createImplementation = &Framebuffer::createImplementationDSA;
createRenderbufferImplementation = &Renderbuffer::createImplementationDSA;
} else
#endif
{
createImplementation = &Framebuffer::createImplementationDefault;
createRenderbufferImplementation = &Renderbuffer::createImplementationDefault;
}
/* DSA/non-DSA implementation */

1
src/Magnum/Implementation/FramebufferState.h

@ -57,6 +57,7 @@ struct FramebufferState {
void(Framebuffer::*texture2DImplementation)(Framebuffer::BufferAttachment, GLenum, GLuint, GLint);
void(Framebuffer::*textureLayerImplementation)(Framebuffer::BufferAttachment, GLuint, GLint, GLint);
void(Renderbuffer::*createRenderbufferImplementation)();
void(Renderbuffer::*renderbufferStorageImplementation)(RenderbufferFormat, const Vector2i&);
void(Renderbuffer::*renderbufferStorageMultisampleImplementation)(GLsizei, RenderbufferFormat, const Vector2i&);

16
src/Magnum/Renderbuffer.cpp

@ -64,7 +64,21 @@ Int Renderbuffer::maxSamples() {
return value;
}
Renderbuffer::Renderbuffer(): _created{false} { glGenRenderbuffers(1, &_id); }
Renderbuffer::Renderbuffer() {
(this->*Context::current()->state().framebuffer->createRenderbufferImplementation)();
}
void Renderbuffer::createImplementationDefault() {
glGenRenderbuffers(1, &_id);
_created = false;
}
#ifndef MAGNUM_TARGET_GLES
void Renderbuffer::createImplementationDSA() {
glCreateRenderbuffers(1, &_id);
_created = true;
}
#endif
Renderbuffer::~Renderbuffer() {
/* Moved out, nothing to do */

13
src/Magnum/Renderbuffer.h

@ -85,8 +85,10 @@ class MAGNUM_EXPORT Renderbuffer: public AbstractObject {
/**
* @brief Constructor
*
* Generates new OpenGL renderbuffer.
* @see @fn_gl{GenRenderbuffers}
* Generates new OpenGL renderbuffer object. If @extension{ARB,direct_state_access}
* (part of OpenGL 4.5) is not supported, the renderbuffer is created
* on first use.
* @see @fn_gl{CreateRenderbuffers}, eventually @fn_gl{GenRenderbuffers}
*/
explicit Renderbuffer();
@ -99,7 +101,7 @@ class MAGNUM_EXPORT Renderbuffer: public AbstractObject {
/**
* @brief Destructor
*
* Deletes associated OpenGL renderbuffer.
* Deletes associated OpenGL renderbuffer object.
* @see @fn_gl{DeleteRenderbuffers}
*/
~Renderbuffer();
@ -178,6 +180,11 @@ class MAGNUM_EXPORT Renderbuffer: public AbstractObject {
void setStorageMultisample(Int samples, RenderbufferFormat internalFormat, const Vector2i& size);
private:
void MAGNUM_LOCAL createImplementationDefault();
#ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL createImplementationDSA();
#endif
void MAGNUM_LOCAL createIfNotAlready();
Renderbuffer& setLabelInternal(Containers::ArrayReference<const char> label);

Loading…
Cancel
Save