From c73d1739b7b450fcf5897e8070204e4c318e998c Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Wed, 10 Jul 2019 17:53:35 +0300 Subject: [core][cp] Backport #15092 to oolong Backports #15092 to release-oolong. --- include/mbgl/style/layer_properties.hpp | 2 ++ src/mbgl/renderer/layers/render_background_layer.cpp | 8 ++++---- src/mbgl/renderer/layers/render_circle_layer.cpp | 3 ++- src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp | 5 +++-- src/mbgl/renderer/layers/render_fill_layer.cpp | 6 +++--- src/mbgl/renderer/layers/render_heatmap_layer.cpp | 4 ++-- src/mbgl/renderer/layers/render_hillshade_layer.cpp | 5 +++-- src/mbgl/renderer/layers/render_line_layer.cpp | 3 ++- src/mbgl/renderer/layers/render_raster_layer.cpp | 4 +++- src/mbgl/renderer/layers/render_symbol_layer.cpp | 5 +++-- src/mbgl/renderer/render_layer.cpp | 16 ++++++++++++++++ src/mbgl/renderer/render_layer.hpp | 7 ++++++- src/mbgl/renderer/renderer_impl.cpp | 6 +++--- 13 files changed, 52 insertions(+), 22 deletions(-) diff --git a/include/mbgl/style/layer_properties.hpp b/include/mbgl/style/layer_properties.hpp index 301a048e50..5d1aee9c99 100644 --- a/include/mbgl/style/layer_properties.hpp +++ b/include/mbgl/style/layer_properties.hpp @@ -15,6 +15,8 @@ public: virtual ~LayerProperties() = default; Immutable baseImpl; + // Contains render passes used by the renderer, see `mbgl::RenderPass`. + uint8_t renderPasses = 0u; protected: LayerProperties(Immutable impl) : baseImpl(std::move(impl)) {} diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index db755adf0b..d6c222b5e6 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -37,8 +37,8 @@ void RenderBackgroundLayer::evaluate(const PropertyEvaluationParameters ¶met parameters.getCrossfadeParameters(), unevaluated.evaluate(parameters)); - passes = properties->evaluated.get() > 0 ? RenderPass::Translucent - : RenderPass::None; + passes = properties->evaluated.get() > 0 ? RenderPass::Translucent : RenderPass::None; + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -133,8 +133,8 @@ void RenderBackgroundLayer::render(PaintParameters& parameters) { } optional RenderBackgroundLayer::getSolidBackground() const { - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - if (!evaluated.get().from.empty()) { + const auto& evaluated = getEvaluated(evaluatedProperties); + if (!evaluated.get().from.empty() || evaluated.get() <= 0.0f) { return nullopt; } diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index e7496df074..fde00b27fe 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -41,6 +41,7 @@ void RenderCircleLayer::evaluate(const PropertyEvaluationParameters& parameters) && (evaluated.get().constantOr(1) > 0 || evaluated.get().constantOr(1) > 0)) ? RenderPass::Translucent : RenderPass::None; + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -58,7 +59,7 @@ void RenderCircleLayer::render(PaintParameters& parameters) { } for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index 29002d8bdf..b8f7938721 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -44,6 +44,7 @@ void RenderFillExtrusionLayer::evaluate(const PropertyEvaluationParameters& para passes = (properties->evaluated.get() > 0) ? (RenderPass::Translucent | RenderPass::Pass3D) : RenderPass::None; + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -116,7 +117,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters) { // Draw solid color extrusions auto drawTiles = [&](const gfx::StencilMode& stencilMode_, const gfx::ColorMode& colorMode_, const std::string& name) { for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } @@ -163,7 +164,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters) { const auto fillPatternValue = evaluated.get().constantOr(mbgl::Faded >{"", ""}); auto drawTiles = [&](const gfx::StencilMode& stencilMode_, const gfx::ColorMode& colorMode_, const std::string& name) { for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index c549b338df..e63fcf3325 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -60,7 +60,7 @@ void RenderFillLayer::evaluate(const PropertyEvaluationParameters& parameters) { } else { passes |= RenderPass::Opaque; } - + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -76,7 +76,7 @@ void RenderFillLayer::render(PaintParameters& parameters) { if (unevaluated.get().isUndefined()) { parameters.renderTileClippingMasks(renderTiles); for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } @@ -163,7 +163,7 @@ void RenderFillLayer::render(PaintParameters& parameters) { parameters.renderTileClippingMasks(renderTiles); for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index ba6e6b7a26..033677c263 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -43,7 +43,7 @@ void RenderHeatmapLayer::evaluate(const PropertyEvaluationParameters& parameters passes = (properties->evaluated.get() > 0) ? (RenderPass::Translucent | RenderPass::Pass3D | RenderPass::Upload) : RenderPass::None; - + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -94,7 +94,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters) { "heatmap texture", { *renderTexture, Color{ 0.0f, 0.0f, 0.0f, 1.0f }, {}, {} }); for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } diff --git a/src/mbgl/renderer/layers/render_hillshade_layer.cpp b/src/mbgl/renderer/layers/render_hillshade_layer.cpp index aa34814036..0b77a07677 100644 --- a/src/mbgl/renderer/layers/render_hillshade_layer.cpp +++ b/src/mbgl/renderer/layers/render_hillshade_layer.cpp @@ -53,7 +53,7 @@ void RenderHillshadeLayer::evaluate(const PropertyEvaluationParameters& paramete passes = (properties->evaluated.get() > 0) ? (RenderPass::Translucent | RenderPass::Pass3D) : RenderPass::None; - + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -66,7 +66,8 @@ bool RenderHillshadeLayer::hasCrossfade() const { } void RenderHillshadeLayer::prepare(const LayerPrepareParameters& params) { - RenderLayer::prepare(params); + assert(params.source); + renderTiles = filterRenderTiles(params.source->getRenderedTiles()); if (auto* demsrc = params.source->as()) { maxzoom = demsrc->getMaxZoom(); } diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 5b20e4667c..283c45d00a 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -48,6 +48,7 @@ void RenderLineLayer::evaluate(const PropertyEvaluationParameters& parameters) { && evaluated.get().constantOr(Color::black()).a > 0 && evaluated.get().constantOr(1.0) > 0) ? RenderPass::Translucent | RenderPass::Upload : RenderPass::None; + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -98,7 +99,7 @@ void RenderLineLayer::render(PaintParameters& parameters) { parameters.renderTileClippingMasks(renderTiles); for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } diff --git a/src/mbgl/renderer/layers/render_raster_layer.cpp b/src/mbgl/renderer/layers/render_raster_layer.cpp index 9811899d83..b96070563b 100644 --- a/src/mbgl/renderer/layers/render_raster_layer.cpp +++ b/src/mbgl/renderer/layers/render_raster_layer.cpp @@ -33,6 +33,7 @@ void RenderRasterLayer::evaluate(const PropertyEvaluationParameters& parameters) staticImmutableCast(baseImpl), unevaluated.evaluate(parameters)); passes = properties->evaluated.get() > 0 ? RenderPass::Translucent : RenderPass::None; + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -73,7 +74,8 @@ static std::array spinWeights(float spin) { } void RenderRasterLayer::prepare(const LayerPrepareParameters& params) { - RenderLayer::prepare(params); + assert(params.source); + renderTiles = filterRenderTiles(params.source->getRenderedTiles()); auto* imageSource = params.source->as(); if (imageSource && imageSource->isLoaded()) { assert(imageSource->isEnabled()); diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp index 51af6fa817..fea2b88f44 100644 --- a/src/mbgl/renderer/layers/render_symbol_layer.cpp +++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp @@ -263,7 +263,7 @@ void RenderSymbolLayer::evaluate(const PropertyEvaluationParameters& parameters) passes = ((evaluated.get().constantOr(1) > 0 && hasIconOpacity && iconSize > 0) || (evaluated.get().constantOr(1) > 0 && hasTextOpacity && textSize > 0)) ? RenderPass::Translucent | RenderPass::Upload : RenderPass::None; - + properties->renderPasses = mbgl::underlying_type(passes); evaluatedProperties = std::move(properties); } @@ -349,7 +349,7 @@ void RenderSymbolLayer::render(PaintParameters& parameters) { }; for (const RenderTile& tile : renderTiles) { - const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl); + const LayerRenderData* renderData = getRenderDataForPass(tile, parameters.pass); if (!renderData) { continue; } @@ -494,6 +494,7 @@ style::TextPaintProperties::PossiblyEvaluated RenderSymbolLayer::textPaintProper void RenderSymbolLayer::prepare(const LayerPrepareParameters& params) { renderTiles = params.source->getRenderedTiles(); + addRenderPassesFromTiles(); const auto comp = [bearing = params.state.getBearing()](const RenderTile& a, const RenderTile& b) { Point pa(a.id.canonical.x, a.id.canonical.y); Point pb(b.id.canonical.x, b.id.canonical.y); diff --git a/src/mbgl/renderer/render_layer.cpp b/src/mbgl/renderer/render_layer.cpp index a18862ce0a..a9a7f6ec8f 100644 --- a/src/mbgl/renderer/render_layer.cpp +++ b/src/mbgl/renderer/render_layer.cpp @@ -48,6 +48,7 @@ bool RenderLayer::supportsZoom(float zoom) const { void RenderLayer::prepare(const LayerPrepareParameters& params) { assert(params.source); renderTiles = filterRenderTiles(params.source->getRenderedTiles()); + addRenderPassesFromTiles(); } optional RenderLayer::getSolidBackground() const { @@ -97,5 +98,20 @@ void RenderLayer::checkRenderability(const PaintParameters& parameters, } } +void RenderLayer::addRenderPassesFromTiles() { + for (const RenderTile& tile : renderTiles) { + if (const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl)) { + passes |= RenderPass(renderData->layerProperties->renderPasses); + } + } +} + +const LayerRenderData* RenderLayer::getRenderDataForPass(const RenderTile& tile, RenderPass pass) const { + if (const LayerRenderData* renderData = tile.getLayerRenderData(*baseImpl)) { + return bool(RenderPass(renderData->layerProperties->renderPasses) & pass) ? renderData : nullptr; + } + return nullptr; +} + } //namespace mbgl diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 94d7384ba4..a452d073f3 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -111,6 +111,10 @@ protected: // in the console to inform the developer. void checkRenderability(const PaintParameters&, uint32_t activeBindingCount); + void addRenderPassesFromTiles(); + + const LayerRenderData* getRenderDataForPass(const RenderTile&, RenderPass) const; + protected: using RenderTiles = std::vector>; // Stores current set of tiles to be rendered for this layer. @@ -122,8 +126,9 @@ protected: std::vector placementData; -private: RenderTiles filterRenderTiles(RenderTiles) const; + +private: // Some layers may not render correctly on some hardware when the vertex attribute limit of // that GPU is exceeded. More attributes are used when adding many data driven paint properties // to a layer. diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index c7cca3a659..1424c5b238 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -249,14 +249,14 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { const Immutable& layerImpl = *it; RenderLayer* layer = getRenderLayer(layerImpl->id); const auto* layerInfo = layerImpl->getTypeInfo(); - const bool layerNeedsRendering = layer->needsRendering(); + const bool layerIsVisible = layer->baseImpl->visibility != style::VisibilityType::None; const bool zoomFitsLayer = layer->supportsZoom(zoomHistory.lastZoom); staticData->has3D = (staticData->has3D || layerInfo->pass3d == LayerTypeInfo::Pass3D::Required); if (layerInfo->source != LayerTypeInfo::Source::NotRequired) { if (layerImpl->source == sourceImpl->id) { sourceNeedsRelayout = (sourceNeedsRelayout || hasImageDiff || hasLayoutDifference(layerDiff, layerImpl->id)); - if (layerNeedsRendering) { + if (layerIsVisible) { filteredLayersForSource.push_back(layer->evaluatedProperties); if (zoomFitsLayer) { sourceNeedsRendering = true; @@ -268,7 +268,7 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } // Handle layers without source. - if (layerNeedsRendering && zoomFitsLayer && sourceImpl.get() == sourceImpls->at(0).get()) { + if (layerIsVisible && zoomFitsLayer && sourceImpl.get() == sourceImpls->at(0).get()) { if (!backend.contextIsShared() && layerImpl.get() == layerImpls->at(0).get()) { const auto& solidBackground = layer->getSolidBackground(); if (solidBackground) { -- cgit v1.2.1