diff --git a/src/Magnum/GL/Implementation/MeshState.cpp b/src/Magnum/GL/Implementation/MeshState.cpp index 7387d7dba..d3922bc8b 100644 --- a/src/Magnum/GL/Implementation/MeshState.cpp +++ b/src/Magnum/GL/Implementation/MeshState.cpp @@ -288,7 +288,7 @@ MeshState::MeshState(Context& context, ContextState& contextState, Containers::S instance counts because there's no non-instanced variant. Only available since 2.0.5: https://github.com/emscripten-core/emscripten/pull/12282 */ #if __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ >= 20005 - multiDrawElementsBaseVertexImplementation = MeshView::multiDrawElementsBaseVertexImplementationANGLE; + multiDrawElementsBaseVertexImplementation = Mesh::multiDrawElementsBaseVertexImplementationANGLE; #else /* In Context::setupDriverWorkarounds() we make sure the extension is not even advertised, so this shouldn't be reached. */ @@ -297,7 +297,7 @@ MeshState::MeshState(Context& context, ContextState& contextState, Containers::S } else #endif { - multiDrawElementsBaseVertexImplementation = MeshView::multiDrawElementsBaseVertexImplementationAssert; + multiDrawElementsBaseVertexImplementation = Mesh::multiDrawElementsBaseVertexImplementationAssert; } #endif diff --git a/src/Magnum/GL/Mesh.cpp b/src/Magnum/GL/Mesh.cpp index 9cc3c7de3..c0eeaea27 100644 --- a/src/Magnum/GL/Mesh.cpp +++ b/src/Magnum/GL/Mesh.cpp @@ -1158,4 +1158,25 @@ void Mesh::drawElementsInstancedBaseVertexImplementationAssert(GLenum, GLsizei, #endif #endif +#ifdef MAGNUM_TARGET_GLES +#if defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) && __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ >= 20005 +void Mesh::multiDrawElementsBaseVertexImplementationANGLE(const GLenum mode, const GLsizei* const count, const GLenum type, const void* const* const indices, const GLsizei drawCount, const GLint* const baseVertex) { + /** @todo merge with the allocation in multiDrawImplementationDefault */ + Containers::ArrayView instanceCount; + Containers::ArrayView baseInstance; + Containers::ArrayTuple data{ + {NoInit, std::size_t(drawCount), instanceCount}, + {ValueInit, std::size_t(drawCount), baseInstance}, + }; + for(GLsizei& i: instanceCount) i = 1; + + glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(mode, count, type, indices, instanceCount, baseVertex, baseInstance, drawCount); +} +#endif + +void Mesh::multiDrawElementsBaseVertexImplementationAssert(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei, const GLint*) { + CORRADE_ASSERT_UNREACHABLE("GL::AbstractShaderProgram::draw(): no extension available for indexed mesh multi-draw with base vertex specification", ); +} +#endif + }} diff --git a/src/Magnum/GL/Mesh.h b/src/Magnum/GL/Mesh.h index e919bed5d..30d16f3f4 100644 --- a/src/Magnum/GL/Mesh.h +++ b/src/Magnum/GL/Mesh.h @@ -1195,6 +1195,13 @@ class MAGNUM_GL_EXPORT Mesh: public AbstractObject { #endif #endif + #ifdef MAGNUM_TARGET_GLES + #if defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) && __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ >= 20005 + static MAGNUM_GL_LOCAL void multiDrawElementsBaseVertexImplementationANGLE(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawCount, const GLint* baseVertex); + #endif + static MAGNUM_GL_LOCAL void multiDrawElementsBaseVertexImplementationAssert(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei, const GLint*); + #endif + /* _id, _primitive, _flags set from constructors */ GLuint _id; MeshPrimitive _primitive; diff --git a/src/Magnum/GL/MeshView.cpp b/src/Magnum/GL/MeshView.cpp index 04f847e59..7df7c0e22 100644 --- a/src/Magnum/GL/MeshView.cpp +++ b/src/Magnum/GL/MeshView.cpp @@ -138,25 +138,4 @@ void MeshView::multiDrawImplementationFallback(Containers::ArrayView= 20005 -void MeshView::multiDrawElementsBaseVertexImplementationANGLE(const GLenum mode, const GLsizei* const count, const GLenum type, const void* const* const indices, const GLsizei drawCount, const GLint* const baseVertex) { - /** @todo merge with the allocation in multiDrawImplementationDefault */ - Containers::ArrayView instanceCount; - Containers::ArrayView baseInstance; - Containers::ArrayTuple data{ - {NoInit, std::size_t(drawCount), instanceCount}, - {ValueInit, std::size_t(drawCount), baseInstance}, - }; - for(GLsizei& i: instanceCount) i = 1; - - glMultiDrawElementsInstancedBaseVertexBaseInstanceANGLE(mode, count, type, indices, instanceCount, baseVertex, baseInstance, drawCount); -} -#endif - -void MeshView::multiDrawElementsBaseVertexImplementationAssert(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei, const GLint*) { - CORRADE_ASSERT_UNREACHABLE("GL::AbstractShaderProgram::draw(): no extension available for indexed mesh multi-draw with base vertex specification", ); -} -#endif - }} diff --git a/src/Magnum/GL/MeshView.h b/src/Magnum/GL/MeshView.h index 7f1bfa5c4..6c5049543 100644 --- a/src/Magnum/GL/MeshView.h +++ b/src/Magnum/GL/MeshView.h @@ -268,13 +268,6 @@ class MAGNUM_GL_EXPORT MeshView { static MAGNUM_GL_LOCAL void multiDrawImplementationFallback(Containers::ArrayView> meshes); #endif - #ifdef MAGNUM_TARGET_GLES - #if defined(MAGNUM_TARGET_WEBGL) && !defined(MAGNUM_TARGET_GLES2) && __EMSCRIPTEN_major__*10000 + __EMSCRIPTEN_minor__*100 + __EMSCRIPTEN_tiny__ >= 20005 - static MAGNUM_GL_LOCAL void multiDrawElementsBaseVertexImplementationANGLE(GLenum mode, const GLsizei* count, GLenum type, const void* const* indices, GLsizei drawCount, const GLint* baseVertex); - #endif - static MAGNUM_GL_LOCAL void multiDrawElementsBaseVertexImplementationAssert(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei, const GLint*); - #endif - Containers::Reference _original; bool _countSet{};