Browse Source

ARB_direct_state_access support for creating framebuffers.

pull/69/head
Vladimír Vondruš 12 years ago
parent
commit
9f041b5d5b
  1. 14
      src/Magnum/Framebuffer.cpp
  2. 14
      src/Magnum/Framebuffer.h
  3. 12
      src/Magnum/Implementation/FramebufferState.cpp
  4. 1
      src/Magnum/Implementation/FramebufferState.h

14
src/Magnum/Framebuffer.cpp

@ -81,12 +81,22 @@ Int Framebuffer::maxColorAttachments() {
Framebuffer::Framebuffer(const Range2Di& viewport) {
_viewport = viewport;
_created = false;
(this->*Context::current()->state().framebuffer->createImplementation)();
CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding);
}
void Framebuffer::createImplementationDefault() {
glGenFramebuffers(1, &_id);
CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding);
_created = false;
}
#ifndef MAGNUM_TARGET_GLES
void Framebuffer::createImplementationDSA() {
glCreateFramebuffers(1, &_id);
_created = true;
}
#endif
Framebuffer::~Framebuffer() {
/* Moved out, nothing to do */
if(!_id) return;

14
src/Magnum/Framebuffer.h

@ -302,8 +302,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
/**
* @brief Constructor
*
* Generates new OpenGL framebuffer.
* @see @ref setViewport(), @fn_gl{GenFramebuffers}
* Generates new OpenGL framebuffer object. If @extension{ARB,direct_state_access}
* (part of OpenGL 4.5) is not supported, the framebuffer is created on
* first use.
* @see @ref setViewport(), @fn_gl{CreateFramebuffers}, eventually
* @fn_gl{GenFramebuffers}
*/
explicit Framebuffer(const Range2Di& viewport);
@ -316,7 +319,7 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
/**
* @brief Destructor
*
* Deletes associated OpenGL framebuffer.
* Deletes associated OpenGL framebuffer object.
* @see @fn_gl{DeleteFramebuffers}
*/
~Framebuffer();
@ -635,6 +638,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
#endif
private:
void MAGNUM_LOCAL createImplementationDefault();
#ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL createImplementationDSA();
#endif
Framebuffer& setLabelInternal(Containers::ArrayReference<const char> label);
void MAGNUM_LOCAL renderbufferImplementationDefault(BufferAttachment attachment, Renderbuffer& renderbuffer);

12
src/Magnum/Implementation/FramebufferState.cpp

@ -38,6 +38,18 @@ FramebufferState::FramebufferState(Context& context, std::vector<std::string>& e
, maxDualSourceDrawBuffers(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 = &Framebuffer::createImplementationDSA;
} else
#endif
{
createImplementation = &Framebuffer::createImplementationDefault;
}
/* DSA/non-DSA implementation */
#ifndef MAGNUM_TARGET_GLES
if(context.isExtensionSupported<Extensions::GL::EXT::direct_state_access>()) {

1
src/Magnum/Implementation/FramebufferState.h

@ -49,6 +49,7 @@ struct FramebufferState {
void(AbstractFramebuffer::*invalidateSubImplementation)(GLsizei, const GLenum*, const Range2Di&);
#endif
void(Framebuffer::*createImplementation)();
void(Framebuffer::*renderbufferImplementation)(Framebuffer::BufferAttachment, Renderbuffer&);
#ifndef MAGNUM_TARGET_GLES
void(Framebuffer::*texture1DImplementation)(Framebuffer::BufferAttachment, GLuint, GLint);

Loading…
Cancel
Save