From a475c92d99176f3721b83fa9d8060ef9a5bc6bda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Fri, 11 Nov 2022 22:33:17 +0100 Subject: [PATCH] GL: use Containers::Iterable also in AbstractShaderProgram::draw(). Forgot about this case in 4ff655740e6fab52783be9ef984683e7d1031395. --- doc/snippets/MagnumShaders-gl.cpp | 1 + src/Magnum/GL/AbstractShaderProgram.cpp | 10 +++----- src/Magnum/GL/AbstractShaderProgram.h | 16 ++++--------- src/Magnum/GL/Implementation/MeshState.h | 2 +- src/Magnum/GL/MeshView.cpp | 23 ++++++++++--------- src/Magnum/GL/MeshView.h | 4 ++-- .../GL/Test/AbstractShaderProgramGLTest.cpp | 3 +-- 7 files changed, 24 insertions(+), 35 deletions(-) diff --git a/doc/snippets/MagnumShaders-gl.cpp b/doc/snippets/MagnumShaders-gl.cpp index 5e5de8316..48819075f 100644 --- a/doc/snippets/MagnumShaders-gl.cpp +++ b/doc/snippets/MagnumShaders-gl.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include "Magnum/ImageView.h" diff --git a/src/Magnum/GL/AbstractShaderProgram.cpp b/src/Magnum/GL/AbstractShaderProgram.cpp index b4df952a1..b9dfc1c37 100644 --- a/src/Magnum/GL/AbstractShaderProgram.cpp +++ b/src/Magnum/GL/AbstractShaderProgram.cpp @@ -474,15 +474,15 @@ AbstractShaderProgram& AbstractShaderProgram::draw(Mesh& mesh, const Containers: #endif #endif -AbstractShaderProgram& AbstractShaderProgram::draw(Containers::ArrayView> meshes) { +AbstractShaderProgram& AbstractShaderProgram::draw(const Containers::Iterable& meshes) { if(meshes.isEmpty()) return *this; use(); #ifndef CORRADE_NO_ASSERT - const Mesh* original = &*meshes.front()->_original; + const Mesh* original = &*meshes.front()._original; for(std::size_t i = 0; i != meshes.size(); ++i) - CORRADE_ASSERT(&*meshes[i]->_original == original, "GL::AbstractShaderProgram::draw(): all meshes must be views of the same original mesh, expected" << original << "but got" << &*meshes[i]->_original << "at index" << i, *this); + CORRADE_ASSERT(&*meshes[i]._original == original, "GL::AbstractShaderProgram::draw(): all meshes must be views of the same original mesh, expected" << original << "but got" << &*meshes[i]._original << "at index" << i, *this); #endif #ifndef MAGNUM_TARGET_GLES @@ -493,10 +493,6 @@ AbstractShaderProgram& AbstractShaderProgram::draw(Containers::ArrayView> meshes) { - return draw(Containers::arrayView(meshes)); -} - #ifndef MAGNUM_TARGET_GLES AbstractShaderProgram& AbstractShaderProgram::drawTransformFeedback(Mesh& mesh, TransformFeedback& xfb, UnsignedInt stream) { /* Nothing to draw, exit without touching any state */ diff --git a/src/Magnum/GL/AbstractShaderProgram.h b/src/Magnum/GL/AbstractShaderProgram.h index afb1db82e..45bafc4d5 100644 --- a/src/Magnum/GL/AbstractShaderProgram.h +++ b/src/Magnum/GL/AbstractShaderProgram.h @@ -45,7 +45,8 @@ #ifdef MAGNUM_BUILD_DEPRECATED #include -/* For attachShaders(), which used to take a std::initializer_list */ +/* For attachShaders(), which used to take a std::initializer_list, + and draw({MeshView}) as well */ #include /* For label() / setLabel(), which used to be a std::string */ #include @@ -1254,13 +1255,7 @@ class MAGNUM_GL_EXPORT AbstractShaderProgram: public AbstractObject { * if the mesh is indexed and @ref MeshView::baseVertex() is not * `0` */ - AbstractShaderProgram& draw(Containers::ArrayView> meshes); - - /** - * @overload - * @m_since{2020,06} - */ - AbstractShaderProgram& draw(std::initializer_list> meshes); + AbstractShaderProgram& draw(const Containers::Iterable& meshes); #ifndef MAGNUM_TARGET_GLES /** @@ -2126,10 +2121,7 @@ accidental calls to } \ _MAGNUM_GL_ABSTRACTSHADERPROGRAM_SUBCLASS_DRAW_IMPLEMENTATION_NOT_32BIT(__VA_ARGS__) \ _MAGNUM_GL_ABSTRACTSHADERPROGRAM_SUBCLASS_DRAW_IMPLEMENTATION_GLES(__VA_ARGS__) \ - __VA_ARGS__& draw(Corrade::Containers::ArrayView> meshes) { \ - return static_cast<__VA_ARGS__&>(Magnum::GL::AbstractShaderProgram::draw(meshes)); \ - } \ - __VA_ARGS__& draw(std::initializer_list> meshes) { \ + __VA_ARGS__& draw(const Corrade::Containers::Iterable& meshes) { \ return static_cast<__VA_ARGS__&>(Magnum::GL::AbstractShaderProgram::draw(meshes)); \ } \ _MAGNUM_GL_ABSTRACTSHADERPROGRAM_SUBCLASS_DRAW_IMPLEMENTATION_NOT_GLES(__VA_ARGS__) diff --git a/src/Magnum/GL/Implementation/MeshState.h b/src/Magnum/GL/Implementation/MeshState.h index 07bee7b62..7b48fffb7 100644 --- a/src/Magnum/GL/Implementation/MeshState.h +++ b/src/Magnum/GL/Implementation/MeshState.h @@ -77,7 +77,7 @@ struct MeshState { #endif #ifdef MAGNUM_TARGET_GLES - void(*multiDrawViewImplementation)(Containers::ArrayView>); + void(*multiDrawViewImplementation)(const Containers::Iterable&); void(APIENTRY *multiDrawArraysImplementation)(GLenum, const GLint*, const GLsizei*, GLsizei); void(APIENTRY *multiDrawElementsImplementation)(GLenum, const GLsizei*, GLenum, const void* const*, GLsizei); #if !(defined(MAGNUM_TARGET_WEBGL) && defined(MAGNUM_TARGET_GLES2)) diff --git a/src/Magnum/GL/MeshView.cpp b/src/Magnum/GL/MeshView.cpp index a1be545d0..3a1deba49 100644 --- a/src/Magnum/GL/MeshView.cpp +++ b/src/Magnum/GL/MeshView.cpp @@ -27,6 +27,7 @@ #include #include +#include #include #include "Magnum/GL/AbstractShaderProgram.h" @@ -47,11 +48,11 @@ void MeshView::draw(AbstractShaderProgram&& shader, Containers::ArrayView> meshes) { - shader.draw(meshes); + shader.draw(Containers::arrayView(meshes)); } void MeshView::draw(AbstractShaderProgram&& shader, std::initializer_list> meshes) { - shader.draw(meshes); + shader.draw(Containers::arrayView(meshes)); } #endif @@ -85,10 +86,10 @@ MeshView& MeshView::draw(AbstractShaderProgram&& shader, TransformFeedback& xfb, #endif #endif -void MeshView::multiDrawImplementationDefault(Containers::ArrayView> meshes) { - CORRADE_INTERNAL_ASSERT(meshes.size()); +void MeshView::multiDrawImplementationDefault(const Containers::Iterable& meshes) { + CORRADE_INTERNAL_ASSERT(!meshes.isEmpty()); - Mesh& original = meshes[0]->_original; + Mesh& original = meshes.front()._original; /* Gather the parameters */ Containers::ArrayView counts; @@ -110,19 +111,19 @@ void MeshView::multiDrawImplementationDefault(Containers::ArrayView_instanceCount == 1, "GL::AbstractShaderProgram::draw(): cannot multi-draw instanced meshes", ); + CORRADE_ASSERT(meshes[i]._instanceCount == 1, "GL::AbstractShaderProgram::draw(): cannot multi-draw instanced meshes", ); - counts[i] = meshes[i]->_count; - vertexOffsets[i] = meshes[i]->_baseVertex; - indexOffsets[i] = meshes[i]->_indexOffset; - if(meshes[i]->_baseVertex) useVertexOffsets = true; + counts[i] = meshes[i]._count; + vertexOffsets[i] = meshes[i]._baseVertex; + indexOffsets[i] = meshes[i]._indexOffset; + if(meshes[i]._baseVertex) useVertexOffsets = true; } original.drawInternal(counts, useVertexOffsets ? vertexOffsets : nullptr, indexOffsets); } #ifdef MAGNUM_TARGET_GLES -void MeshView::multiDrawImplementationFallback(Containers::ArrayView> meshes) { +void MeshView::multiDrawImplementationFallback(const Containers::Iterable& meshes) { for(MeshView& mesh: meshes) { /* Nothing to draw in this mesh */ if(!mesh._count) continue; diff --git a/src/Magnum/GL/MeshView.h b/src/Magnum/GL/MeshView.h index ae7b83e46..f2560cd23 100644 --- a/src/Magnum/GL/MeshView.h +++ b/src/Magnum/GL/MeshView.h @@ -263,9 +263,9 @@ class MAGNUM_GL_EXPORT MeshView { friend AbstractShaderProgram; friend Implementation::MeshState; - static MAGNUM_GL_LOCAL void multiDrawImplementationDefault(Containers::ArrayView> meshes); + static MAGNUM_GL_LOCAL void multiDrawImplementationDefault(const Containers::Iterable& meshes); #ifdef MAGNUM_TARGET_GLES - static MAGNUM_GL_LOCAL void multiDrawImplementationFallback(Containers::ArrayView> meshes); + static MAGNUM_GL_LOCAL void multiDrawImplementationFallback(const Containers::Iterable& meshes); #endif Containers::Reference _original; diff --git a/src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp b/src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp index 261dcf71b..882f937bf 100644 --- a/src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp +++ b/src/Magnum/GL/Test/AbstractShaderProgramGLTest.cpp @@ -1192,8 +1192,7 @@ void AbstractShaderProgramGLTest::subclassDraw() { .draw(mesh, counts, instanceCounts, vertexOffsets, nullptr) #endif #endif - .draw(Containers::arrayView>({})) - .draw(std::initializer_list>{}) + .draw(Containers::Iterable{}) #ifndef MAGNUM_TARGET_GLES .drawTransformFeedback(meshNoInstances, xfb) .drawTransformFeedback(meshNoInstances, xfb, 0)