diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index f59e71aa3..ce42725ae 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -109,10 +109,6 @@ public: DrawPriority getDrawPriority() const { return drawPriority; } void setDrawPriority(DrawPriority value) { drawPriority = value; } - /// The layer index determines the drawing order - int32_t getLayerIndex() const { return layerIndex; } - void setLayerIndex(int32_t value) { layerIndex = value; } - /// Determines depth range within the layer int32_t getSubLayerIndex() const { return subLayerIndex; } void setSubLayerIndex(int32_t value) { subLayerIndex = value; } @@ -162,7 +158,6 @@ protected: std::optional tileID; DrawPriority drawPriority = 0; int32_t lineWidth = 1; - int32_t layerIndex = -1; int32_t subLayerIndex = 0; DepthMaskType depthType; // = DepthMaskType::ReadOnly; @@ -176,24 +171,23 @@ protected: using DrawablePtr = std::shared_ptr; using UniqueDrawable = std::unique_ptr; -/// Comparator for sorting drawable pointers primarily by layer index -struct DrawablePtrLessByLayer { - DrawablePtrLessByLayer(bool descending) +/// Comparator for sorting drawable pointers primarily by draw priority +struct DrawableLessByPriority { + DrawableLessByPriority(bool descending) : desc(descending) {} + bool operator()(const Drawable& left, const Drawable& right) const { + const auto& a = desc ? right : left; + const auto& b = desc ? left : right; + if (a.getDrawPriority() != b.getDrawPriority()) { + return a.getDrawPriority() < b.getDrawPriority(); + } + return a.getId() < b.getId(); + } bool operator()(const DrawablePtr& left, const DrawablePtr& right) const { const auto& a = desc ? right : left; const auto& b = desc ? left : right; - if (!a || !b) { - // nulls are less than non-nulls - return (!a && b); - } - if (a->getLayerIndex() != b->getLayerIndex()) { - return a->getLayerIndex() < b->getLayerIndex(); - } - if (a->getDrawPriority() != b->getDrawPriority()) { - return a->getDrawPriority() < b->getDrawPriority(); - } - return a->getId() < b->getId(); + // nulls are less than non-nulls + return (a && b) ? operator()(*a, *b) : (!a && b); } private: diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index c9e265528..0f28cb52c 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -59,10 +59,6 @@ public: DrawPriority getDrawPriority() const; void setDrawPriority(DrawPriority); - /// The layer index assigned to generated drawables - int32_t getLayerIndex() const { return layerIndex; } - void setLayerIndex(int32_t value) { layerIndex = value; } - /// The layer index assigned to generated drawables int32_t getSubLayerIndex() const { return subLayerIndex; } void setSubLayerIndex(int32_t value) { subLayerIndex = value; } @@ -162,7 +158,6 @@ protected: mbgl::RenderPass renderPass; float lineWidth = 1.0f; DrawPriority drawPriority = 0; - int32_t layerIndex = -1; int32_t subLayerIndex = 0; DepthMaskType depthType = DepthMaskType::ReadOnly; gfx::ShaderProgramBasePtr shader; diff --git a/src/mbgl/gfx/drawable_builder.cpp b/src/mbgl/gfx/drawable_builder.cpp index 979502b98..a99cfb4dd 100644 --- a/src/mbgl/gfx/drawable_builder.cpp +++ b/src/mbgl/gfx/drawable_builder.cpp @@ -44,7 +44,6 @@ void DrawableBuilder::flush() { draw->setLineWidth(static_cast(lineWidth)); draw->setRenderPass(renderPass); draw->setDrawPriority(drawPriority); - draw->setLayerIndex(layerIndex); draw->setSubLayerIndex(subLayerIndex); draw->setDepthType(depthType); draw->setCullFaceMode(impl->cullFaceMode); diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index 8ef6209ac..73dd63fe8 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -17,6 +18,16 @@ TileLayerGroupGL::TileLayerGroupGL(int32_t layerIndex_, std::size_t initialCapac void TileLayerGroupGL::upload(gfx::Context& context, gfx::UploadPass& uploadPass) { observeDrawables([&](gfx::Drawable& drawable) { auto& drawableGL = static_cast(drawable); + +#if !defined(NDEBUG) + std::string label; + if (const auto& tileID = drawable.getTileID()) { + label = drawable.getName() + "/" + util::toString(*tileID); + } + const auto labelPtr = (label.empty() ? drawable.getName() : label).c_str(); + const auto debugGroup = uploadPass.createDebugGroup(labelPtr); +#endif + drawableGL.upload(context, uploadPass); }); } @@ -35,12 +46,14 @@ void TileLayerGroupGL::render(RenderOrchestrator&, PaintParameters& parameters) return; } +#if !defined(NDEBUG) std::string label; if (const auto& tileID = drawable.getTileID()) { label = drawable.getName() + "/" + util::toString(*tileID); } const auto labelPtr = (label.empty() ? drawable.getName() : label).c_str(); const auto debugGroup = parameters.encoder->createDebugGroup(labelPtr); +#endif drawable.draw(parameters); }); diff --git a/src/mbgl/renderer/layer_group.cpp b/src/mbgl/renderer/layer_group.cpp index 02f7e924f..69cec2abe 100644 --- a/src/mbgl/renderer/layer_group.cpp +++ b/src/mbgl/renderer/layer_group.cpp @@ -40,9 +40,6 @@ TileLayerGroup::~TileLayerGroup() {} void TileLayerGroup::updateLayerIndex(int32_t newLayerIndex) { layerIndex = newLayerIndex; - for (auto& it : impl->tileDrawables) { - it.second->setLayerIndex(newLayerIndex); - } } std::size_t TileLayerGroup::getDrawableCount() const { diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index 64a5851d0..7ec4a9a05 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -309,7 +309,6 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders, builder->setShader(shader); builder->setColorAttrMode(gfx::DrawableBuilder::ColorAttrMode::PerDrawable); builder->setDepthType(gfx::DepthMaskType::ReadWrite); - builder->setLayerIndex(layerIndex); } // Tile coordinates are fixed... diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 6620eecf4..530d6edcf 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -426,7 +426,6 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders, circleBuilder->setDepthType((renderPass == RenderPass::Opaque) ? gfx::DepthMaskType::ReadWrite : gfx::DepthMaskType::ReadOnly); circleBuilder->setCullFaceMode(gfx::CullFaceMode::disabled()); - circleBuilder->setLayerIndex(layerIndex); circleBuilder->setRenderPass(renderPass); circleBuilder->setVertexAttributes(circleVertexAttrs); diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index a156bc8e2..254c8a295 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -460,8 +460,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, fillBuilder->setDepthType((renderPass == RenderPass::Opaque) ? gfx::DepthMaskType::ReadWrite : gfx::DepthMaskType::ReadOnly); fillBuilder->setCullFaceMode(gfx::CullFaceMode::disabled()); - fillBuilder->setDepthType(gfx::DepthMaskType::ReadWrite); - fillBuilder->setLayerIndex(layerIndex); } if (doOutline && !outlineBuilder && outlineShader) { outlineBuilder = context.createDrawableBuilder("fill-outline"); @@ -470,28 +468,9 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlineBuilder->setLineWidth(2.0f); outlineBuilder->setDepthType(gfx::DepthMaskType::ReadOnly); outlineBuilder->setCullFaceMode(gfx::CullFaceMode::disabled()); - outlineBuilder->setLayerIndex(layerIndex); outlineBuilder->setSubLayerIndex(unevaluated.get().isUndefined() ? 2 : 0); } - // evaluated.get(), - // evaluated.get(), - // parameters.stencilModeForClipping(tile.id), - // parameters.colorModeForRenderPass(), - // gfx::CullFaceMode::disabled(), - // - - // if (evaluated.get() && parameters.pass == RenderPass::Translucent) { - // draw(*fillOutlineProgram, - // gfx::Lines{2.0f}, - // parameters.depthModeForSublayer(unevaluated.get().isUndefined() - // ? 2 : 0, - // gfx::DepthMaskType::ReadOnly), - // *bucket.lineIndexBuffer, - // bucket.lineSegments, - // FillOutlineProgram::TextureBindings{}); - // } - if (fillBuilder) { fillBuilder->setRenderPass(renderPass); fillBuilder->setVertexAttributes(fillVertexAttrs); @@ -539,7 +518,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, patternBuilder->setColorAttrMode(gfx::DrawableBuilder::ColorAttrMode::None); patternBuilder->setDepthType(gfx::DepthMaskType::ReadWrite); patternBuilder->setCullFaceMode(gfx::CullFaceMode::disabled()); - patternBuilder->setLayerIndex(layerIndex); patternBuilder->setSubLayerIndex(1); } if (doOutline && !outlinePatternBuilder && outlinePatternShader) { @@ -549,7 +527,6 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders, outlinePatternBuilder->setLineWidth(2.0f); outlinePatternBuilder->setDepthType(gfx::DepthMaskType::ReadOnly); outlinePatternBuilder->setCullFaceMode(gfx::CullFaceMode::disabled()); - outlinePatternBuilder->setLayerIndex(layerIndex); outlinePatternBuilder->setSubLayerIndex(2); } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index ba9a70a47..5ab61b2e8 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -103,20 +103,6 @@ void Renderer::Impl::render(const RenderTree& renderTree) { // Run changes orchestrator.processChanges(); - // Collect drawables - std::vector drawables(orchestrator.getDrawables().size()); - std::transform(orchestrator.getDrawables().begin(), - orchestrator.getDrawables().end(), - drawables.begin(), - std::bind(&RenderOrchestrator::DrawableMap::value_type::second, std::placeholders::_1)); - - // Run tweakers to update any dynamic elements - for (auto& drawable : drawables) { - for (auto& tweaker : drawable->getTweakers()) { - tweaker->execute(*drawable, parameters); - } - } - // Run layer tweakers to update any dynamic elements orchestrator.observeLayerGroups([&](LayerGroup& layerGroup) { if (layerGroup.getLayerTweaker()) { @@ -127,9 +113,6 @@ void Renderer::Impl::render(const RenderTree& renderTree) { // Give the layers a chance to do setup orchestrator.observeLayerGroups([&](LayerGroup& layerGroup) { layerGroup.preRender(orchestrator, parameters); }); - // Sort the drawables - std::sort(drawables.begin(), drawables.end(), gfx::DrawablePtrLessByLayer(/*descending=*/true)); - // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. {