Browse Source

Added Framebuffer::detach().

pull/107/head
Vladimír Vondruš 11 years ago
parent
commit
233a15b422
  1. 2
      doc/opengl-mapping.dox
  2. 19
      src/Magnum/Framebuffer.cpp
  3. 21
      src/Magnum/Framebuffer.h
  4. 2
      src/Magnum/Implementation/FramebufferState.h
  5. 11
      src/Magnum/Test/FramebufferGLTest.cpp

2
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

19
src/Magnum/Framebuffer.cpp

@ -205,7 +205,7 @@ void Framebuffer::invalidate(std::initializer_list<InvalidationAttachment> 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) {

21
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<const char> 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

2
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

11
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<Extensions::GL::ARB::framebuffer_object>())

Loading…
Cancel
Save