From 06bc2ea3c4c8232279b4398e8902199812f60f02 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Thu, 11 Apr 2019 17:07:14 +0300 Subject: [core] Render layers use synchronized buckets and paint properties Actual for layers rendering the geometry tile data: line, fill, fill-extrusion, heatmap, circle, symbol (was updated in previous commits). --- include/mbgl/style/layer_properties.hpp | 5 +++ .../renderer/layers/render_background_layer.cpp | 2 +- src/mbgl/renderer/layers/render_circle_layer.cpp | 13 ++++--- .../layers/render_fill_extrusion_layer.cpp | 42 ++++++++++++++-------- src/mbgl/renderer/layers/render_fill_layer.cpp | 30 ++++++++-------- src/mbgl/renderer/layers/render_heatmap_layer.cpp | 11 +++--- src/mbgl/renderer/layers/render_line_layer.cpp | 14 ++++---- src/mbgl/tile/tile.hpp | 1 + 8 files changed, 69 insertions(+), 49 deletions(-) diff --git a/include/mbgl/style/layer_properties.hpp b/include/mbgl/style/layer_properties.hpp index 89d599dfbc..301a048e50 100644 --- a/include/mbgl/style/layer_properties.hpp +++ b/include/mbgl/style/layer_properties.hpp @@ -25,5 +25,10 @@ inline const auto& getEvaluated(const Immutable& properties) { return static_cast(*properties).evaluated; } +template +inline const auto& getCrossfade(const Immutable& properties) { + return static_cast(*properties).crossfade; +} + } // namespace style } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_background_layer.cpp b/src/mbgl/renderer/layers/render_background_layer.cpp index d5ba8c879f..3eb9bc2a30 100644 --- a/src/mbgl/renderer/layers/render_background_layer.cpp +++ b/src/mbgl/renderer/layers/render_background_layer.cpp @@ -45,7 +45,7 @@ bool RenderBackgroundLayer::hasTransition() const { } bool RenderBackgroundLayer::hasCrossfade() const { - return static_cast(*evaluatedProperties).crossfade.t != 1; + return getCrossfade(evaluatedProperties).t != 1; } void RenderBackgroundLayer::render(PaintParameters& parameters, RenderSource*) { diff --git a/src/mbgl/renderer/layers/render_circle_layer.cpp b/src/mbgl/renderer/layers/render_circle_layer.cpp index 9df20cf874..a0531afaed 100644 --- a/src/mbgl/renderer/layers/render_circle_layer.cpp +++ b/src/mbgl/renderer/layers/render_circle_layer.cpp @@ -56,17 +56,16 @@ void RenderCircleLayer::render(PaintParameters& parameters, RenderSource*) { if (parameters.pass == RenderPass::Opaque) { return; } - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const bool scaleWithMap = evaluated.get() == CirclePitchScaleType::Map; - const bool pitchWithMap = evaluated.get() == AlignmentType::Map; for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } - CircleBucket& bucket = *bucket_; - + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); + const bool scaleWithMap = evaluated.get() == CirclePitchScaleType::Map; + const bool pitchWithMap = evaluated.get() == AlignmentType::Map; const auto& paintPropertyBinders = bucket.paintPropertyBinders.at(getID()); auto& programInstance = parameters.programs.getCircleLayerPrograms().circle; diff --git a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp index a313f53f1c..c8fa8765de 100644 --- a/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp @@ -52,15 +52,13 @@ bool RenderFillExtrusionLayer::hasTransition() const { } bool RenderFillExtrusionLayer::hasCrossfade() const { - return static_cast(*evaluatedProperties).crossfade.t != 1; + return getCrossfade(evaluatedProperties).t != 1; } void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource*) { if (parameters.pass == RenderPass::Opaque) { return; } - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const auto& crossfade = static_cast(*evaluatedProperties).crossfade; if (parameters.pass == RenderPass::Pass3D) { const auto& size = parameters.staticData.backendSize; @@ -78,22 +76,27 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* "fill extrusion", { *renderTexture, Color{ 0.0f, 0.0f, 0.0f, 0.0f }, depthClearValue, {} }); - auto draw = [&](auto& programInstance, const auto& tileBucket, auto&& uniformValues, + auto draw = [&](auto& programInstance, + const auto& evaluated_, + const auto& crossfade_, + const auto& tileBucket, + auto&& uniformValues, const optional& patternPositionA, - const optional& patternPositionB, auto&& textureBindings) { + const optional& patternPositionB, + auto&& textureBindings) { const auto& paintPropertyBinders = tileBucket.paintPropertyBinders.at(getID()); - paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade); + paintPropertyBinders.setPatternParameters(patternPositionA, patternPositionB, crossfade_); const auto allUniformValues = programInstance.computeAllUniformValues( std::move(uniformValues), paintPropertyBinders, - evaluated, + evaluated_, parameters.state.getZoom() ); const auto allAttributeBindings = programInstance.computeAllAttributeBindings( *tileBucket.vertexBuffer, paintPropertyBinders, - evaluated + evaluated_ ); checkRenderability(parameters, programInstance.activeBindingCount(allAttributeBindings)); @@ -116,14 +119,17 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* if (unevaluated.get().isUndefined()) { for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } - FillExtrusionBucket& bucket = *bucket_; - + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); + const auto& crossfade = getCrossfade(renderData->layerProperties); draw( parameters.programs.getFillExtrusionLayerPrograms().fillExtrusion, + evaluated, + crossfade, bucket, FillExtrusionProgram::layoutUniformValues( tile.translatedClipMatrix(evaluated.get(), @@ -139,18 +145,23 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* } } else { for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); + const auto& crossfade = getCrossfade(renderData->layerProperties); + const auto fillPatternValue = evaluated.get().constantOr(mbgl::Faded >{"", ""}); auto& geometryTile = static_cast(tile.tile); optional patternPosA = geometryTile.getPattern(fillPatternValue.from); optional patternPosB = geometryTile.getPattern(fillPatternValue.to); - FillExtrusionBucket& bucket = *bucket_; draw( parameters.programs.getFillExtrusionLayerPrograms().fillExtrusionPattern, + evaluated, + crossfade, bucket, FillExtrusionPatternProgram::layoutUniformValues( tile.translatedClipMatrix(evaluated.get(), @@ -175,6 +186,7 @@ void RenderFillExtrusionLayer::render(PaintParameters& parameters, RenderSource* } else if (parameters.pass == RenderPass::Translucent) { const auto& size = parameters.staticData.backendSize; + const auto& evaluated = static_cast(*evaluatedProperties).evaluated; mat4 viewportMat; matrix::ortho(viewportMat, 0, size.width, size.height, 0, 0, 1); diff --git a/src/mbgl/renderer/layers/render_fill_layer.cpp b/src/mbgl/renderer/layers/render_fill_layer.cpp index 5b0f020290..85ae12b9d9 100644 --- a/src/mbgl/renderer/layers/render_fill_layer.cpp +++ b/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -68,19 +68,18 @@ bool RenderFillLayer::hasTransition() const { } bool RenderFillLayer::hasCrossfade() const { - return static_cast(*evaluatedProperties).crossfade.t != 1; + return getCrossfade(evaluatedProperties).t != 1; } void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const auto& crossfade = static_cast(*evaluatedProperties).crossfade; if (unevaluated.get().isUndefined()) { for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } - FillBucket& bucket = *bucket_; + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); auto draw = [&] (auto& programInstance, const auto& drawMode, @@ -157,18 +156,21 @@ void RenderFillLayer::render(PaintParameters& parameters, RenderSource*) { if (parameters.pass != RenderPass::Translucent) { return; } - const auto fillPatternValue = evaluated.get().constantOr(Faded>{"", ""}); + for (const RenderTile& tile : renderTiles) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { + continue; + } + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); + const auto& crossfade = getCrossfade(renderData->layerProperties); + + const auto& fillPatternValue = evaluated.get().constantOr(Faded>{"", ""}); auto& geometryTile = static_cast(tile.tile); optional patternPosA = geometryTile.getPattern(fillPatternValue.from); optional patternPosB = geometryTile.getPattern(fillPatternValue.to); - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { - continue; - } - FillBucket& bucket = *bucket_; - auto draw = [&] (auto& programInstance, const auto& drawMode, const auto& depthMode, @@ -249,7 +251,7 @@ bool RenderFillLayer::queryIntersectsFeature( const TransformState& transformState, const float pixelsToTileUnits, const mat4&) const { - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + const auto& evaluated = getEvaluated(evaluatedProperties); auto translatedQueryGeometry = FeatureIndex::translateQueryGeometry( queryGeometry, evaluated.get(), diff --git a/src/mbgl/renderer/layers/render_heatmap_layer.cpp b/src/mbgl/renderer/layers/render_heatmap_layer.cpp index 83a989195b..1f3c179acc 100644 --- a/src/mbgl/renderer/layers/render_heatmap_layer.cpp +++ b/src/mbgl/renderer/layers/render_heatmap_layer.cpp @@ -59,7 +59,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { if (parameters.pass == RenderPass::Opaque) { return; } - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; + if (parameters.pass == RenderPass::Pass3D) { const auto& viewportSize = parameters.staticData.backendSize; const auto size = Size{viewportSize.width / 4, viewportSize.height / 4}; @@ -89,11 +89,12 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { "heatmap texture", { *renderTexture, Color{ 0.0f, 0.0f, 0.0f, 1.0f }, {}, {} }); for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } - HeatmapBucket& bucket = *bucket_; + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); const auto extrudeScale = tile.id.pixelsToTileUnits(1, parameters.state.getZoom()); @@ -155,7 +156,7 @@ void RenderHeatmapLayer::render(PaintParameters& parameters, RenderSource*) { HeatmapTextureProgram::LayoutUniformValues{ uniforms::matrix::Value( viewportMat ), uniforms::world::Value( size ), - uniforms::opacity::Value( evaluated.get() ) + uniforms::opacity::Value( getEvaluated(evaluatedProperties).get() ) }, paintAttributeData, properties, diff --git a/src/mbgl/renderer/layers/render_line_layer.cpp b/src/mbgl/renderer/layers/render_line_layer.cpp index 2a7468ca1f..8fbe799f17 100644 --- a/src/mbgl/renderer/layers/render_line_layer.cpp +++ b/src/mbgl/renderer/layers/render_line_layer.cpp @@ -54,22 +54,22 @@ bool RenderLineLayer::hasTransition() const { } bool RenderLineLayer::hasCrossfade() const { - return static_cast(*evaluatedProperties).crossfade.t != 1; + return getCrossfade(evaluatedProperties).t != 1; } void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { if (parameters.pass == RenderPass::Opaque) { return; } - const auto& evaluated = static_cast(*evaluatedProperties).evaluated; - const auto& crossfade = static_cast(*evaluatedProperties).crossfade; for (const RenderTile& tile : renderTiles) { - auto bucket_ = tile.tile.getBucket(*baseImpl); - if (!bucket_) { + const LayerRenderData* renderData = tile.tile.getLayerRenderData(*baseImpl); + if (!renderData) { continue; } - LineBucket& bucket = *bucket_; + auto& bucket = static_cast(*renderData->bucket); + const auto& evaluated = getEvaluated(renderData->layerProperties); + const auto& crossfade = getCrossfade(renderData->layerProperties); auto draw = [&](auto& programInstance, auto&& uniformValues, @@ -134,7 +134,7 @@ void RenderLineLayer::render(PaintParameters& parameters, RenderSource*) { }); } else if (!unevaluated.get().isUndefined()) { - const auto linePatternValue = evaluated.get().constantOr(Faded>{ "", ""}); + const auto& linePatternValue = evaluated.get().constantOr(Faded>{ "", ""}); auto& geometryTile = static_cast(tile.tile); const Size texsize = geometryTile.iconAtlasTexture->size; diff --git a/src/mbgl/tile/tile.hpp b/src/mbgl/tile/tile.hpp index 651bafe277..c9b1af6beb 100644 --- a/src/mbgl/tile/tile.hpp +++ b/src/mbgl/tile/tile.hpp @@ -58,6 +58,7 @@ public: virtual void upload(gfx::Context&) = 0; virtual Bucket* getBucket(const style::Layer::Impl&) const = 0; virtual const LayerRenderData* getLayerRenderData(const style::Layer::Impl&) const { + assert(false); return nullptr; } // Updates the contained layer render data with the given properties. -- cgit v1.2.1