From 233a15b422fc89d4aedf7bbf5af82837d0e6e946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 5 Jun 2015 22:17:54 +0200 Subject: [PATCH] Added Framebuffer::detach(). --- doc/opengl-mapping.dox | 2 +- src/Magnum/Framebuffer.cpp | 19 +++++++++++------- src/Magnum/Framebuffer.h | 21 +++++++++++++++++--- src/Magnum/Implementation/FramebufferState.h | 2 +- src/Magnum/Test/FramebufferGLTest.cpp | 11 ++++++++++ 5 files changed, 43 insertions(+), 12 deletions(-) diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 8275dd308..014c07b96 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -142,7 +142,7 @@ OpenGL function | Matching API @fn_gl{Flush} | @ref Renderer::flush() @fn_gl{FlushMappedBufferRange}, \n `glFlushMappedNamedBufferRange()`, \n @fn_gl_extension{FlushMappedNamedBufferRange,EXT,direct_state_access} | @ref Buffer::flushMappedRange() @fn_gl2{FramebufferParameter,FramebufferParameteri}, \n `glNamedFramebufferParameter()`, \n @fn_gl_extension{NamedFramebufferParameter,EXT,direct_state_access} | | -@fn_gl{FramebufferRenderbuffer}, \n `glNamedFramebufferRenderbuffer()`, \n @fn_gl_extension{NamedFramebufferRenderbuffer,EXT,direct_state_access} | @ref Framebuffer::attachRenderbuffer() +@fn_gl{FramebufferRenderbuffer}, \n `glNamedFramebufferRenderbuffer()`, \n @fn_gl_extension{NamedFramebufferRenderbuffer,EXT,direct_state_access} | @ref Framebuffer::attachRenderbuffer(), \n @ref Framebuffer::detach() @fn_gl{FramebufferTexture}, \n `glNamedFramebufferTexture()`, \n @fn_gl_extension{NamedFramebufferTexture,EXT,direct_state_access} | not used, the functions below are used instead for compatibility reasons @fn_gl2{FramebufferTexture1D,FramebufferTexture}, \n @fn_gl_extension{NamedFramebufferTexture1D,EXT,direct_state_access}, \n `glFramebufferTexture2D()`, \n `glNamedFramebufferTexture2DEXT()` | @ref Framebuffer::attachTexture() @fn_gl2{FramebufferTexture3D,FramebufferTexture} | not used, @fn_gl{FramebufferTextureLayer} has more complete features diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 0b7edfb19..10ff1246a 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -205,7 +205,7 @@ void Framebuffer::invalidate(std::initializer_list attac #endif Framebuffer& Framebuffer::attachRenderbuffer(const BufferAttachment attachment, Renderbuffer& renderbuffer) { - (this->*Context::current()->state().framebuffer->renderbufferImplementation)(attachment, renderbuffer); + (this->*Context::current()->state().framebuffer->renderbufferImplementation)(attachment, renderbuffer.id()); return *this; } @@ -273,18 +273,23 @@ Framebuffer& Framebuffer::attachTextureLayer(const BufferAttachment attachment, } #endif -void Framebuffer::renderbufferImplementationDefault(BufferAttachment attachment, Renderbuffer& renderbuffer) { - glFramebufferRenderbuffer(GLenum(bindInternal()), GLenum(attachment), GL_RENDERBUFFER, renderbuffer.id()); +Framebuffer& Framebuffer::detach(const BufferAttachment attachment) { + (this->*Context::current()->state().framebuffer->renderbufferImplementation)(attachment, 0); + return *this; +} + +void Framebuffer::renderbufferImplementationDefault(const BufferAttachment attachment, const GLuint renderbufferId) { + glFramebufferRenderbuffer(GLenum(bindInternal()), GLenum(attachment), GL_RENDERBUFFER, renderbufferId); } #ifndef MAGNUM_TARGET_GLES -void Framebuffer::renderbufferImplementationDSA(const BufferAttachment attachment, Renderbuffer& renderbuffer) { - glNamedFramebufferRenderbuffer(_id, GLenum(attachment), GL_RENDERBUFFER, renderbuffer.id()); +void Framebuffer::renderbufferImplementationDSA(const BufferAttachment attachment, const GLuint renderbufferId) { + glNamedFramebufferRenderbuffer(_id, GLenum(attachment), GL_RENDERBUFFER, renderbufferId); } -void Framebuffer::renderbufferImplementationDSAEXT(BufferAttachment attachment, Renderbuffer& renderbuffer) { +void Framebuffer::renderbufferImplementationDSAEXT(const BufferAttachment attachment, const GLuint renderbufferId) { _flags |= ObjectFlag::Created; - glNamedFramebufferRenderbufferEXT(_id, GLenum(attachment), GL_RENDERBUFFER, renderbuffer.id()); + glNamedFramebufferRenderbufferEXT(_id, GLenum(attachment), GL_RENDERBUFFER, renderbufferId); } void Framebuffer::texture1DImplementationDefault(BufferAttachment attachment, GLuint textureId, GLint mipLevel) { diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index 4f06e2b05..9a7a95eaf 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -701,6 +701,21 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje Framebuffer& attachTextureLayer(BufferAttachment attachment, MultisampleTexture2DArray& texture, Int layer); #endif + /** + * @brief Detach any texture or renderbuffer bound to given buffer + * @param attachment Buffer attachment + * @return Reference to self (for method chaining) + * + * If neither @extension{ARB,direct_state_access} (part of OpenGL 4.5) + * nor @extension{EXT,direct_state_access} desktop extension is + * available, the framebuffer is bound before the operation (if not + * already). + * @see @fn_gl2{NamedFramebufferRenderbuffer,FramebufferRenderbuffer}, + * @fn_gl_extension{NamedFramebufferRenderbuffer,EXT,direct_state_access}, + * eventually @fn_gl{BindFramebuffer} and @fn_gl{FramebufferRenderbuffer} + */ + Framebuffer& detach(BufferAttachment attachment); + /* Overloads to remove WTF-factor from method chaining order */ #ifndef DOXYGEN_GENERATING_OUTPUT Framebuffer& setViewport(const Range2Di& rectangle) { @@ -725,10 +740,10 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje Framebuffer& setLabelInternal(Containers::ArrayView label); #endif - void MAGNUM_LOCAL renderbufferImplementationDefault(BufferAttachment attachment, Renderbuffer& renderbuffer); + void MAGNUM_LOCAL renderbufferImplementationDefault(BufferAttachment attachment, GLuint renderbufferId); #ifndef MAGNUM_TARGET_GLES - void MAGNUM_LOCAL renderbufferImplementationDSA(BufferAttachment attachment, Renderbuffer& renderbuffer); - void MAGNUM_LOCAL renderbufferImplementationDSAEXT(BufferAttachment attachment, Renderbuffer& renderbuffer); + void MAGNUM_LOCAL renderbufferImplementationDSA(BufferAttachment attachment, GLuint renderbufferId); + void MAGNUM_LOCAL renderbufferImplementationDSAEXT(BufferAttachment attachment, GLuint renderbufferId); #endif #ifndef MAGNUM_TARGET_GLES diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index fc78d0589..3fffdd42e 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/src/Magnum/Implementation/FramebufferState.h @@ -60,7 +60,7 @@ struct FramebufferState { #endif void(Framebuffer::*createImplementation)(); - void(Framebuffer::*renderbufferImplementation)(Framebuffer::BufferAttachment, Renderbuffer&); + void(Framebuffer::*renderbufferImplementation)(Framebuffer::BufferAttachment, GLuint); #ifndef MAGNUM_TARGET_GLES void(Framebuffer::*texture1DImplementation)(Framebuffer::BufferAttachment, GLuint, GLint); #endif diff --git a/src/Magnum/Test/FramebufferGLTest.cpp b/src/Magnum/Test/FramebufferGLTest.cpp index f22103246..9b7f21dec 100644 --- a/src/Magnum/Test/FramebufferGLTest.cpp +++ b/src/Magnum/Test/FramebufferGLTest.cpp @@ -82,6 +82,7 @@ struct FramebufferGLTest: AbstractOpenGLTester { #ifndef MAGNUM_TARGET_GLES void attachCubeMapTextureArray(); #endif + void detach(); void multipleColorOutputs(); @@ -133,6 +134,7 @@ FramebufferGLTest::FramebufferGLTest() { #ifndef MAGNUM_TARGET_GLES &FramebufferGLTest::attachCubeMapTextureArray, #endif + &FramebufferGLTest::detach, &FramebufferGLTest::multipleColorOutputs, @@ -630,6 +632,15 @@ void FramebufferGLTest::attachCubeMapTextureArray() { } #endif +void FramebufferGLTest::detach() { + Framebuffer framebuffer({{}, Vector2i(128)}); + framebuffer.detach(Framebuffer::ColorAttachment(0)) + .detach(Framebuffer::BufferAttachment::Depth) + .detach(Framebuffer::BufferAttachment::Stencil); + + MAGNUM_VERIFY_NO_ERROR(); +} + void FramebufferGLTest::multipleColorOutputs() { #ifndef MAGNUM_TARGET_GLES if(!Context::current()->isExtensionSupported())