From 43baa4502e5d7a863f8cfbe7819bb5da40c3e411 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 20 Feb 2026 00:55:53 +0100 Subject: [PATCH] GL: support EXT_base_instance on GLES. Somehow I overlooked this extension back when implementing multidraw, or maybe it was intentional because ANGLE supported multidraw but not this extension. --- doc/changelog.dox | 2 + src/Magnum/GL/AbstractShaderProgram.h | 8 ++ src/Magnum/GL/Context.cpp | 3 + src/Magnum/GL/Extensions.h | 73 ++++++++++--------- src/Magnum/GL/Implementation/MeshState.cpp | 9 ++- src/Magnum/GL/Mesh.h | 3 +- src/Magnum/GL/Test/MeshGLTest.cpp | 21 ++++-- .../OpenGL/GLES3/extensions.txt | 1 + src/MagnumExternal/OpenGL/GLES3/flextGL.h | 12 +++ .../OpenGL/GLES3/flextGLPlatform.cpp | 5 ++ .../OpenGL/GLES3/flextGLPlatformIOS.cpp | 10 +++ .../GLES3/flextGLPlatformWindowsDesktop.cpp | 5 ++ .../OpenGL/GLES3/flextGLWindowsDesktop.h | 12 +++ 13 files changed, 121 insertions(+), 43 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 4cb6f5ecc..8f395216b 100644 --- a/doc/changelog.dox +++ b/doc/changelog.dox @@ -185,6 +185,8 @@ See also: @webgl_extension{KHR,parallel_shader_compile} WebGL extension (see [mosra/magnum#534](https://github.com/mosra/magnum/issues/534) and [mosra/magnum#576](https://github.com/mosra/magnum/pull/576)) +- @ref GL::Mesh::setBaseInstance() now supports also the + @gl_extension{EXT,base_instance} extension on OpenGL ES - Recognizing ANGLE GLES and WebGL base vertex, base instance and multi-draw extensions and using them in @ref GL::AbstractShaderProgram::draw(Mesh&) and @ref GL::AbstractShaderProgram::draw(const Containers::Iterable&): diff --git a/src/Magnum/GL/AbstractShaderProgram.h b/src/Magnum/GL/AbstractShaderProgram.h index cbde33a84..122f194a9 100644 --- a/src/Magnum/GL/AbstractShaderProgram.h +++ b/src/Magnum/GL/AbstractShaderProgram.h @@ -884,6 +884,10 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { * @gl_extension{NV,instanced_arrays}, * @gl_extension{NV,draw_instanced} in OpenGL ES 2.0 if * @ref Mesh::instanceCount() is more than `1`. + * @requires_es_extension OpenGL ES 3.0 and extension + * @gl_extension{EXT,base_instance} or OpenGL ES 3.1 and extension + * @m_class{m-doc-external} [ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_base_vertex_base_instance.txt) + * if @ref Mesh::baseInstance() is not `0`. * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * in WebGL 1.0 if @ref Mesh::instanceCount() is more than `1`. * @requires_gl Specifying base vertex for indexed meshes is not @@ -920,6 +924,10 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { * @gl_extension{NV,instanced_arrays}, * @gl_extension{NV,draw_instanced} in OpenGL ES 2.0 if * @ref MeshView::instanceCount() is more than `1`. + * @requires_es_extension OpenGL ES 3.0 and extension + * @gl_extension{EXT,base_instance} or OpenGL ES 3.1 and extension + * @m_class{m-doc-external} [ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_base_vertex_base_instance.txt) + * if @ref Mesh::baseInstance() is not `0`. * @requires_webgl20 Extension @webgl_extension{ANGLE,instanced_arrays} * in WebGL 1.0 if @ref MeshView::instanceCount() is more than * `1` diff --git a/src/Magnum/GL/Context.cpp b/src/Magnum/GL/Context.cpp index 36ac6c291..a54e880e8 100644 --- a/src/Magnum/GL/Context.cpp +++ b/src/Magnum/GL/Context.cpp @@ -395,6 +395,9 @@ constexpr Extension ExtensionList[]{ Extensions::APPLE::texture_format_BGRA8888{}, Extensions::ARM::shader_framebuffer_fetch{}, Extensions::ARM::shader_framebuffer_fetch_depth_stencil{}, + #ifndef MAGNUM_TARGET_GLES2 + Extensions::EXT::base_instance{}, + #endif Extensions::EXT::blend_func_extended{}, #ifndef MAGNUM_TARGET_GLES2 Extensions::EXT::buffer_storage{}, diff --git a/src/Magnum/GL/Extensions.h b/src/Magnum/GL/Extensions.h index c42809dc8..5d0712e47 100644 --- a/src/Magnum/GL/Extensions.h +++ b/src/Magnum/GL/Extensions.h @@ -525,54 +525,57 @@ namespace ANDROID { _extension( 72,EXT,texture_view, GLES310, None) // #185 _extension( 73,EXT,primitive_bounding_box, GLES310, GLES320) // #186 #endif - _extension( 74,EXT,draw_elements_base_vertex, GLES200, None) // #204 #ifndef MAGNUM_TARGET_GLES2 - _extension( 75,EXT,multi_draw_indirect, GLES310, None) // #205 - _extension( 76,EXT,texture_norm16, GLES310, None) // #207 - _extension( 77,EXT,texture_sRGB_R8, GLES300, None) // #221 - _extension( 78,EXT,texture_sRGB_RG8, GLES300, None) // #223 - _extension( 79,EXT,buffer_storage, GLES310, None) // #239 - #endif - _extension( 80,EXT,blend_func_extended, GLES200, None) // #247 - _extension( 81,EXT,polygon_offset_clamp, GLES200, None) // #252 + _extension( 74,EXT,base_instance, GLES300, None) // #203 + #endif + _extension( 75,EXT,draw_elements_base_vertex, GLES200, None) // #204 + #ifndef MAGNUM_TARGET_GLES2 + _extension( 76,EXT,multi_draw_indirect, GLES310, None) // #205 + _extension( 77,EXT,texture_norm16, GLES310, None) // #207 + _extension( 78,EXT,texture_sRGB_R8, GLES300, None) // #221 + _extension( 79,EXT,texture_sRGB_RG8, GLES300, None) // #223 + _extension( 80,EXT,buffer_storage, GLES310, None) // #239 + #endif + _extension( 81,EXT,blend_func_extended, GLES200, None) // #247 + _extension( 82,EXT,polygon_offset_clamp, GLES200, None) // #252 #ifndef MAGNUM_TARGET_GLES2 - _extension( 82,EXT,clip_cull_distance, GLES300, None) // #257 + _extension( 83,EXT,clip_cull_distance, GLES300, None) // #257 /* The extension says "Requires ARB_texture_storage or a version of OpenGL or OpenGL ES that incorporates it." There's EXT_texture_storage on ES2, however I don't think ES2 really matters today, so it's just ES3+. */ - _extension( 83,EXT,memory_object, GLES300, None) // #280 - _extension( 84,EXT,semaphore, GLES300, None) // #280 + _extension( 84,EXT,memory_object, GLES300, None) // #280 + _extension( 85,EXT,semaphore, GLES300, None) // #280 /* These two pairs appear to be exclusive so they share the same indices */ #ifndef CORRADE_TARGET_WINDOWS - _extension( 85,EXT,memory_object_fd, GLES300, None) // #281 - _extension( 86,EXT,semaphore_fd, GLES300, None) // #281 + _extension( 84,EXT,memory_object_fd, GLES300, None) // #281 + _extension( 85,EXT,semaphore_fd, GLES300, None) // #281 #else - _extension( 85,EXT,memory_object_win32, GLES300, None) // #282 - _extension( 86,EXT,semaphore_win32, GLES300, None) // #282 + _extension( 86,EXT,memory_object_win32, GLES300, None) // #282 + _extension( 87,EXT,semaphore_win32, GLES300, None) // #282 #endif - _extension( 87,EXT,texture_compression_rgtc, GLES300, None) // #286 - _extension( 88,EXT,texture_compression_bptc, GLES300, None) // #287 + _extension( 88,EXT,texture_compression_rgtc, GLES300, None) // #286 + _extension( 89,EXT,texture_compression_bptc, GLES300, None) // #287 #endif - _extension( 89,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 - _extension( 90,EXT,clip_control, GLES200, None) // #290 - _extension( 91,EXT,texture_mirror_clamp_to_edge, GLES200, None) // #291 - _extension( 92,EXT,depth_clamp, GLES200, None) // #309 + _extension( 90,EXT,texture_compression_s3tc_srgb, GLES200, None) // #289 + _extension( 91,EXT,clip_control, GLES200, None) // #290 + _extension( 92,EXT,texture_mirror_clamp_to_edge, GLES200, None) // #291 + _extension( 93,EXT,depth_clamp, GLES200, None) // #309 } namespace IMG { - _extension( 93,IMG,texture_compression_pvrtc, GLES200, None) // #54 + _extension( 94,IMG,texture_compression_pvrtc, GLES200, None) // #54 } namespace INTEL { - _extension( 94,INTEL,blackhole_render, /*?*/ GLES200, None) // #300 + _extension( 95,INTEL,blackhole_render, /*?*/ GLES200, None) // #300 } namespace KHR { - _extension( 95,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117 - _extension( 96,KHR,texture_compression_astc_hdr,GLES200, None) // #117 - _extension( 97,KHR,debug, GLES200, GLES320) // #118 - _extension( 98,KHR,blend_equation_advanced, GLES200, GLES320) // #168 - _extension( 99,KHR,blend_equation_advanced_coherent, GLES200, None) // #168 - _extension(100,KHR,robustness, GLES200, GLES320) // #170 - _extension(101,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189 - _extension(102,KHR,context_flush_control, GLES200, None) // #191 - _extension(103,KHR,no_error, GLES200, None) // #243 - _extension(104,KHR,texture_compression_astc_sliced_3d, GLES200, None) // #249 - _extension(105,KHR,parallel_shader_compile, GLES200, None) // #288 + _extension( 96,KHR,texture_compression_astc_ldr,GLES200, GLES320) // #117 + _extension( 97,KHR,texture_compression_astc_hdr,GLES200, None) // #117 + _extension( 98,KHR,debug, GLES200, GLES320) // #118 + _extension( 99,KHR,blend_equation_advanced, GLES200, GLES320) // #168 + _extension(100,KHR,blend_equation_advanced_coherent, GLES200, None) // #168 + _extension(101,KHR,robustness, GLES200, GLES320) // #170 + _extension(102,KHR,robust_buffer_access_behavior, GLES200, GLES320) // #189 + _extension(103,KHR,context_flush_control, GLES200, None) // #191 + _extension(104,KHR,no_error, GLES200, None) // #243 + _extension(105,KHR,texture_compression_astc_sliced_3d, GLES200, None) // #249 + _extension(106,KHR,parallel_shader_compile, GLES200, None) // #288 } namespace NV { #ifdef MAGNUM_TARGET_GLES2 _extension(110,NV,draw_buffers, GLES200, GLES300) // #91 diff --git a/src/Magnum/GL/Implementation/MeshState.cpp b/src/Magnum/GL/Implementation/MeshState.cpp index edd46f013..23f73e4dd 100644 --- a/src/Magnum/GL/Implementation/MeshState.cpp +++ b/src/Magnum/GL/Implementation/MeshState.cpp @@ -216,7 +216,14 @@ MeshState::MeshState(Context& context, ContextState& contextState, Containers::S #if defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2) #ifndef MAGNUM_TARGET_WEBGL #ifndef MAGNUM_TARGET_GLES2 - if(context.isExtensionSupported()) { + if(context.isExtensionSupported()) { + extensions[Extensions::EXT::base_instance::Index] = + Extensions::EXT::base_instance::string(); + + drawArraysInstancedBaseInstanceImplementation = glDrawArraysInstancedBaseInstanceEXT; + drawElementsInstancedBaseInstanceImplementation = glDrawElementsInstancedBaseInstanceEXT; + drawElementsInstancedBaseVertexBaseInstanceImplementation = glDrawElementsInstancedBaseVertexBaseInstanceEXT; + } else if(context.isExtensionSupported()) { extensions[Extensions::ANGLE::base_vertex_base_instance::Index] = Extensions::ANGLE::base_vertex_base_instance::string(); diff --git a/src/Magnum/GL/Mesh.h b/src/Magnum/GL/Mesh.h index 3d3d0595d..51345c91b 100644 --- a/src/Magnum/GL/Mesh.h +++ b/src/Magnum/GL/Mesh.h @@ -846,7 +846,8 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { * Default is @cpp 0 @ce. * @see @ref setInstanceCount(), @ref setBaseVertex() * @requires_gl42 Extension @gl_extension{ARB,base_instance} - * @requires_es_extension OpenGL ES 3.1 and extension + * @requires_es_extension OpenGL ES 3.0 and extension + * @gl_extension{EXT,base_instance} or OpenGL ES 3.1 and extension * @m_class{m-doc-external} [ANGLE_base_vertex_base_instance](https://chromium.googlesource.com/angle/angle/+/master/extensions/ANGLE_base_vertex_base_instance.txt) * @requires_webgl_extension WebGL 2.0 and extension * @webgl_extension{WEBGL,draw_instanced_base_vertex_base_instance} diff --git a/src/Magnum/GL/Test/MeshGLTest.cpp b/src/Magnum/GL/Test/MeshGLTest.cpp index 61b2e1b05..0b35490ae 100644 --- a/src/Magnum/GL/Test/MeshGLTest.cpp +++ b/src/Magnum/GL/Test/MeshGLTest.cpp @@ -3328,8 +3328,9 @@ void MeshGLTest::setInstanceCountBaseInstance() { if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ARB::base_instance::string() << "is not supported."); #elif !defined(MAGNUM_TARGET_WEBGL) - if(!Context::current().isExtensionSupported()) - CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is not supported."); + if(!Context::current().isExtensionSupported() && + !Context::current().isExtensionSupported()) + CORRADE_SKIP("Neither" << Extensions::EXT::base_instance::string() << "nor" << Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::WEBGL::draw_instanced_base_vertex_base_instance::string() << "is not supported."); @@ -3360,6 +3361,8 @@ void MeshGLTest::setInstanceCountBaseInstance() { #ifdef MAGNUM_TARGET_GLES void MeshGLTest::setInstanceCountBaseInstanceNoExtensionAvailable() { #ifndef MAGNUM_TARGET_WEBGL + if(Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::EXT::base_instance::string() << "is supported."); if(Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else @@ -3447,8 +3450,9 @@ void MeshGLTest::setInstanceCountIndexedBaseInstance() { if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ARB::base_instance::string() << "is not supported."); #elif !defined(MAGNUM_TARGET_WEBGL) - if(!Context::current().isExtensionSupported()) - CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is not supported."); + if(!Context::current().isExtensionSupported() && + !Context::current().isExtensionSupported()) + CORRADE_SKIP("Neither" << Extensions::EXT::base_instance::string() << "nor" << Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::WEBGL::draw_instanced_base_vertex_base_instance::string() << "is not supported."); @@ -3480,6 +3484,8 @@ void MeshGLTest::setInstanceCountIndexedBaseInstance() { #ifdef MAGNUM_TARGET_GLES void MeshGLTest::setInstanceCountIndexedBaseInstanceNoExtensionAvailable() { #ifndef MAGNUM_TARGET_WEBGL + if(Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::EXT::base_instance::string() << "is supported."); if(Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else @@ -3613,8 +3619,9 @@ void MeshGLTest::setInstanceCountIndexedBaseVertexBaseInstance() { if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ARB::base_instance::string() << "is not supported."); #elif !defined(MAGNUM_TARGET_WEBGL) - if(!Context::current().isExtensionSupported()) - CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is not supported."); + if(!Context::current().isExtensionSupported() && + !Context::current().isExtensionSupported()) + CORRADE_SKIP("Neither" << Extensions::EXT::base_instance::string() << "nor" << Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else if(!Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::WEBGL::draw_instanced_base_vertex_base_instance::string() << "is not supported."); @@ -3647,6 +3654,8 @@ void MeshGLTest::setInstanceCountIndexedBaseVertexBaseInstance() { #ifdef MAGNUM_TARGET_GLES void MeshGLTest::setInstanceCountIndexedBaseVertexBaseInstanceNoExtensionAvailable() { #ifndef MAGNUM_TARGET_WEBGL + if(Context::current().isExtensionSupported()) + CORRADE_SKIP(Extensions::EXT::base_instance::string() << "is supported."); if(Context::current().isExtensionSupported()) CORRADE_SKIP(Extensions::ANGLE::base_vertex_base_instance::string() << "is supported."); #else diff --git a/src/MagnumExternal/OpenGL/GLES3/extensions.txt b/src/MagnumExternal/OpenGL/GLES3/extensions.txt index 11b123122..039b4bac2 100644 --- a/src/MagnumExternal/OpenGL/GLES3/extensions.txt +++ b/src/MagnumExternal/OpenGL/GLES3/extensions.txt @@ -68,6 +68,7 @@ extension EXT_multi_draw_indirect optional extension EXT_texture_norm16 optional extension EXT_texture_sRGB_R8 optional extension EXT_texture_sRGB_RG8 optional +extension EXT_base_instance optional extension EXT_buffer_storage optional extension EXT_blend_func_extended optional extension EXT_polygon_offset_clamp optional diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGL.h b/src/MagnumExternal/OpenGL/GLES3/flextGL.h index 0c142c89f..d4966fb41 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGL.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGL.h @@ -2222,6 +2222,12 @@ struct FlextGL { void(APIENTRY *TexParameterIuiv)(GLenum, GLenum, const GLuint *); void(APIENTRY *TexStorage3DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); + /* GL_EXT_base_instance */ + + void(APIENTRY *DrawArraysInstancedBaseInstanceEXT)(GLenum, GLint, GLsizei, GLsizei, GLuint); + void(APIENTRY *DrawElementsInstancedBaseInstanceEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLuint); + void(APIENTRY *DrawElementsInstancedBaseVertexBaseInstanceEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint, GLuint); + /* GL_EXT_blend_func_extended */ void(APIENTRY *BindFragDataLocationEXT)(GLuint, GLuint, const GLchar *); @@ -2650,6 +2656,12 @@ extern FLEXTGL_EXPORT FlextGL flextGL; #define glTexParameterIuiv flextGL.TexParameterIuiv #define glTexStorage3DMultisample flextGL.TexStorage3DMultisample +/* GL_EXT_base_instance */ + +#define glDrawArraysInstancedBaseInstanceEXT flextGL.DrawArraysInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseInstanceEXT flextGL.DrawElementsInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT flextGL.DrawElementsInstancedBaseVertexBaseInstanceEXT + /* GL_EXT_blend_func_extended */ #define glBindFragDataLocationEXT flextGL.BindFragDataLocationEXT diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp index 63cef823b..e16cbf99b 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatform.cpp @@ -168,6 +168,11 @@ void flextGLInit(Magnum::GL::Context&) { flextGL.TexParameterIuiv = reinterpret_cast(loader.load("glTexParameterIuiv")); flextGL.TexStorage3DMultisample = reinterpret_cast(loader.load("glTexStorage3DMultisample")); + /* GL_EXT_base_instance */ + flextGL.DrawArraysInstancedBaseInstanceEXT = reinterpret_cast(loader.load("glDrawArraysInstancedBaseInstanceEXT")); + flextGL.DrawElementsInstancedBaseInstanceEXT = reinterpret_cast(loader.load("glDrawElementsInstancedBaseInstanceEXT")); + flextGL.DrawElementsInstancedBaseVertexBaseInstanceEXT = reinterpret_cast(loader.load("glDrawElementsInstancedBaseVertexBaseInstanceEXT")); + /* GL_EXT_blend_func_extended */ flextGL.BindFragDataLocationEXT = reinterpret_cast(loader.load("glBindFragDataLocationEXT")); flextGL.BindFragDataLocationIndexedEXT = reinterpret_cast(loader.load("glBindFragDataLocationIndexedEXT")); diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformIOS.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformIOS.cpp index b56ca5bfa..e339af724 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformIOS.cpp +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformIOS.cpp @@ -36,6 +36,9 @@ #undef glMultiDrawElementsInstancedANGLE #undef glPolygonModeANGLE #undef glProvokingVertexANGLE +#undef glDrawArraysInstancedBaseInstanceEXT +#undef glDrawElementsInstancedBaseInstanceEXT +#undef glDrawElementsInstancedBaseVertexBaseInstanceEXT #undef glBindFragDataLocationEXT #undef glBindFragDataLocationIndexedEXT #undef glGetFragDataIndexEXT @@ -236,6 +239,13 @@ void flextGLInit(Magnum::GL::Context&) { flextGL.ProvokingVertexANGLE = reinterpret_cast(glProvokingVertexANGLE); #endif + /* GL_EXT_base_instance */ + #if GL_EXT_base_instance + flextGL.DrawArraysInstancedBaseInstanceEXT = reinterpret_cast(glDrawArraysInstancedBaseInstanceEXT); + flextGL.DrawElementsInstancedBaseInstanceEXT = reinterpret_cast(glDrawElementsInstancedBaseInstanceEXT); + flextGL.DrawElementsInstancedBaseVertexBaseInstanceEXT = reinterpret_cast(glDrawElementsInstancedBaseVertexBaseInstanceEXT); + #endif + /* GL_EXT_blend_func_extended */ #if GL_EXT_blend_func_extended flextGL.BindFragDataLocationEXT = reinterpret_cast(glBindFragDataLocationEXT); diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp index af59e9d31..2556fc196 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLPlatformWindowsDesktop.cpp @@ -370,6 +370,11 @@ void flextGLInit(Magnum::GL::Context&) { flextGL.TexParameterIuiv = reinterpret_cast(loader.load("glTexParameterIuiv")); flextGL.TexStorage3DMultisample = reinterpret_cast(loader.load("glTexStorage3DMultisample")); + /* GL_EXT_base_instance */ + flextGL.DrawArraysInstancedBaseInstanceEXT = reinterpret_cast(loader.load("glDrawArraysInstancedBaseInstanceEXT")); + flextGL.DrawElementsInstancedBaseInstanceEXT = reinterpret_cast(loader.load("glDrawElementsInstancedBaseInstanceEXT")); + flextGL.DrawElementsInstancedBaseVertexBaseInstanceEXT = reinterpret_cast(loader.load("glDrawElementsInstancedBaseVertexBaseInstanceEXT")); + /* GL_EXT_blend_func_extended */ flextGL.BindFragDataLocationEXT = reinterpret_cast(loader.load("glBindFragDataLocationEXT")); flextGL.BindFragDataLocationIndexedEXT = reinterpret_cast(loader.load("glBindFragDataLocationIndexedEXT")); diff --git a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h index 6f81c1e7e..53174d897 100644 --- a/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h +++ b/src/MagnumExternal/OpenGL/GLES3/flextGLWindowsDesktop.h @@ -2226,6 +2226,12 @@ struct FlextGL { void(APIENTRY *TexParameterIuiv)(GLenum, GLenum, const GLuint *); void(APIENTRY *TexStorage3DMultisample)(GLenum, GLsizei, GLenum, GLsizei, GLsizei, GLsizei, GLboolean); + /* GL_EXT_base_instance */ + + void(APIENTRY *DrawArraysInstancedBaseInstanceEXT)(GLenum, GLint, GLsizei, GLsizei, GLuint); + void(APIENTRY *DrawElementsInstancedBaseInstanceEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLuint); + void(APIENTRY *DrawElementsInstancedBaseVertexBaseInstanceEXT)(GLenum, GLsizei, GLenum, const void *, GLsizei, GLint, GLuint); + /* GL_EXT_blend_func_extended */ void(APIENTRY *BindFragDataLocationEXT)(GLuint, GLuint, const GLchar *); @@ -2858,6 +2864,12 @@ extern FLEXTGL_EXPORT FlextGL flextGL; #define glTexParameterIuiv flextGL.TexParameterIuiv #define glTexStorage3DMultisample flextGL.TexStorage3DMultisample +/* GL_EXT_base_instance */ + +#define glDrawArraysInstancedBaseInstanceEXT flextGL.DrawArraysInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseInstanceEXT flextGL.DrawElementsInstancedBaseInstanceEXT +#define glDrawElementsInstancedBaseVertexBaseInstanceEXT flextGL.DrawElementsInstancedBaseVertexBaseInstanceEXT + /* GL_EXT_blend_func_extended */ #define glBindFragDataLocationEXT flextGL.BindFragDataLocationEXT