From 6e1990132c08f1c825492b71a93ae7f9d644cba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Tue, 21 May 2013 15:48:28 +0200 Subject: [PATCH] Moved framebuffer-related enums out of AbstractFramebuffer. Removes another trivial choice issue. --- src/AbstractFramebuffer.cpp | 36 ++--- src/AbstractFramebuffer.h | 207 +++++++++++++++-------------- src/Magnum.h | 4 + src/TextureTools/DistanceField.cpp | 2 +- 4 files changed, 127 insertions(+), 122 deletions(-) diff --git a/src/AbstractFramebuffer.cpp b/src/AbstractFramebuffer.cpp index 951560ede..870114e49 100644 --- a/src/AbstractFramebuffer.cpp +++ b/src/AbstractFramebuffer.cpp @@ -40,25 +40,25 @@ AbstractFramebuffer::DrawBuffersImplementation AbstractFramebuffer::drawBuffersI AbstractFramebuffer::DrawBufferImplementation AbstractFramebuffer::drawBufferImplementation = &AbstractFramebuffer::drawBufferImplementationDefault; AbstractFramebuffer::ReadBufferImplementation AbstractFramebuffer::readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDefault; -AbstractFramebuffer::Target AbstractFramebuffer::readTarget = AbstractFramebuffer::Target::ReadDraw; -AbstractFramebuffer::Target AbstractFramebuffer::drawTarget = AbstractFramebuffer::Target::ReadDraw; +FramebufferTarget AbstractFramebuffer::readTarget = FramebufferTarget::ReadDraw; +FramebufferTarget AbstractFramebuffer::drawTarget = FramebufferTarget::ReadDraw; -void AbstractFramebuffer::bind(Target target) { +void AbstractFramebuffer::bind(FramebufferTarget target) { bindInternal(target); setViewportInternal(); } -void AbstractFramebuffer::bindInternal(Target target) { +void AbstractFramebuffer::bindInternal(FramebufferTarget target) { Implementation::FramebufferState* state = Context::current()->state()->framebuffer; /* If already bound, done, otherwise update tracked state */ - if(target == Target::Read) { + if(target == FramebufferTarget::Read) { if(state->readBinding == _id) return; state->readBinding = _id; - } else if(target == Target::Draw) { + } else if(target == FramebufferTarget::Draw) { if(state->drawBinding == _id) return; state->drawBinding = _id; - } else if(target == Target::ReadDraw) { + } else if(target == FramebufferTarget::ReadDraw) { if(state->readBinding == _id && state->drawBinding == _id) return; state->readBinding = state->drawBinding = _id; } else CORRADE_ASSERT_UNREACHABLE(); @@ -66,28 +66,28 @@ void AbstractFramebuffer::bindInternal(Target target) { glBindFramebuffer(static_cast(target), _id); } -AbstractFramebuffer::Target AbstractFramebuffer::bindInternal() { +FramebufferTarget AbstractFramebuffer::bindInternal() { Implementation::FramebufferState* state = Context::current()->state()->framebuffer; /* Return target to which the framebuffer is already bound */ if(state->readBinding == _id && state->drawBinding == _id) - return Target::ReadDraw; + return FramebufferTarget::ReadDraw; if(state->readBinding == _id) - return Target::Read; + return FramebufferTarget::Read; if(state->drawBinding == _id) - return Target::Draw; + return FramebufferTarget::Draw; /* Or bind it, if not already */ state->readBinding = _id; - if(readTarget == Target::ReadDraw) state->drawBinding = _id; + if(readTarget == FramebufferTarget::ReadDraw) state->drawBinding = _id; glBindFramebuffer(GLenum(readTarget), _id); return readTarget; } -void AbstractFramebuffer::blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, AbstractFramebuffer::BlitMask mask, AbstractFramebuffer::BlitFilter filter) { - source.bindInternal(AbstractFramebuffer::Target::Read); - destination.bindInternal(AbstractFramebuffer::Target::Draw); +void AbstractFramebuffer::blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter) { + source.bindInternal(FramebufferTarget::Read); + destination.bindInternal(FramebufferTarget::Draw); /** @todo Get some extension wrangler instead to avoid undeclared glBlitFramebuffer() on ES2 */ #ifndef MAGNUM_TARGET_GLES2 glBlitFramebuffer(sourceRectangle.left(), sourceRectangle.bottom(), sourceRectangle.right(), sourceRectangle.top(), destinationRectangle.left(), destinationRectangle.bottom(), destinationRectangle.right(), destinationRectangle.top(), static_cast(mask), static_cast(filter)); @@ -123,7 +123,7 @@ void AbstractFramebuffer::setViewportInternal() { glViewport(_viewport.left(), _viewport.bottom(), _viewport.width(), _viewport.height()); } -void AbstractFramebuffer::clear(ClearMask mask) { +void AbstractFramebuffer::clear(FramebufferClearMask mask) { bindInternal(drawTarget); glClear(static_cast(mask)); } @@ -178,8 +178,8 @@ void AbstractFramebuffer::initializeContextBasedFunctionality(Context* context) if(context->isExtensionSupported()) { Debug() << "AbstractFramebuffer: using" << Extensions::GL::EXT::framebuffer_blit::string() << "features"; - readTarget = Target::Read; - drawTarget = Target::Draw; + readTarget = FramebufferTarget::Read; + drawTarget = FramebufferTarget::Draw; } if(context->isExtensionSupported()) { diff --git a/src/AbstractFramebuffer.h b/src/AbstractFramebuffer.h index 2abcb669b..cd9541e71 100644 --- a/src/AbstractFramebuffer.h +++ b/src/AbstractFramebuffer.h @@ -35,6 +35,94 @@ namespace Magnum { +/** + * @brief Mask for framebuffer clearing + * + * @see AbstractFramebuffer, FramebufferClearMask + */ +enum class FramebufferClear: GLbitfield { + Color = GL_COLOR_BUFFER_BIT, /**< Color */ + Depth = GL_DEPTH_BUFFER_BIT, /**< Depth value */ + Stencil = GL_STENCIL_BUFFER_BIT /**< Stencil value */ +}; + +/** + * @brief Mask for clearing + * + * @see AbstractFramebuffer::clear() + */ +typedef Corrade::Containers::EnumSet FramebufferClearMask; + +/** + * @brief Mask for framebuffer blitting + * + * @see AbstractFramebuffer, FramebufferBlitMask + * @requires_gl30 %Extension @extension{EXT,framebuffer_object} + * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or + * @es_extension{NV,framebuffer_blit} + */ +enum class FramebufferBlit: GLbitfield { + ColorBuffer = GL_COLOR_BUFFER_BIT, /**< Color buffer */ + DepthBuffer = GL_DEPTH_BUFFER_BIT, /**< Depth buffer */ + StencilBuffer = GL_STENCIL_BUFFER_BIT /**< Stencil buffer */ +}; + +/** + * @brief Mask for framebuffer blitting + * + * @see AbstractFramebuffer::blit() + * @requires_gl30 %Extension @extension{EXT,framebuffer_object} + * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or + * @es_extension{NV,framebuffer_blit} + */ +typedef Corrade::Containers::EnumSet FramebufferBlitMask; + +/** + * @brief %Framebuffer blit filtering + * + * @see AbstractFramebuffer::blit() + */ +enum class FramebufferBlitFilter: GLenum { + Nearest = GL_NEAREST, /**< Nearest neighbor filtering */ + Linear = GL_LINEAR /**< Linear interpolation filtering */ +}; + +/** + * @brief Target for binding framebuffer + * + * @see DefaultFramebuffer::bind(), Framebuffer::bind() + * @requires_gl30 %Extension @extension{EXT,framebuffer_object} + */ +enum class FramebufferTarget: GLenum { + /** + * For reading only. + * @requires_gl30 %Extension @extension{EXT,framebuffer_blit} + * @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, + * @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} + */ + #ifndef MAGNUM_TARGET_GLES2 + Read = GL_READ_FRAMEBUFFER, + #else + Read = GL_READ_FRAMEBUFFER_APPLE, + #endif + + /** + * For drawing only. + * @requires_gl30 %Extension @extension{EXT,framebuffer_blit} + * @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, + * @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} + */ + #ifndef MAGNUM_TARGET_GLES2 + Draw = GL_DRAW_FRAMEBUFFER, + #else + Draw = GL_DRAW_FRAMEBUFFER_APPLE, + #endif + + ReadDraw = GL_FRAMEBUFFER /**< For both reading and drawing. */ +}; + /** @brief Base for default and named framebuffers @@ -59,94 +147,6 @@ class MAGNUM_EXPORT AbstractFramebuffer { AbstractFramebuffer& operator=(AbstractFramebuffer&&) = delete; public: - /** - * @brief Mask for clearing - * - * @see ClearMask - */ - enum class Clear: GLbitfield { - Color = GL_COLOR_BUFFER_BIT, /**< Color */ - Depth = GL_DEPTH_BUFFER_BIT, /**< Depth value */ - Stencil = GL_STENCIL_BUFFER_BIT /**< Stencil value */ - }; - - /** - * @brief Mask for clearing - * - * @see clear() - */ - typedef Corrade::Containers::EnumSet ClearMask; - - /** - * @brief Mask for blitting - * - * @see BlitMask - * @requires_gl30 %Extension @extension{EXT,framebuffer_object} - * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or - * @es_extension{NV,framebuffer_blit} - */ - enum class Blit: GLbitfield { - ColorBuffer = GL_COLOR_BUFFER_BIT, /**< Color buffer */ - DepthBuffer = GL_DEPTH_BUFFER_BIT, /**< Depth buffer */ - StencilBuffer = GL_STENCIL_BUFFER_BIT /**< Stencil buffer */ - }; - - /** - * @brief Mask for blitting - * - * @see blit() - * @requires_gl30 %Extension @extension{EXT,framebuffer_object} - * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or - * @es_extension{NV,framebuffer_blit} - */ - typedef Corrade::Containers::EnumSet BlitMask; - - /** - * @brief Blit filtering - * - * @see blit() - */ - enum class BlitFilter: GLenum { - Nearest = GL_NEAREST, /**< Nearest neighbor filtering */ - Linear = GL_LINEAR /**< Linear interpolation filtering */ - }; - - /** - * @brief Target for binding framebuffer - * - * @see DefaultFramebuffer::bind(), Framebuffer::bind() - * @requires_gl30 %Extension @extension{EXT,framebuffer_object} - */ - enum class Target: GLenum { - /** - * For reading only. - * @requires_gl30 %Extension @extension{EXT,framebuffer_blit} - * @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, - * @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} - */ - #ifndef MAGNUM_TARGET_GLES2 - Read = GL_READ_FRAMEBUFFER, - #else - Read = GL_READ_FRAMEBUFFER_APPLE, - #endif - - /** - * For drawing only. - * @requires_gl30 %Extension @extension{EXT,framebuffer_blit} - * @requires_gles30 %Extension @es_extension{APPLE,framebuffer_multisample}, - * @es_extension{ANGLE,framebuffer_blit} or @es_extension{NV,framebuffer_blit} - */ - #ifndef MAGNUM_TARGET_GLES2 - Draw = GL_DRAW_FRAMEBUFFER, - #else - Draw = GL_DRAW_FRAMEBUFFER_APPLE, - #endif - - ReadDraw = GL_FRAMEBUFFER /**< For both reading and drawing. */ - }; - /** * @brief Copy block of pixels * @param source Source framebuffer @@ -156,9 +156,9 @@ class MAGNUM_EXPORT AbstractFramebuffer { * @param mask Which buffers to perform blit operation on * @param filter Interpolation filter * - * Binds @p source framebuffer to @ref Target "Target::Read" and - * @p destination framebuffer to @ref Target "Target::Draw" and - * performs blitting operation. See DefaultFramebuffer::mapForRead(), + * Binds @p source framebuffer to @ref FramebufferTarget "FramebufferTarget::Read" + * and @p destination framebuffer to @ref FramebufferTarget "FramebufferTarget::Draw" + * and performs blitting operation. See DefaultFramebuffer::mapForRead(), * Framebuffer::mapForRead(), DefaultFramebuffer::mapForDraw() and * Framebuffer::mapForDraw() for specifying particular buffers for * blitting operation. @@ -167,7 +167,7 @@ class MAGNUM_EXPORT AbstractFramebuffer { * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or * @es_extension{NV,framebuffer_blit} */ - static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, BlitMask mask, BlitFilter filter); + static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& sourceRectangle, const Rectanglei& destinationRectangle, FramebufferBlitMask mask, FramebufferBlitFilter filter); /** * @brief Copy block of pixels @@ -179,14 +179,15 @@ class MAGNUM_EXPORT AbstractFramebuffer { * Convenience alternative to above function when source rectangle is * the same as destination rectangle. As the image is copied * pixel-by-pixel, no interpolation is needed and thus - * @ref BlitFilter "BlitFilter::Nearest" filtering is used by default. + * @ref FramebufferBlitFilter "FramebufferBlitFilter::Nearest" + * filtering is used by default. * @see @fn_gl{BlitFramebuffer} * @requires_gl30 %Extension @extension{EXT,framebuffer_blit} * @requires_gles30 %Extension @es_extension{ANGLE,framebuffer_blit} or * @es_extension{NV,framebuffer_blit} */ - inline static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& rectangle, BlitMask mask) { - blit(source, destination, rectangle, rectangle, mask, BlitFilter::Nearest); + inline static void blit(AbstractFramebuffer& source, AbstractFramebuffer& destination, const Rectanglei& rectangle, FramebufferBlitMask mask) { + blit(source, destination, rectangle, rectangle, mask, FramebufferBlitFilter::Nearest); } explicit AbstractFramebuffer() = default; @@ -201,7 +202,7 @@ class MAGNUM_EXPORT AbstractFramebuffer { * Framebuffer::mapForDraw(), @fn_gl{BindFramebuffer}, * @fn_gl{Viewport} */ - void bind(Target target); + void bind(FramebufferTarget target); /** @brief Viewport rectangle */ inline Rectanglei viewport() const { return _viewport; } @@ -229,7 +230,7 @@ class MAGNUM_EXPORT AbstractFramebuffer { * Renderer::setClearStencil(), @fn_gl{BindFramebuffer}, * @fn_gl{Clear} */ - void clear(ClearMask mask); + void clear(FramebufferClearMask mask); /** * @brief Read block of pixels from framebuffer to image @@ -267,12 +268,12 @@ class MAGNUM_EXPORT AbstractFramebuffer { #else protected: #endif - void MAGNUM_LOCAL bindInternal(Target target); - Target MAGNUM_LOCAL bindInternal(); + void MAGNUM_LOCAL bindInternal(FramebufferTarget target); + FramebufferTarget MAGNUM_LOCAL bindInternal(); void MAGNUM_LOCAL setViewportInternal(); - static MAGNUM_LOCAL Target readTarget; - static MAGNUM_LOCAL Target drawTarget; + static MAGNUM_LOCAL FramebufferTarget readTarget; + static MAGNUM_LOCAL FramebufferTarget drawTarget; typedef void(AbstractFramebuffer::*DrawBuffersImplementation)(GLsizei, const GLenum*); static MAGNUM_LOCAL DrawBuffersImplementation drawBuffersImplementation; @@ -317,8 +318,8 @@ class MAGNUM_EXPORT AbstractFramebuffer { inline AbstractFramebuffer::~AbstractFramebuffer() {} -CORRADE_ENUMSET_OPERATORS(AbstractFramebuffer::ClearMask) -CORRADE_ENUMSET_OPERATORS(AbstractFramebuffer::BlitMask) +CORRADE_ENUMSET_OPERATORS(FramebufferClearMask) +CORRADE_ENUMSET_OPERATORS(FramebufferBlitMask) } diff --git a/src/Magnum.h b/src/Magnum.h index 9760dbaf9..e3bc518da 100644 --- a/src/Magnum.h +++ b/src/Magnum.h @@ -329,7 +329,11 @@ using Math::operator "" _radf; /** @todoc Remove `ifndef` when Doxygen is sane again */ #ifndef DOXYGEN_GENERATING_OUTPUT /* Forward declarations for all types in root namespace */ + +/* FramebufferClear[Mask], FramebufferBlit[Mask], FramebufferBlitFilter, + FramebufferTarget enums used only directly with framebuffer instance */ class AbstractFramebuffer; + class AbstractImage; class AbstractShaderProgram; class AbstractTexture; diff --git a/src/TextureTools/DistanceField.cpp b/src/TextureTools/DistanceField.cpp index 7ad59323e..c7f593cfb 100644 --- a/src/TextureTools/DistanceField.cpp +++ b/src/TextureTools/DistanceField.cpp @@ -89,7 +89,7 @@ void distanceField(Texture2D* input, Texture2D* output, const Rectanglei& rectan Framebuffer framebuffer(rectangle); framebuffer.attachTexture2D(Framebuffer::ColorAttachment(0), output, 0); - framebuffer.bind(Framebuffer::Target::Draw); + framebuffer.bind(FramebufferTarget::Draw); DistanceFieldShader shader; shader.setRadius(radius)