diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-13 18:30:48 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-09-19 14:51:32 +0300 |
commit | 870f306f680a26d2a4994d46cadb1fd664696396 (patch) | |
tree | 89473e1b774365a10103283f13ede7b27a665205 /src | |
parent | f997ae00ae960f38d6920a625fcb7237e5909f9c (diff) | |
download | qtlocation-mapboxgl-870f306f680a26d2a4994d46cadb1fd664696396.tar.gz |
[core] Update buckets in Renderer
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.cpp | 39 | ||||
-rw-r--r-- | src/mbgl/renderer/render_orchestrator.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/render_tree.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer.cpp | 1 | ||||
-rw-r--r-- | src/mbgl/text/placement.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/text/placement.hpp | 6 |
6 files changed, 35 insertions, 18 deletions
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<LayerRenderItem> layerRenderItems_, std::vector<std::unique_ptr<RenderItem>> sourceRenderItems_, LineAtlas& lineAtlas_, - PatternAtlas& patternAtlas_) + PatternAtlas& patternAtlas_, + std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement_, + std::shared_ptr<const Placement> 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<std::unique_ptr<RenderItem>> sourceRenderItems; std::reference_wrapper<LineAtlas> lineAtlas; std::reference_wrapper<PatternAtlas> patternAtlas; + std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement; + std::shared_ptr<const Placement> placement; + bool updateSymbolOpacities; }; } // namespace @@ -354,14 +370,14 @@ std::unique_ptr<RenderTree> 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<RenderTree> 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<std::string> usedSymbolLayers; if (renderTreeParameters->placementChanged) { - placement = std::make_unique<Placement>( + placement = std::make_shared<Placement>( updateParameters.transformState, updateParameters.mode, updateParameters.transitionOptions, updateParameters.crossSourceCollisions, std::move(placement)); @@ -393,12 +410,7 @@ std::unique_ptr<RenderTree> 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<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar std::move(layerRenderItems), std::move(sourceRenderItems), *lineAtlas, - *patternAtlas); + *patternAtlas, + std::move(layersNeedPlacement), + placement, + symbolBucketsChanged); } std::vector<Feature> 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> placement; + std::shared_ptr<Placement> 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<Placement> prevPlacement_) +Placement::Placement(const TransformState& state_, MapMode mapMode_, style::TransitionOptions transitionOptions_, const bool crossSourceCollisions, std::shared_ptr<const Placement> 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<uint32_t> 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<Placement> prevPlacementOrNull = nullptr); + Placement(const TransformState&, MapMode, style::TransitionOptions, const bool crossSourceCollisions, std::shared_ptr<const Placement> 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<uint32_t, RetainedQueryData> retainedQueryData; CollisionGroups collisionGroups; - std::unique_ptr<Placement> prevPlacement; + mutable std::shared_ptr<const Placement> prevPlacement; optional<Duration> maximumUpdatePeriod; // Used for debug purposes. |