diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 0e910038d..b2884c749 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/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; diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index 2c9cdc3f9..b9b5e920b 100644 --- a/src/Magnum/Framebuffer.h +++ b/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 label); void MAGNUM_LOCAL renderbufferImplementationDefault(BufferAttachment attachment, Renderbuffer& renderbuffer); diff --git a/src/Magnum/Implementation/FramebufferState.cpp b/src/Magnum/Implementation/FramebufferState.cpp index 34dbfdb58..00134418c 100644 --- a/src/Magnum/Implementation/FramebufferState.cpp +++ b/src/Magnum/Implementation/FramebufferState.cpp @@ -38,6 +38,18 @@ FramebufferState::FramebufferState(Context& context, std::vector& e , maxDualSourceDrawBuffers(0) #endif { + /* Create implementation */ + #ifndef MAGNUM_TARGET_GLES + if(context.isExtensionSupported()) { + 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()) { diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index e4c498942..541ebd138 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/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);