Browse Source

GL: clean up Framebuffer constructors.

The AbstractFramebuffer constructor is now constexpr, but that doesn't
mean we can have GL::defaultFramebuffer constexpr -- all member
functions are (by design) non-const and we also need to modify its
viewport value quite often. So this has to stay as-is.
pull/374/head
Vladimír Vondruš 7 years ago
parent
commit
db8c5fedaa
  1. 19
      src/Magnum/GL/AbstractFramebuffer.h
  2. 5
      src/Magnum/GL/DefaultFramebuffer.cpp
  3. 11
      src/Magnum/GL/DefaultFramebuffer.h
  4. 2
      src/Magnum/GL/Framebuffer.cpp
  5. 24
      src/Magnum/GL/Framebuffer.h

19
src/Magnum/GL/AbstractFramebuffer.h

@ -707,11 +707,26 @@ class MAGNUM_GL_EXPORT AbstractFramebuffer {
#else #else
protected: protected:
#endif #endif
explicit AbstractFramebuffer(): _flags{ObjectFlag::DeleteOnDestruction} {} /* Used by the (constexpr) DefaultFramebuffer constructor and both
explicit AbstractFramebuffer(GLuint id, const Range2Di& viewport, ObjectFlags flags) noexcept: _id{id}, _viewport{viewport}, _flags{flags} {} the NoCreate and normal constructor of Framebuffer */
constexpr explicit AbstractFramebuffer(GLuint id, const Range2Di& viewport, ObjectFlags flags) noexcept: _id{id}, _viewport{viewport}, _flags{flags} {}
~AbstractFramebuffer() = default; ~AbstractFramebuffer() = default;
AbstractFramebuffer(const AbstractFramebuffer&) = delete;
AbstractFramebuffer(AbstractFramebuffer&& other) noexcept: _id{other._id}, _viewport{other._viewport}, _flags{other._flags} {
other._id = 0;
other._viewport = {};
}
AbstractFramebuffer& operator=(const AbstractFramebuffer&) = delete;
AbstractFramebuffer& operator=(AbstractFramebuffer&& other) noexcept {
using std::swap;
swap(_id, other._id);
swap(_viewport, other._viewport);
swap(_flags, other._flags);
return *this;
}
void MAGNUM_GL_LOCAL createIfNotAlready(); void MAGNUM_GL_LOCAL createIfNotAlready();
void MAGNUM_GL_LOCAL bindInternal(FramebufferTarget target); void MAGNUM_GL_LOCAL bindInternal(FramebufferTarget target);

5
src/Magnum/GL/DefaultFramebuffer.cpp

@ -46,11 +46,6 @@ namespace GL {
DefaultFramebuffer defaultFramebuffer; DefaultFramebuffer defaultFramebuffer;
DefaultFramebuffer::DefaultFramebuffer() {
_id = 0;
_flags |= ObjectFlag::Created;
}
DefaultFramebuffer::Status DefaultFramebuffer::checkStatus(const FramebufferTarget target) { DefaultFramebuffer::Status DefaultFramebuffer::checkStatus(const FramebufferTarget target) {
return Status((this->*Context::current().state().framebuffer->checkStatusImplementation)(target)); return Status((this->*Context::current().state().framebuffer->checkStatusImplementation)(target));
} }

11
src/Magnum/GL/DefaultFramebuffer.h

@ -306,7 +306,13 @@ class MAGNUM_GL_EXPORT DefaultFramebuffer: public AbstractFramebuffer {
}; };
#endif #endif
explicit MAGNUM_GL_LOCAL DefaultFramebuffer(); /**
* @brief Constructor
*
* Not meant to be constructed on the application side, use the
* @ref GL::defaultFramebuffer instance directly.
*/
constexpr explicit DefaultFramebuffer(): AbstractFramebuffer{0, {}, ObjectFlag::Created|ObjectFlag::DeleteOnDestruction} {}
/** @brief Copying is not allowed */ /** @brief Copying is not allowed */
DefaultFramebuffer(const DefaultFramebuffer&) = delete; DefaultFramebuffer(const DefaultFramebuffer&) = delete;
@ -504,6 +510,9 @@ class MAGNUM_GL_EXPORT DefaultFramebuffer: public AbstractFramebuffer {
}; };
/** @brief Default framebuffer instance */ /** @brief Default framebuffer instance */
/* Even though the constructor is constexpr, this variable can't -- all
framebuffer APIs are non-const since they modify global GL state and besides
that we also need to modify its private _viewport member quite a lot */
extern DefaultFramebuffer MAGNUM_GL_EXPORT defaultFramebuffer; extern DefaultFramebuffer MAGNUM_GL_EXPORT defaultFramebuffer;
/** @debugoperatorclassenum{DefaultFramebuffer,DefaultFramebuffer::Status} */ /** @debugoperatorclassenum{DefaultFramebuffer,DefaultFramebuffer::Status} */

2
src/Magnum/GL/Framebuffer.cpp

@ -97,7 +97,7 @@ Int Framebuffer::maxColorAttachments() {
return value; return value;
} }
Framebuffer::Framebuffer(const Range2Di& viewport) { Framebuffer::Framebuffer(const Range2Di& viewport): AbstractFramebuffer{0, viewport, ObjectFlag::DeleteOnDestruction} {
CORRADE_INTERNAL_ASSERT(viewport != Implementation::FramebufferState::DisengagedViewport); CORRADE_INTERNAL_ASSERT(viewport != Implementation::FramebufferState::DisengagedViewport);
_viewport = viewport; _viewport = viewport;
(this->*Context::current().state().framebuffer->createImplementation)(); (this->*Context::current().state().framebuffer->createImplementation)();

24
src/Magnum/GL/Framebuffer.h

@ -361,14 +361,13 @@ class MAGNUM_GL_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractO
* destructing) objects even without any OpenGL context being active. * destructing) objects even without any OpenGL context being active.
* @see @ref Framebuffer(const Range2Di&), @ref wrap() * @see @ref Framebuffer(const Range2Di&), @ref wrap()
*/ */
explicit Framebuffer(NoCreateT) noexcept { _id = 0; } explicit Framebuffer(NoCreateT) noexcept: AbstractFramebuffer{{}, {}, {}} {}
/** @brief Copying is not allowed */ /** @brief Copying is not allowed */
Framebuffer(const Framebuffer&) = delete; Framebuffer(const Framebuffer&) = delete;
/** @brief Move constructor */ /** @brief Move constructor */
/* MinGW complains loudly if the declaration doesn't also have inline */ Framebuffer(Framebuffer&&) noexcept = default;
inline Framebuffer(Framebuffer&& other) noexcept;
/** /**
* @brief Destructor * @brief Destructor
@ -382,8 +381,7 @@ class MAGNUM_GL_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractO
Framebuffer& operator=(const Framebuffer&) = delete; Framebuffer& operator=(const Framebuffer&) = delete;
/** @brief Move assignment */ /** @brief Move assignment */
/* MinGW complains loudly if the declaration doesn't also have inline */ Framebuffer& operator=(Framebuffer&&) noexcept = default;
inline Framebuffer& operator=(Framebuffer&& other) noexcept;
/** @brief OpenGL framebuffer ID */ /** @brief OpenGL framebuffer ID */
GLuint id() const { return _id; } GLuint id() const { return _id; }
@ -939,22 +937,6 @@ class MAGNUM_GL_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractO
/** @debugoperatorclassenum{Framebuffer,Framebuffer::Status} */ /** @debugoperatorclassenum{Framebuffer,Framebuffer::Status} */
MAGNUM_GL_EXPORT Debug& operator<<(Debug& debug, Framebuffer::Status value); MAGNUM_GL_EXPORT Debug& operator<<(Debug& debug, Framebuffer::Status value);
inline Framebuffer::Framebuffer(Framebuffer&& other) noexcept {
_id = other._id;
_viewport = other._viewport;
_flags = other._flags;
other._id = 0;
other._viewport = {};
}
inline Framebuffer& Framebuffer::operator=(Framebuffer&& other) noexcept {
using std::swap;
swap(_id, other._id);
swap(_viewport, other._viewport);
swap(_flags, other._flags);
return *this;
}
inline GLuint Framebuffer::release() { inline GLuint Framebuffer::release() {
const GLuint id = _id; const GLuint id = _id;
_id = 0; _id = 0;

Loading…
Cancel
Save