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"));