From 870f306f680a26d2a4994d46cadb1fd664696396 Mon Sep 17 00:00:00 2001 From: Mikhail Pozdnyakov Date: Fri, 13 Sep 2019 18:30:48 +0300 Subject: [core] Update buckets in Renderer --- src/mbgl/renderer/render_orchestrator.cpp | 39 +++++++++++++++++++++---------- src/mbgl/renderer/render_orchestrator.hpp | 2 +- src/mbgl/renderer/render_tree.hpp | 1 + src/mbgl/renderer/renderer.cpp | 1 + src/mbgl/text/placement.cpp | 4 ++-- src/mbgl/text/placement.hpp | 6 ++--- 6 files changed, 35 insertions(+), 18 deletions(-) (limited to 'src/mbgl') diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp index a1280331b1..e71799cc19 100644 --- a/src/mbgl/renderer/render_orchestrator.cpp +++ b/src/mbgl/renderer/render_orchestrator.cpp @@ -61,12 +61,25 @@ public: std::set layerRenderItems_, std::vector> sourceRenderItems_, LineAtlas& lineAtlas_, - PatternAtlas& patternAtlas_) + PatternAtlas& patternAtlas_, + std::vector> layersNeedPlacement_, + std::shared_ptr placement_, + bool updateSymbolOpacities_) : RenderTree(std::move(parameters_)), layerRenderItems(std::move(layerRenderItems_)), sourceRenderItems(std::move(sourceRenderItems_)), lineAtlas(lineAtlas_), - patternAtlas(patternAtlas_) { + patternAtlas(patternAtlas_), + layersNeedPlacement(std::move(layersNeedPlacement_)), + placement(std::move(placement_)), + updateSymbolOpacities(updateSymbolOpacities_) { + assert(placement); + } + + void prepare() override { + for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { + placement->updateLayerBuckets(*it, parameters->transformParams.state, updateSymbolOpacities); + } } RenderItems getLayerRenderItems() const override { @@ -85,6 +98,9 @@ public: std::vector> sourceRenderItems; std::reference_wrapper lineAtlas; std::reference_wrapper patternAtlas; + std::vector> layersNeedPlacement; + std::shared_ptr placement; + bool updateSymbolOpacities; }; } // namespace @@ -354,14 +370,14 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } } // Symbol placement. + bool symbolBucketsChanged = false; { if (!isMapModeContinuous) { // TODO: Think about right way for symbol index to handle still rendering crossTileSymbolIndex.reset(); } - bool symbolBucketsAdded = false; - bool symbolBucketsChanged = false; + bool symbolBucketsAdded = false; for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { auto result = crossTileSymbolIndex.addLayer(*it, updateParameters.transformState.getLatLng().longitude()); symbolBucketsAdded = symbolBucketsAdded || (result & CrossTileSymbolIndex::AddLayerResult::BucketsAdded); @@ -372,10 +388,11 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar // a short period of time. Instead, we squeeze placement update period to coalesce buckets updates from several tiles. if (symbolBucketsAdded) placement->setMaximumUpdatePeriod(Milliseconds(30)); renderTreeParameters->placementChanged = !placement->stillRecent(updateParameters.timePoint, updateParameters.transformState.getZoom()); + symbolBucketsChanged |= renderTreeParameters->placementChanged; std::set usedSymbolLayers; if (renderTreeParameters->placementChanged) { - placement = std::make_unique( + placement = std::make_shared( updateParameters.transformState, updateParameters.mode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions, std::move(placement)); @@ -393,12 +410,7 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar } } else { placement->setStale(); - } - - for (auto it = layersNeedPlacement.rbegin(); it != layersNeedPlacement.rend(); ++it) { - placement->updateLayerBuckets(*it, updateParameters.transformState, renderTreeParameters->placementChanged || symbolBucketsChanged); - } - + } renderTreeParameters->symbolFadeChange = placement->symbolFadeChange(updateParameters.timePoint); } @@ -421,7 +433,10 @@ std::unique_ptr RenderOrchestrator::createRenderTree(const UpdatePar std::move(layerRenderItems), std::move(sourceRenderItems), *lineAtlas, - *patternAtlas); + *patternAtlas, + std::move(layersNeedPlacement), + placement, + symbolBucketsChanged); } std::vector RenderOrchestrator::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const { diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp index 34b623348f..4592abc35c 100644 --- a/src/mbgl/renderer/render_orchestrator.hpp +++ b/src/mbgl/renderer/render_orchestrator.hpp @@ -122,7 +122,7 @@ private: RenderLight renderLight; CrossTileSymbolIndex crossTileSymbolIndex; - std::unique_ptr placement; + std::shared_ptr placement; const bool backgroundLayerAsColor; bool contextLost = false; diff --git a/src/mbgl/renderer/render_tree.hpp b/src/mbgl/renderer/render_tree.hpp index 557442c0fa..df1b5c6c7f 100644 --- a/src/mbgl/renderer/render_tree.hpp +++ b/src/mbgl/renderer/render_tree.hpp @@ -58,6 +58,7 @@ public: class RenderTree { public: virtual ~RenderTree() = default; + virtual void prepare() {} // Render items virtual RenderItems getLayerRenderItems() const = 0; virtual RenderItems getSourceRenderItems() const = 0; diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index cf4072036c..916a12a95a 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -32,6 +32,7 @@ void Renderer::setObserver(RendererObserver* observer) { void Renderer::render(const UpdateParameters& updateParameters) { if (auto renderTree = impl->orchestrator.createRenderTree(updateParameters)) { + renderTree->prepare(); impl->render(*renderTree); } } diff --git a/src/mbgl/text/placement.cpp b/src/mbgl/text/placement.cpp index 9e3600aa97..17c3459f91 100644 --- a/src/mbgl/text/placement.cpp +++ b/src/mbgl/text/placement.cpp @@ -58,7 +58,7 @@ const CollisionGroups::CollisionGroup& CollisionGroups::get(const std::string& s } } -Placement::Placement(const TransformState& state_, MapMode mapMode_, style::TransitionOptions transitionOptions_, const bool crossSourceCollisions, std::unique_ptr prevPlacement_) +Placement::Placement(const TransformState& state_, MapMode mapMode_, style::TransitionOptions transitionOptions_, const bool crossSourceCollisions, std::shared_ptr prevPlacement_) : collisionIndex(state_) , mapMode(mapMode_) , transitionOptions(std::move(transitionOptions_)) @@ -514,7 +514,7 @@ void Placement::commit(TimePoint now, const double zoom) { fadeStartTime = placementChanged ? commitTime : prevPlacement->fadeStartTime; } -void Placement::updateLayerBuckets(const RenderLayer& layer, const TransformState& state, bool updateOpacities) { +void Placement::updateLayerBuckets(const RenderLayer& layer, const TransformState& state, bool updateOpacities) const { std::set seenCrossTileIDs; for (const auto& item : layer.getPlacementData()) { item.bucket.get().updateVertices(*this, updateOpacities, state, item.tile, seenCrossTileIDs); diff --git a/src/mbgl/text/placement.hpp b/src/mbgl/text/placement.hpp index 1cefaf978c..917cf8bded 100644 --- a/src/mbgl/text/placement.hpp +++ b/src/mbgl/text/placement.hpp @@ -100,10 +100,10 @@ public: class Placement { public: - Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions, std::unique_ptr prevPlacementOrNull = nullptr); + Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions, std::shared_ptr prevPlacement = nullptr); void placeLayer(const RenderLayer&, const mat4&, bool showCollisionBoxes); void commit(TimePoint, const double zoom); - void updateLayerBuckets(const RenderLayer&, const TransformState&, bool updateOpacities); + void updateLayerBuckets(const RenderLayer&, const TransformState&, bool updateOpacities) const; float symbolFadeChange(TimePoint now) const; bool hasTransitions(TimePoint now) const; @@ -147,7 +147,7 @@ private: std::unordered_map retainedQueryData; CollisionGroups collisionGroups; - std::unique_ptr prevPlacement; + mutable std::shared_ptr prevPlacement; optional maximumUpdatePeriod; // Used for debug purposes. -- cgit v1.2.1