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) { Framebuffer::Framebuffer(const Range2Di& viewport) {
_viewport = viewport; _viewport = viewport;
_created = false; (this->*Context::current()->state().framebuffer->createImplementation)();
CORRADE_INTERNAL_ASSERT(_id != Implementation::State::DisengagedBinding);
}
void Framebuffer::createImplementationDefault() {
glGenFramebuffers(1, &_id); 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() { Framebuffer::~Framebuffer() {
/* Moved out, nothing to do */ /* Moved out, nothing to do */
if(!_id) return; if(!_id) return;

14
src/Magnum/Framebuffer.h

@ -302,8 +302,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
/** /**
* @brief Constructor * @brief Constructor
* *
* Generates new OpenGL framebuffer. * Generates new OpenGL framebuffer object. If @extension{ARB,direct_state_access}
* @see @ref setViewport(), @fn_gl{GenFramebuffers} * (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); explicit Framebuffer(const Range2Di& viewport);
@ -316,7 +319,7 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
/** /**
* @brief Destructor * @brief Destructor
* *
* Deletes associated OpenGL framebuffer. * Deletes associated OpenGL framebuffer object.
* @see @fn_gl{DeleteFramebuffers} * @see @fn_gl{DeleteFramebuffers}
*/ */
~Framebuffer(); ~Framebuffer();
@ -635,6 +638,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje
#endif #endif
private: private:
void MAGNUM_LOCAL createImplementationDefault();
#ifndef MAGNUM_TARGET_GLES
void MAGNUM_LOCAL createImplementationDSA();
#endif
Framebuffer& setLabelInternal(Containers::ArrayReference<const char> label); Framebuffer& setLabelInternal(Containers::ArrayReference<const char> label);
void MAGNUM_LOCAL renderbufferImplementationDefault(BufferAttachment attachment, Renderbuffer& renderbuffer); 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) , maxDualSourceDrawBuffers(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 = &Framebuffer::createImplementationDSA;
} else
#endif
{
createImplementation = &Framebuffer::createImplementationDefault;
}
/* DSA/non-DSA implementation */ /* DSA/non-DSA implementation */
#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>()) {

1
src/Magnum/Implementation/FramebufferState.h

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

Loading…
Cancel
Save