diff --git a/doc/opengl-mapping.dox b/doc/opengl-mapping.dox index 41d0c5b16..294a547e2 100644 --- a/doc/opengl-mapping.dox +++ b/doc/opengl-mapping.dox @@ -184,7 +184,7 @@ OpenGL function | Matching API @fn_gl{InvalidateBufferData} | @ref Buffer::invalidateData() @fn_gl{InvalidateBufferSubData} | @ref Buffer::invalidateSubData() @fn_gl{InvalidateFramebuffer}, \n @fn_gles_extension{DiscardFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate() -@fn_gl{InvalidateSubFramebuffer}, \n @fn_gles_extension{DiscardSubFramebuffer,EXT,discard_framebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate() +@fn_gl{InvalidateSubFramebuffer} | @ref DefaultFramebuffer::invalidate(), \n @ref Framebuffer::invalidate() @fn_gl{InvalidateTexImage} | @ref Texture::invalidateImage(), \n @ref TextureArray::invalidateImage(), \n @ref CubeMapTexture::invalidateImage(), \n @ref CubeMapTextureArray::invalidateImage(), \n @ref RectangleTexture::invalidateImage(), \n @ref MultisampleTexture::invalidateImage() @fn_gl{InvalidateTexSubImage} | @ref Texture::invalidateSubImage(), \n @ref TextureArray::invalidateSubImage(), \n @ref CubeMapTexture::invalidateSubImage(), \n @ref CubeMapTextureArray::invalidateSubImage(), \n @ref RectangleTexture::invalidateSubImage(), \n @ref MultisampleTexture::invalidateSubImage() @fn_gl{IsBuffer}, \n @fn_gl{IsFramebuffer}, \n @fn_gl{IsProgram}, \n @fn_gl{IsProgramPipeline}, \n @fn_gl{IsQuery}, \n @fn_gl{IsRenderbuffer}, \n @fn_gl{IsSampler}, \n @fn_gl{IsShader}, \n @fn_gl{IsSync}, \n @fn_gl{IsTexture}, \n @fn_gl{IsTransformFeedback}, \n @fn_gl{IsVertexArray} | not needed, objects are strongly typed diff --git a/src/Magnum/AbstractFramebuffer.cpp b/src/Magnum/AbstractFramebuffer.cpp index e4c99bd64..235a95ac0 100644 --- a/src/Magnum/AbstractFramebuffer.cpp +++ b/src/Magnum/AbstractFramebuffer.cpp @@ -221,20 +221,13 @@ void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, c #endif } +#ifndef MAGNUM_TARGET_GLES2 void AbstractFramebuffer::invalidateImplementationNoOp(GLsizei, const GLenum*, const Range2Di&) {} void AbstractFramebuffer::invalidateImplementationDefault(const GLsizei count, const GLenum* const attachments, const Range2Di& rectangle) { - /** @todo Re-enable when extension loader is available for ES */ - #ifndef MAGNUM_TARGET_GLES2 glInvalidateSubFramebuffer(GLenum(bindInternal()), count, attachments, rectangle.left(), rectangle.bottom(), rectangle.sizeX(), rectangle.sizeY()); - #else - static_cast(count); - static_cast(attachments); - static_cast(rectangle); - CORRADE_INTERNAL_ASSERT(false); - //glDiscardSubFramebufferEXT(GLenum(bindInternal()), count, attachments, rectangle.left(), rectangle.bottom(), rectangle.width(), rectangle.height()); - #endif } +#endif GLenum AbstractFramebuffer::checkStatusImplementationDefault(const FramebufferTarget target) { bindInternal(target); diff --git a/src/Magnum/AbstractFramebuffer.h b/src/Magnum/AbstractFramebuffer.h index 296447830..03f581a59 100644 --- a/src/Magnum/AbstractFramebuffer.h +++ b/src/Magnum/AbstractFramebuffer.h @@ -363,8 +363,10 @@ class MAGNUM_EXPORT AbstractFramebuffer { void MAGNUM_LOCAL invalidateImplementationNoOp(GLsizei, const GLenum*); void MAGNUM_LOCAL invalidateImplementationDefault(GLsizei count, const GLenum* attachments); + #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL invalidateImplementationNoOp(GLsizei, const GLenum*, const Range2Di&); void MAGNUM_LOCAL invalidateImplementationDefault(GLsizei count, const GLenum* attachments, const Range2Di& rectangle); + #endif }; CORRADE_ENUMSET_OPERATORS(FramebufferClearMask) diff --git a/src/Magnum/DefaultFramebuffer.cpp b/src/Magnum/DefaultFramebuffer.cpp index 6ccfeb13e..9c9f4991b 100644 --- a/src/Magnum/DefaultFramebuffer.cpp +++ b/src/Magnum/DefaultFramebuffer.cpp @@ -80,6 +80,7 @@ void DefaultFramebuffer::invalidate(std::initializer_list*Context::current()->state().framebuffer->invalidateImplementation)(attachments.size(), _attachments); } +#ifndef MAGNUM_TARGET_GLES2 void DefaultFramebuffer::invalidate(std::initializer_list attachments, const Range2Di& rectangle) { /** @todo C++14: use VLA to avoid heap allocation */ Containers::Array _attachments(attachments.size()); @@ -88,6 +89,7 @@ void DefaultFramebuffer::invalidate(std::initializer_list*Context::current()->state().framebuffer->invalidateSubImplementation)(attachments.size(), _attachments, rectangle); } +#endif void DefaultFramebuffer::initializeContextBasedFunctionality(Context& context) { Implementation::FramebufferState* state = context.state().framebuffer; diff --git a/src/Magnum/DefaultFramebuffer.h b/src/Magnum/DefaultFramebuffer.h index b859ce9e8..f15def894 100644 --- a/src/Magnum/DefaultFramebuffer.h +++ b/src/Magnum/DefaultFramebuffer.h @@ -404,12 +404,11 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { * @param rectangle %Rectangle to invalidate * * If extension @extension{ARB,invalidate_subdata} (part of OpenGL - * 4.3), extension @es_extension{EXT,discard_framebuffer} in OpenGL ES - * 2.0 or OpenGL ES 3.0 is not available, this function does nothing. + * 4.3) or OpenGL ES 3.0 is not available, this function does nothing. * The framebuffer is bound to some target before the operation, if not * already. - * @see @fn_gl{InvalidateSubFramebuffer} or @fn_gles_extension{DiscardSubFramebuffer,EXT,discard_framebuffer} - * on OpenGL ES 2.0 + * @see @ref invalidate(std::initializer_list), + * @fn_gl{InvalidateSubFramebuffer} */ void invalidate(std::initializer_list attachments, const Range2Di& rectangle); @@ -431,6 +430,11 @@ extern DefaultFramebuffer MAGNUM_EXPORT defaultFramebuffer; /** @debugoperatorclassenum{Magnum::DefaultFramebuffer,Magnum::DefaultFramebuffer::Status} */ Debug MAGNUM_EXPORT operator<<(Debug debug, DefaultFramebuffer::Status value); +#ifdef MAGNUM_TARGET_GLES2 +/* No-op implementation on ES2 */ +inline void DefaultFramebuffer::invalidate(std::initializer_list, const Range2Di&) {} +#endif + } #endif diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index d43bf891d..dde39e676 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -157,6 +157,7 @@ void Framebuffer::invalidate(std::initializer_list attac (this->*Context::current()->state().framebuffer->invalidateImplementation)(attachments.size(), _attachments); } +#ifndef MAGNUM_TARGET_GLES2 void Framebuffer::invalidate(std::initializer_list attachments, const Range2Di& rectangle) { /** @todo C++14: use VLA to avoid heap allocation */ Containers::Array _attachments(attachments.size()); @@ -165,6 +166,7 @@ void Framebuffer::invalidate(std::initializer_list attac (this->*Context::current()->state().framebuffer->invalidateSubImplementation)(attachments.size(), _attachments, rectangle); } +#endif Framebuffer& Framebuffer::attachRenderbuffer(const BufferAttachment attachment, Renderbuffer& renderbuffer) { (this->*Context::current()->state().framebuffer->renderbufferImplementation)(attachment, renderbuffer); diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index b2d951c08..7d055b16f 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -458,12 +458,11 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @param rectangle %Rectangle to invalidate * * If extension @extension{ARB,invalidate_subdata} (part of OpenGL - * 4.3), extension @es_extension{EXT,discard_framebuffer} in OpenGL ES - * 2.0 or OpenGL ES 3.0 is not available, this function does nothing. + * 4.3) or OpenGL ES 3.0 is not available, this function does nothing. * The framebuffer is bound to some target before the operation, if not * already. - * @see @fn_gl{InvalidateFramebuffer} or @fn_gles_extension{DiscardFramebuffer,EXT,discard_framebuffer} - * on OpenGL ES 2.0 + * @see @ref invalidate(std::initializer_list), + * @fn_gl{InvalidateFramebuffer} */ void invalidate(std::initializer_list attachments, const Range2Di& rectangle); @@ -672,6 +671,11 @@ inline Framebuffer& Framebuffer::operator=(Framebuffer&& other) noexcept { return *this; } +#ifdef MAGNUM_TARGET_GLES2 +/* No-op implementation on ES2 */ +inline void Framebuffer::invalidate(std::initializer_list, const Range2Di&) {} +#endif + } #endif diff --git a/src/Magnum/Implementation/FramebufferState.cpp b/src/Magnum/Implementation/FramebufferState.cpp index 010d23307..4f28e3d00 100644 --- a/src/Magnum/Implementation/FramebufferState.cpp +++ b/src/Magnum/Implementation/FramebufferState.cpp @@ -157,10 +157,8 @@ FramebufferState::FramebufferState(Context& context, std::vector& e extensions.push_back(Extensions::GL::EXT::discard_framebuffer::string()); invalidateImplementation = &AbstractFramebuffer::invalidateImplementationDefault; - invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationDefault; } else { invalidateImplementation = &AbstractFramebuffer::invalidateImplementationNoOp; - invalidateSubImplementation = &AbstractFramebuffer::invalidateImplementationNoOp; } /* Always available on ES3 */ diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index c2c7322e9..a466d4ed9 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/src/Magnum/Implementation/FramebufferState.h @@ -42,7 +42,9 @@ struct FramebufferState { void(AbstractFramebuffer::*drawBufferImplementation)(GLenum); void(AbstractFramebuffer::*readBufferImplementation)(GLenum); void(AbstractFramebuffer::*invalidateImplementation)(GLsizei, const GLenum*); + #ifndef MAGNUM_TARGET_GLES2 void(AbstractFramebuffer::*invalidateSubImplementation)(GLsizei, const GLenum*, const Range2Di&); + #endif void(Framebuffer::*renderbufferImplementation)(Framebuffer::BufferAttachment, Renderbuffer&); #ifndef MAGNUM_TARGET_GLES