From db1142837c7090f5e690544ba6cce29841da34fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 16 May 2015 19:36:55 +0200 Subject: [PATCH] Clarified and updated *Framebuffer::mapForDraw() implementations. In OpenGL ES 2.0 there is EXT_draw_buffers, which I overlooked somehow, so I added it to extension list and included in the implementation. It combines NV_draw_buffers and NV_fbo_color_attachments, so the implementation now selects one of the two based on which extension is supported, preferring the EXT one. Updated the documentation to be less confusing, fixed extension links. Also the single-output mapForDraw() is not handled separately on ES anymore and just calls DrawBuffers implementation with single parameter, resulting in less generated code. EXT_draw_buffers can also be called on default framebuffer and apparently in ES there is no way to map front framebuffer for drawing, so I removed it from the DefaultFramebuffer::DrawAttachment enum. --- doc/opengl-support.dox | 1 + src/Magnum/AbstractFramebuffer.cpp | 46 +++++++++++-------- src/Magnum/AbstractFramebuffer.h | 11 +++-- src/Magnum/Context.cpp | 1 + src/Magnum/DefaultFramebuffer.cpp | 6 ++- src/Magnum/DefaultFramebuffer.h | 34 ++++---------- src/Magnum/Extensions.h | 3 ++ src/Magnum/Framebuffer.cpp | 9 +++- src/Magnum/Framebuffer.h | 23 ++++++---- .../Implementation/FramebufferState.cpp | 15 ++++++ src/Magnum/Implementation/FramebufferState.h | 2 + src/Magnum/Test/FramebufferGLTest.cpp | 5 +- .../OpenGL/GLES2/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES2/flextGL.cpp | 3 ++ src/MagnumExternal/OpenGL/GLES2/flextGL.h | 42 +++++++++++++++++ .../OpenGL/GLES2/flextGLEmscripten.h | 41 +++++++++++++++++ src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h | 44 ++++++++++++++++++ .../OpenGL/GLES2/flextGLPlatform.cpp | 3 ++ 18 files changed, 230 insertions(+), 60 deletions(-) diff --git a/doc/opengl-support.dox b/doc/opengl-support.dox index 550d0866d..0c31ce66b 100644 --- a/doc/opengl-support.dox +++ b/doc/opengl-support.dox @@ -304,6 +304,7 @@ Extension | Status @es_extension{EXT,texture_rg} | done @es_extension{EXT,texture_storage} | done @es_extension{EXT,map_buffer_range} | done +@es_extension{EXT,draw_buffers} | done @es_extension{EXT,instanced_arrays} | done @es_extension2{EXT,draw_instanced,draw_instanced} | done @es_extension{NV,draw_buffers} | done diff --git a/src/Magnum/AbstractFramebuffer.cpp b/src/Magnum/AbstractFramebuffer.cpp index a55f34fee..e63d66cae 100644 --- a/src/Magnum/AbstractFramebuffer.cpp +++ b/src/Magnum/AbstractFramebuffer.cpp @@ -49,7 +49,8 @@ Vector2i AbstractFramebuffer::maxViewportSize() { Int AbstractFramebuffer::maxDrawBuffers() { #ifdef MAGNUM_TARGET_GLES2 - if(!Context::current()->isExtensionSupported()) + if(!Context::current()->isExtensionSupported() && + !Context::current()->isExtensionSupported()) return 0; #endif @@ -60,7 +61,7 @@ Int AbstractFramebuffer::maxDrawBuffers() { #ifndef MAGNUM_TARGET_GLES2 glGetIntegerv(GL_MAX_DRAW_BUFFERS, &value); #else - glGetIntegerv(GL_MAX_DRAW_BUFFERS_NV, &value); + glGetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &value); #endif } @@ -358,18 +359,11 @@ GLenum AbstractFramebuffer::checkStatusImplementationDSAEXT(const FramebufferTar } #endif +#ifndef MAGNUM_TARGET_GLES2 void AbstractFramebuffer::drawBuffersImplementationDefault(GLsizei count, const GLenum* buffers) { bindInternal(FramebufferTarget::Draw); - #ifndef MAGNUM_TARGET_GLES2 glDrawBuffers(count, buffers); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glDrawBuffersNV(count, buffers); - #else - static_cast(count); - static_cast(buffers); - CORRADE_ASSERT_UNREACHABLE(); - #endif } #ifndef MAGNUM_TARGET_GLES @@ -382,23 +376,39 @@ void AbstractFramebuffer::drawBuffersImplementationDSAEXT(GLsizei count, const G glFramebufferDrawBuffersEXT(_id, count, buffers); } #endif +#else +void AbstractFramebuffer::drawBuffersImplementationEXT(GLsizei count, const GLenum* buffers) { + bindInternal(FramebufferTarget::Draw); -void AbstractFramebuffer::drawBufferImplementationDefault(GLenum buffer) { + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) + glDrawBuffersEXT(count, buffers); + #else + static_cast(count); + static_cast(buffers); + CORRADE_ASSERT_UNREACHABLE(); + #endif +} + +void AbstractFramebuffer::drawBuffersImplementationNV(GLsizei count, const GLenum* buffers) { bindInternal(FramebufferTarget::Draw); - #ifndef MAGNUM_TARGET_GLES - glDrawBuffer(buffer); - #elif !defined(MAGNUM_TARGET_GLES2) - glDrawBuffers(1, &buffer); - #elif !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) - glDrawBuffersNV(1, &buffer); + #if !defined(CORRADE_TARGET_EMSCRIPTEN) && !defined(CORRADE_TARGET_NACL) + glDrawBuffersNV(count, buffers); #else - static_cast(buffer); + static_cast(count); + static_cast(buffers); CORRADE_ASSERT_UNREACHABLE(); #endif } +#endif #ifndef MAGNUM_TARGET_GLES +void AbstractFramebuffer::drawBufferImplementationDefault(GLenum buffer) { + bindInternal(FramebufferTarget::Draw); + + glDrawBuffer(buffer); +} + void AbstractFramebuffer::drawBufferImplementationDSA(const GLenum buffer) { glNamedFramebufferDrawBuffer(_id, buffer); } diff --git a/src/Magnum/AbstractFramebuffer.h b/src/Magnum/AbstractFramebuffer.h index 9b005f8a2..0e3c1dfbc 100644 --- a/src/Magnum/AbstractFramebuffer.h +++ b/src/Magnum/AbstractFramebuffer.h @@ -197,8 +197,8 @@ class MAGNUM_EXPORT AbstractFramebuffer { * @brief Max supported draw buffer count * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If ES extension @extension{NV,draw_buffers} is not - * available, returns `0`. + * OpenGL calls. In OpenGL ES 2.0, if neither @es_extension{EXT,draw_buffers} + * nor @es_extension{NV,draw_buffers} is available, returns `0`. * @see @ref DefaultFramebuffer::mapForDraw(), @ref Framebuffer::mapForDraw(), * @fn_gl{Get} with @def_gl{MAX_DRAW_BUFFERS} */ @@ -424,14 +424,19 @@ class MAGNUM_EXPORT AbstractFramebuffer { GLenum MAGNUM_LOCAL checkStatusImplementationDSAEXT(FramebufferTarget target); #endif + #ifndef MAGNUM_TARGET_GLES2 void MAGNUM_LOCAL drawBuffersImplementationDefault(GLsizei count, const GLenum* buffers); #ifndef MAGNUM_TARGET_GLES void MAGNUM_LOCAL drawBuffersImplementationDSA(GLsizei count, const GLenum* buffers); void MAGNUM_LOCAL drawBuffersImplementationDSAEXT(GLsizei count, const GLenum* buffers); #endif + #else + void MAGNUM_LOCAL drawBuffersImplementationEXT(GLsizei count, const GLenum* buffers); + void MAGNUM_LOCAL drawBuffersImplementationNV(GLsizei count, const GLenum* buffers); + #endif - void MAGNUM_LOCAL drawBufferImplementationDefault(GLenum buffer); #ifndef MAGNUM_TARGET_GLES + void MAGNUM_LOCAL drawBufferImplementationDefault(GLenum buffer); void MAGNUM_LOCAL drawBufferImplementationDSA(GLenum buffer); void MAGNUM_LOCAL drawBufferImplementationDSAEXT(GLenum buffer); #endif diff --git a/src/Magnum/Context.cpp b/src/Magnum/Context.cpp index bde8f2f04..519d4ba98 100644 --- a/src/Magnum/Context.cpp +++ b/src/Magnum/Context.cpp @@ -266,6 +266,7 @@ const std::vector& Extension::extensions(Version version) { _extension(GL,EXT,texture_rg), _extension(GL,EXT,texture_storage), _extension(GL,EXT,map_buffer_range), + _extension(GL,EXT,draw_buffers), _extension(GL,EXT,instanced_arrays), _extension(GL,EXT,draw_instanced), _extension(GL,NV,draw_buffers), diff --git a/src/Magnum/DefaultFramebuffer.cpp b/src/Magnum/DefaultFramebuffer.cpp index 5f7e47dd1..3ec5a2d88 100644 --- a/src/Magnum/DefaultFramebuffer.cpp +++ b/src/Magnum/DefaultFramebuffer.cpp @@ -45,7 +45,6 @@ DefaultFramebuffer::Status DefaultFramebuffer::checkStatus(const FramebufferTarg return Status((this->*Context::current()->state().framebuffer->checkStatusImplementation)(target)); } -#ifndef MAGNUM_TARGET_GLES2 DefaultFramebuffer& DefaultFramebuffer::mapForDraw(std::initializer_list> attachments) { /* Max attachment location */ std::size_t max = 0; @@ -64,10 +63,13 @@ DefaultFramebuffer& DefaultFramebuffer::mapForDraw(std::initializer_list*Context::current()->state().framebuffer->drawBufferImplementation)(GLenum(attachment)); + #else + (this->*Context::current()->state().framebuffer->drawBuffersImplementation)(1, reinterpret_cast(&attachment)); + #endif return *this; } -#endif DefaultFramebuffer& DefaultFramebuffer::mapForRead(const ReadAttachment attachment) { (this->*Context::current()->state().framebuffer->readBufferImplementation)(GLenum(attachment)); diff --git a/src/Magnum/DefaultFramebuffer.h b/src/Magnum/DefaultFramebuffer.h index 3586dbf94..83d9d942c 100644 --- a/src/Magnum/DefaultFramebuffer.h +++ b/src/Magnum/DefaultFramebuffer.h @@ -105,13 +105,12 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { #endif }; - #ifndef MAGNUM_TARGET_GLES2 /** * @brief Draw attachment * * @see @ref mapForDraw() - * @requires_gles30 Draw attachments for default framebuffer are - * available only in OpenGL ES 3.0. + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} in OpenGL + * ES 2.0. */ enum class DrawAttachment: GLenum { /** Don't use the output. */ @@ -150,24 +149,11 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { * @ref DrawAttachment::BackLeft. */ #ifdef MAGNUM_TARGET_GLES - Back = GL_BACK, - #else - Back = GL_BACK_LEFT, - #endif - - /** - * Write output to front buffer. - * - * On desktop OpenGL, this is equal to - * @ref DrawAttachment::FrontLeft. - */ - #ifdef MAGNUM_TARGET_GLES - Front = GL_FRONT + Back = GL_BACK #else - Front = GL_FRONT_LEFT + Back = GL_BACK_LEFT #endif }; - #endif /** * @brief Read attachment @@ -328,7 +314,6 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { */ Status checkStatus(FramebufferTarget target); - #ifndef MAGNUM_TARGET_GLES2 /** * @brief Map shader outputs to buffer attachment * @return Reference to self (for method chaining) @@ -338,7 +323,7 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { * can achieve the same by passing @ref DrawAttachment::None as * attachment. Example usage: * @code - * defaultFramebuffer.mapForDraw({{MyShader::ColorOutput, DefaultFramebuffer::DrawAttachment::BackLeft}, + * defaultFramebuffer.mapForDraw({{MyShader::ColorOutput, DefaultFramebuffer::DrawAttachment::Back}, * {MyShader::NormalOutput, DefaultFramebuffer::DrawAttachment::None}}); * @endcode * @@ -349,8 +334,8 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { * @ref mapForRead(), @fn_gl2{NamedFramebufferDrawBuffers,DrawBuffers}, * @fn_gl_extension{FramebufferDrawBuffers,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and @fn_gl{DrawBuffers} - * @requires_gles30 Draw attachments for default framebuffer are - * available only in OpenGL ES 3.0. + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} in OpenGL + * ES 2.0. */ DefaultFramebuffer& mapForDraw(std::initializer_list> attachments); @@ -369,11 +354,10 @@ class MAGNUM_EXPORT DefaultFramebuffer: public AbstractFramebuffer { * @fn_gl_extension{FramebufferDrawBuffer,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and @fn_gl{DrawBuffer} or * @fn_gl{DrawBuffers} in OpenGL ES 3.0 - * @requires_gles30 Draw attachments for default framebuffer are - * available only in OpenGL ES 3.0. + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} in OpenGL + * ES 2.0. */ DefaultFramebuffer& mapForDraw(DrawAttachment attachment); - #endif /** * @brief Map given attachment for reading diff --git a/src/Magnum/Extensions.h b/src/Magnum/Extensions.h index f2b690cc7..6818e4983 100644 --- a/src/Magnum/Extensions.h +++ b/src/Magnum/Extensions.h @@ -285,6 +285,9 @@ namespace GL { _extension(GL,EXT,map_buffer_range, GLES200, GLES300) // #121 #endif _extension(GL,EXT,disjoint_timer_query, GLES200, None) // #150 + #ifdef MAGNUM_TARGET_GLES2 + _extension(GL,EXT,draw_buffers, GLES200, GLES300) // #151 + #endif _extension(GL,EXT,texture_sRGB_decode, GLES200, None) // #152 #ifdef MAGNUM_TARGET_GLES2 _extension(GL,EXT,instanced_arrays, GLES200, GLES300) // #156 diff --git a/src/Magnum/Framebuffer.cpp b/src/Magnum/Framebuffer.cpp index 87421e253..ab23128c2 100644 --- a/src/Magnum/Framebuffer.cpp +++ b/src/Magnum/Framebuffer.cpp @@ -62,7 +62,8 @@ const Framebuffer::InvalidationAttachment Framebuffer::InvalidationAttachment::S Int Framebuffer::maxColorAttachments() { #ifdef MAGNUM_TARGET_GLES2 - if(!Context::current()->isExtensionSupported()) + if(!Context::current()->isExtensionSupported() && + !Context::current()->isExtensionSupported()) return 0; #endif @@ -72,7 +73,7 @@ Int Framebuffer::maxColorAttachments() { #ifndef MAGNUM_TARGET_GLES2 glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &value); #else - glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_NV, &value); + glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &value); #endif } @@ -153,7 +154,11 @@ Framebuffer& Framebuffer::mapForDraw(std::initializer_list*Context::current()->state().framebuffer->drawBufferImplementation)(GLenum(attachment)); + #else + (this->*Context::current()->state().framebuffer->drawBuffersImplementation)(1, reinterpret_cast(&attachment)); + #endif return *this; } diff --git a/src/Magnum/Framebuffer.h b/src/Magnum/Framebuffer.h index 6088af23e..cec6538b2 100644 --- a/src/Magnum/Framebuffer.h +++ b/src/Magnum/Framebuffer.h @@ -102,7 +102,6 @@ and @ref attachTextureLayer() use DSA to avoid unnecessary calls to information. @requires_gl30 Extension @extension{ARB,framebuffer_object} -@todo `MAX_COLOR_ATTACHMENTS` */ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObject { friend Implementation::FramebufferState; @@ -114,6 +113,10 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @see @ref mapForDraw(), @ref attachRenderbuffer(), * @ref attachTexture(), @ref attachCubeMapTexture(), * @ref attachTextureLayer() + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} or + * @es_extension{NV,draw_buffers} for @ref mapForDraw() and + * extension @es_extension{NV,fbo_color_attachments} for `attach*()` + * in OpenGL ES 2.0. */ class ColorAttachment { friend Framebuffer; @@ -122,9 +125,6 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje /** * @brief Constructor * @param id Color attachment ID - * - * @requires_gles30 Extension @es_extension{NV,fbo_color_attachments} - * is required for @p id greater than 0 in OpenGL ES 2.0 */ constexpr explicit ColorAttachment(UnsignedInt id): attachment(GL_COLOR_ATTACHMENT0 + id) {} @@ -140,6 +140,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @brief Draw attachment * * @see @ref mapForDraw() + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} or + * @es_extension{NV,draw_buffers} in OpenGL ES 2.0. */ class DrawAttachment { public: @@ -164,6 +166,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * * @see @ref attachRenderbuffer(), @ref attachTexture(), * @ref attachCubeMapTexture(), @ref attachTextureLayer() + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} or + * @es_extension{NV,fbo_color_attachments} in OpenGL ES 2.0. */ class MAGNUM_EXPORT BufferAttachment { public: @@ -293,8 +297,9 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @brief Max supported color attachment count * * The result is cached, repeated queries don't result in repeated - * OpenGL calls. If neither OpenGL ES 3.0 nor ES extension - * @extension{NV,fbo_color_attachments} is available, returns `0`. + * OpenGL calls. In OpenGL ES 2.0, if neither @es_extension{EXT,draw_buffers} + * nor @es_extension{NV,fbo_color_attachments} extension is available, + * returns `0`. * @see @ref mapForDraw(), @fn_gl{Get} with @def_gl{MAX_COLOR_ATTACHMENTS} */ static Int maxColorAttachments(); @@ -404,8 +409,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @fn_gl2{NamedFramebufferDrawBuffers,DrawBuffers}, * @fn_gl_extension{FramebufferDrawBuffers,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and @fn_gl{DrawBuffers} - * @requires_gles30 Extension @es_extension2{NV,draw_buffers,GL_NV_draw_buffers} - * in OpenGL ES 2.0 + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} or + * @es_extension{NV,draw_buffers} in OpenGL ES 2.0. */ Framebuffer& mapForDraw(std::initializer_list> attachments); @@ -425,6 +430,8 @@ class MAGNUM_EXPORT Framebuffer: public AbstractFramebuffer, public AbstractObje * @fn_gl_extension{FramebufferDrawBuffer,EXT,direct_state_access}, * eventually @fn_gl{BindFramebuffer} and @fn_gl{DrawBuffer} (or * @fn_gl{DrawBuffers} in OpenGL ES) + * @requires_gles30 Extension @es_extension{EXT,draw_buffers} or + * @es_extension{NV,draw_buffers} in OpenGL ES 2.0. */ Framebuffer& mapForDraw(DrawAttachment attachment); diff --git a/src/Magnum/Implementation/FramebufferState.cpp b/src/Magnum/Implementation/FramebufferState.cpp index b10210775..8be1483b3 100644 --- a/src/Magnum/Implementation/FramebufferState.cpp +++ b/src/Magnum/Implementation/FramebufferState.cpp @@ -90,8 +90,12 @@ FramebufferState::FramebufferState(Context& context, std::vector& e #endif { checkStatusImplementation = &AbstractFramebuffer::checkStatusImplementationDefault; + #ifndef MAGNUM_TARGET_GLES2 drawBuffersImplementation = &AbstractFramebuffer::drawBuffersImplementationDefault; + #endif + #ifndef MAGNUM_TARGET_GLES drawBufferImplementation = &AbstractFramebuffer::drawBufferImplementationDefault; + #endif readBufferImplementation = &AbstractFramebuffer::readBufferImplementationDefault; renderbufferImplementation = &Framebuffer::renderbufferImplementationDefault; @@ -134,6 +138,17 @@ FramebufferState::FramebufferState(Context& context, std::vector& e bindInternalImplementation = &Framebuffer::bindImplementationSingle; checkStatusImplementation = &Framebuffer::checkStatusImplementationSingle; } + + /* Framebuffer draw mapping on ES2 */ + if(context.isExtensionSupported()) { + extensions.push_back(Extensions::GL::EXT::draw_buffers::string()); + + drawBuffersImplementation = &AbstractFramebuffer::drawBuffersImplementationEXT; + } else if(context.isExtensionSupported()) { + extensions.push_back(Extensions::GL::NV::draw_buffers::string()); + + drawBuffersImplementation = &AbstractFramebuffer::drawBuffersImplementationNV; + } else drawBuffersImplementation = nullptr; #endif /* Framebuffer reading implementation */ diff --git a/src/Magnum/Implementation/FramebufferState.h b/src/Magnum/Implementation/FramebufferState.h index e2e44c470..50d612254 100644 --- a/src/Magnum/Implementation/FramebufferState.h +++ b/src/Magnum/Implementation/FramebufferState.h @@ -42,7 +42,9 @@ struct FramebufferState { void(*blitImplementation)(AbstractFramebuffer&, AbstractFramebuffer&, const Range2Di&, const Range2Di&, FramebufferBlitMask, FramebufferBlitFilter); GLenum(AbstractFramebuffer::*checkStatusImplementation)(FramebufferTarget); void(AbstractFramebuffer::*drawBuffersImplementation)(GLsizei, const GLenum*); + #ifndef MAGNUM_TARGET_GLES void(AbstractFramebuffer::*drawBufferImplementation)(GLenum); + #endif void(AbstractFramebuffer::*readBufferImplementation)(GLenum); void(AbstractFramebuffer::*invalidateImplementation)(GLsizei, const GLenum*); #ifndef MAGNUM_TARGET_GLES2 diff --git a/src/Magnum/Test/FramebufferGLTest.cpp b/src/Magnum/Test/FramebufferGLTest.cpp index a96576b3d..4c31f937a 100644 --- a/src/Magnum/Test/FramebufferGLTest.cpp +++ b/src/Magnum/Test/FramebufferGLTest.cpp @@ -613,8 +613,9 @@ void FramebufferGLTest::multipleColorOutputs() { if(!Context::current()->isExtensionSupported()) CORRADE_SKIP(Extensions::GL::ARB::framebuffer_object::string() + std::string(" is not available.")); #elif defined(MAGNUM_TARGET_GLES2) - if(!Context::current()->isExtensionSupported()) - CORRADE_SKIP(Extensions::GL::NV::draw_buffers::string() + std::string(" is not available.")); + if(!Context::current()->isExtensionSupported() && + !Context::current()->isExtensionSupported()) + CORRADE_SKIP("No required extension available."); #endif Texture2D color1; diff --git a/src/MagnumExternal/OpenGL/GLES2/extensions.txt b/src/MagnumExternal/OpenGL/GLES2/extensions.txt index b94c65355..ea1a2e402 100644 --- a/src/MagnumExternal/OpenGL/GLES2/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES2/extensions.txt @@ -18,6 +18,7 @@ extension EXT_shadow_samplers optional extension EXT_texture_rg optional extension EXT_texture_storage optional extension EXT_map_buffer_range optional +extension EXT_draw_buffers optional extension EXT_instanced_arrays optional extension EXT_draw_instanced optional extension NV_draw_buffers optional diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp index 5e05d9df1..bb66db1ed 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp +++ b/src/MagnumExternal/OpenGL/GLES2/flextGL.cpp @@ -46,6 +46,9 @@ FLEXTGL_EXPORT void(APIENTRY *flextglTextureStorage3DEXT)(GLuint, GLenum, GLsize FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr, GLbitfield) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr) = nullptr; +/* GL_EXT_draw_buffers */ +FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersEXT)(GLsizei, const GLenum *) = nullptr; + /* GL_EXT_instanced_arrays */ FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedEXT)(GLenum, GLint, GLsizei, GLsizei) = nullptr; FLEXTGL_EXPORT void(APIENTRY *flextglDrawElementsInstancedEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei) = nullptr; diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGL.h b/src/MagnumExternal/OpenGL/GLES2/flextGL.h index ba2e460e3..2953dc805 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGL.h @@ -503,6 +503,43 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +/* GL_EXT_draw_buffers */ + +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + /* GL_EXT_instanced_arrays */ #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE @@ -1101,6 +1138,11 @@ GLAPI FLEXTGL_EXPORT void *(APIENTRY *flextglMapBufferRangeEXT)(GLenum, GLintptr GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFlushMappedBufferRangeEXT)(GLenum, GLintptr, GLsizeiptr); #define glFlushMappedBufferRangeEXT flextglFlushMappedBufferRangeEXT +/* GL_EXT_draw_buffers */ + +GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffersEXT)(GLsizei, const GLenum *); +#define glDrawBuffersEXT flextglDrawBuffersEXT + /* GL_EXT_instanced_arrays */ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArraysInstancedEXT)(GLenum, GLint, GLsizei, GLsizei); diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h b/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h index ca0e45321..4744fb772 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLEmscripten.h @@ -477,6 +477,43 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +/* GL_EXT_draw_buffers */ + +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + /* GL_EXT_instanced_arrays */ #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE @@ -1051,6 +1088,10 @@ GLAPI void glTextureStorage3DEXT(GLuint, GLenum, GLsizei, GLenum, GLsizei, GLsiz GLAPI void * glMapBufferRangeEXT(GLenum, GLintptr, GLsizeiptr, GLbitfield); GLAPI void glFlushMappedBufferRangeEXT(GLenum, GLintptr, GLsizeiptr); +/* GL_EXT_draw_buffers */ + +GLAPI void glDrawBuffersEXT(GLsizei, const GLenum *); + /* GL_EXT_instanced_arrays */ GLAPI void glDrawArraysInstancedEXT(GLenum, GLint, GLsizei, GLsizei); diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h index eef489cb3..8bcba8b29 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLNaCl.h @@ -478,6 +478,43 @@ typedef khronos_ssize_t GLsizeiptr; #define GL_MAP_FLUSH_EXPLICIT_BIT_EXT 0x0010 #define GL_MAP_UNSYNCHRONIZED_BIT_EXT 0x0020 +/* GL_EXT_draw_buffers */ + +#define GL_MAX_COLOR_ATTACHMENTS_EXT 0x8CDF +#define GL_MAX_DRAW_BUFFERS_EXT 0x8824 +#define GL_DRAW_BUFFER0_EXT 0x8825 +#define GL_DRAW_BUFFER1_EXT 0x8826 +#define GL_DRAW_BUFFER2_EXT 0x8827 +#define GL_DRAW_BUFFER3_EXT 0x8828 +#define GL_DRAW_BUFFER4_EXT 0x8829 +#define GL_DRAW_BUFFER5_EXT 0x882A +#define GL_DRAW_BUFFER6_EXT 0x882B +#define GL_DRAW_BUFFER7_EXT 0x882C +#define GL_DRAW_BUFFER8_EXT 0x882D +#define GL_DRAW_BUFFER9_EXT 0x882E +#define GL_DRAW_BUFFER10_EXT 0x882F +#define GL_DRAW_BUFFER11_EXT 0x8830 +#define GL_DRAW_BUFFER12_EXT 0x8831 +#define GL_DRAW_BUFFER13_EXT 0x8832 +#define GL_DRAW_BUFFER14_EXT 0x8833 +#define GL_DRAW_BUFFER15_EXT 0x8834 +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF + /* GL_EXT_instanced_arrays */ #define GL_VERTEX_ATTRIB_ARRAY_DIVISOR_EXT 0x88FE @@ -1252,6 +1289,13 @@ GL_APICALL void GL_APIENTRY GLES2FlushMappedBufferRangeEXT(GLenum, GLintptr, GLs #define glFlushMappedBufferRangeEXT GLES2FlushMappedBufferRangeEXT #endif +/* GL_EXT_draw_buffers */ +#ifndef GL_EXT_draw_buffers +#define GL_EXT_draw_buffers 1 +GL_APICALL void GL_APIENTRY GLES2DrawBuffersEXT(GLsizei, const GLenum *); +#define glDrawBuffersEXT GLES2DrawBuffersEXT +#endif + /* GL_EXT_instanced_arrays */ #ifndef GL_EXT_instanced_arrays #define GL_EXT_instanced_arrays 1 diff --git a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp index f4d1d7caa..d47d80113 100644 --- a/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp +++ b/src/MagnumExternal/OpenGL/GLES2/flextGLPlatform.cpp @@ -64,6 +64,9 @@ void flextGLInit() { flextglMapBufferRangeEXT = reinterpret_cast(loader.load("glMapBufferRangeEXT")); flextglFlushMappedBufferRangeEXT = reinterpret_cast(loader.load("glFlushMappedBufferRangeEXT")); + /* GL_EXT_draw_buffers */ + flextglDrawBuffersEXT = reinterpret_cast(loader.load("glDrawBuffersEXT")); + /* GL_EXT_instanced_arrays */ flextglDrawArraysInstancedEXT = reinterpret_cast(loader.load("glDrawArraysInstancedEXT")); flextglDrawElementsInstancedEXT = reinterpret_cast(loader.load("glDrawElementsInstancedEXT"));