From 9f041b5d5b45573b858e41003c7caf868bc69d50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 9 Sep 2014 10:16:32 +0200 Subject: [PATCH] ARB_direct_state_access support for creating framebuffers. --- src/Magnum/Framebuffer.cpp | 14 ++++++++++++-- src/Magnum/Framebuffer.h | 14 +++++++++++--- src/Magnum/Implementation/FramebufferState.cpp | 12 ++++++++++++ src/Magnum/Implementation/FramebufferState.h | 1 + 4 files changed, 36 insertions(+), 5 deletions(-) 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);