summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-09-13 18:30:48 +0300
committerMikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com>2019-09-19 14:51:32 +0300
commit870f306f680a26d2a4994d46cadb1fd664696396 (patch)
tree89473e1b774365a10103283f13ede7b27a665205
parentf997ae00ae960f38d6920a625fcb7237e5909f9c (diff)
downloadqtlocation-mapboxgl-870f306f680a26d2a4994d46cadb1fd664696396.tar.gz
[core] Update buckets in Renderer
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp39
-rw-r--r--src/mbgl/renderer/render_orchestrator.hpp2
-rw-r--r--src/mbgl/renderer/render_tree.hpp1
-rw-r--r--src/mbgl/renderer/renderer.cpp1
-rw-r--r--src/mbgl/text/placement.cpp4
-rw-r--r--src/mbgl/text/placement.hpp6
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.