From 8aeb85875dd82cf3981d683e5ceadbaeb545265f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 9 Sep 2014 10:17:15 +0200 Subject: [PATCH] ARB_direct_state_access support for creating renderbuffers. --- src/Magnum/Implementation/FramebufferState.cpp | 2 ++ src/Magnum/Implementation/FramebufferState.h | 1 + src/Magnum/Renderbuffer.cpp | 16 +++++++++++++++- src/Magnum/Renderbuffer.h | 13 ++++++++++--- 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/Magnum/Implementation/FramebufferState.cpp b/src/Magnum/Implementation/FramebufferState.cpp index 00134418c..f7fe3540b 100644 --- a/src/Magnum/Implementation/FramebufferState.cpp +++ b/src/Magnum/Implementation/FramebufferState.cpp @@ -43,11 +43,13 @@ FramebufferState::FramebufferState(Context& context, std::vector& e if(context.isExtensionSupported()) { 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 */ diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index 541ebd138..1096ac6c7 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/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&); diff --git a/src/Magnum/Renderbuffer.cpp b/src/Magnum/Renderbuffer.cpp index 580bcb162..298cb63ed 100644 --- a/src/Magnum/Renderbuffer.cpp +++ b/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 */ diff --git a/src/Magnum/Renderbuffer.h b/src/Magnum/Renderbuffer.h index 69b7021a2..b398642c1 100644 --- a/src/Magnum/Renderbuffer.h +++ b/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 label);