diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index b904b0866..fd9516f9d 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -38,7 +38,11 @@ public: const std::vector& getDrawables() const { return drawables; } /// Get all the completed drawables and release ownership - std::vector clearDrawables() { auto v = std::move(drawables); return v; } + std::vector clearDrawables() { + std::vector v = std::move(drawables); + drawables = {}; + return v; + } /// Get the ID of the drawable we're currently working on, if any util::SimpleIdentity getDrawableId(); diff --git a/include/mbgl/gl/drawable_gl_builder.hpp b/include/mbgl/gl/drawable_gl_builder.hpp index 639c30d07..500148742 100644 --- a/include/mbgl/gl/drawable_gl_builder.hpp +++ b/include/mbgl/gl/drawable_gl_builder.hpp @@ -13,7 +13,7 @@ class DrawableGLBuilder final : public gfx::DrawableBuilder { public: DrawableGLBuilder() { } - virtual ~DrawableGLBuilder() = default; + ~DrawableGLBuilder() override = default; const gfx::VertexAttributeArray& getVertexAttributes() const override { return vertexAttributes; } void setVertexAttributes(const VertexAttributeArrayGL& value) { vertexAttributes = value; } diff --git a/include/mbgl/gl/drawable_gl_tweaker.hpp b/include/mbgl/gl/drawable_gl_tweaker.hpp index 51d69072a..096b99f3f 100644 --- a/include/mbgl/gl/drawable_gl_tweaker.hpp +++ b/include/mbgl/gl/drawable_gl_tweaker.hpp @@ -18,9 +18,9 @@ public: DrawableGLTweaker() = default; public: - virtual ~DrawableGLTweaker() = default; + ~DrawableGLTweaker() override = default; - virtual void execute(gfx::Drawable&, const PaintParameters&) override; + void execute(gfx::Drawable&, const PaintParameters&) override; }; } // namespace gl diff --git a/include/mbgl/shaders/mtl/shader_program_mtl.hpp b/include/mbgl/shaders/mtl/shader_program_mtl.hpp index 1ca6ee770..20eb6e991 100644 --- a/include/mbgl/shaders/mtl/shader_program_mtl.hpp +++ b/include/mbgl/shaders/mtl/shader_program_mtl.hpp @@ -8,7 +8,7 @@ namespace mtl { class ShaderProgramMTL : public gfx::ShaderProgramBase { public: ShaderProgramMTL() : ShaderProgramBase() { } - virtual ~ShaderProgramMTL() = default; + ~ShaderProgramMTL() noexcept override = default; static constexpr std::string_view Name{"GenericMTLShader"}; const std::string_view typeName() const noexcept override { return Name; } diff --git a/src/mbgl/gfx/context.hpp b/src/mbgl/gfx/context.hpp index 29ed3f80a..b23654fbc 100644 --- a/src/mbgl/gfx/context.hpp +++ b/src/mbgl/gfx/context.hpp @@ -90,7 +90,7 @@ public: public: /// Activate the shader, vertex attributes, etc., specified by the drawable - virtual void setupDraw(const gfx::Drawable&) = 0; + virtual bool setupDraw(const gfx::Drawable&) = 0; }; } // namespace gfx diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index 736ead3f2..e9658dfb8 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -449,7 +449,7 @@ void Context::setDirtyState() { globalVertexArrayState.setDirty(); } -void Context::setupDraw(const gfx::Drawable& drawable) { +bool Context::setupDraw(const gfx::Drawable& drawable) { if (const auto &shader = drawable.getShader()) { const auto& shaderGL = static_cast(*shader); if (shaderGL.getGLProgramID() != program.getCurrentValue()) { @@ -471,11 +471,10 @@ void Context::setupDraw(const gfx::Drawable& drawable) { auto& vao = drawableGL.getVertexArray(); if (vao.isValid()) { bindVertexArray = vao.getID(); // glBindVertexArray - //vertexBuffer = static_cast(*drawableGL.getBuffer()).buffer.get(); - //globalVertexArrayState.indexBuffer = - // drawableGL.getIndexBuffer().getResource().buffer; + return true; } else { bindVertexArray = value::BindVertexArray::Default; + return false; } } diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 1b7fc1f3d..9b473c5b0 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -104,7 +104,7 @@ public: void setCleanupOnDestruction(bool cleanup) { cleanupOnDestruction = cleanup; } - void setupDraw(const gfx::Drawable&) override; + bool setupDraw(const gfx::Drawable&) override; private: RendererBackend& backend; diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index 0f89cce98..d69403509 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -88,6 +88,9 @@ void Renderer::Impl::render(const RenderTree& renderTree) { const auto& sourceRenderItems = renderTree.getSourceRenderItems(); const auto& layerRenderItems = renderTree.getLayerRenderItems(); + // Run changes + orchestrator.processChanges(); + // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. { @@ -139,6 +142,7 @@ void Renderer::Impl::render(const RenderTree& renderTree) { auto& glContext = static_cast(context); auto vertexArray = glContext.createVertexArray(); vertexArray.bind(glContext, indexBuffer, bindings); + glContext.bindVertexArray = gl::value::BindVertexArray::Default; drawableGL.setVertexArray(std::move(vertexArray), std::move(vertexBuffer), @@ -195,9 +199,6 @@ void Renderer::Impl::render(const RenderTree& renderTree) { parameters.depthRangeSize = 1 - (layerRenderItems.size() + 2) * parameters.numSublayers * parameters.depthEpsilon; - // Run changes - orchestrator.processChanges(); - // - OPAQUE PASS ------------------------------------------------------------------------------- // Render everything top-to-bottom by using reverse iterators. Render opaque objects first. { @@ -238,7 +239,9 @@ void Renderer::Impl::render(const RenderTree& renderTree) { for (const auto &pair : orchestrator.getDrawables()) { const auto& drawable = *pair.second; - context.setupDraw(drawable); + if (!context.setupDraw(drawable)) { + continue; + } mat4 matrix = drawable.getMatrix(); if (drawable.getTileID()) { @@ -254,11 +257,6 @@ void Renderer::Impl::render(const RenderTree& renderTree) { } drawable.draw(parameters); - - //static_cast(context).program = 0; - //static_cast(context).bindVertexArray = 0; - //static_cast(context).vertexBuffer = 0; - //static_cast(context).globalVertexArrayState.indexBuffer = 0; } } diff --git a/src/mbgl/util/identity.cpp b/src/mbgl/util/identity.cpp index dc8cc2913..9580db97e 100644 --- a/src/mbgl/util/identity.cpp +++ b/src/mbgl/util/identity.cpp @@ -4,7 +4,7 @@ namespace { // This is not in the class declaration to minimize include dependencies - static std::atomic nextId = 1; + std::atomic nextId = 1; } // anonymous namespace namespace mbgl {