From cd10190515693dae6cca7ad9087046a8dd2350a6 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 7 Nov 2017 16:10:58 -0500 Subject: partially do Placement async --- src/mbgl/renderer/renderer_impl.cpp | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) (limited to 'src/mbgl/renderer/renderer_impl.cpp') diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index af0c491e15..ddd5718601 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -59,7 +59,7 @@ Renderer::Impl::Impl(RendererBackend& backend_, , layerImpls(makeMutable>>()) , renderLight(makeMutable()) , crossTileSymbolIndex(std::make_unique()) - , placement(std::make_unique(TransformState{}, MapMode::Still)) { + , placement(std::make_unique(TransformState{}, MapMode::Still, mat4(), false, scheduler_)) { glyphManager->setObserver(this); } @@ -376,21 +376,30 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) { } } - bool placementChanged = false; if (!placement->stillRecent(parameters.timePoint)) { - auto newPlacement = std::make_unique(parameters.state, parameters.mapMode); - for (auto it = order.rbegin(); it != order.rend(); ++it) { - if (it->layer.is()) { - newPlacement->placeLayer(*it->layer.as(), parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision); + if (!placementInProgress) { + placementInProgress = std::make_unique(parameters.state, parameters.mapMode, parameters.projMatrix, parameters.debugOptions & MapDebugOptions::Collision, scheduler); + for (auto it = order.rbegin(); it != order.rend(); ++it) { + if (it->layer.is()) { + placementInProgress->addLayer(*it->layer.as()); + } } + placementInProgress->place(); } + } - placementChanged = newPlacement->commit(*placement, parameters.timePoint); - if (placementChanged || symbolBucketsChanged) { - placement = std::move(newPlacement); + bool placementChanged = false; + if (placementInProgress) { + if (placementInProgress->isReady()) { + placementChanged = placementInProgress->commit(*placement, parameters.timePoint); + if (placementChanged || symbolBucketsChanged) { + placement = std::move(placementInProgress); + placement->setStale(); + } else { + placement->setRecent(parameters.timePoint); + placementInProgress.reset(); + } } - - placement->setRecent(parameters.timePoint); } else { placement->setStale(); } @@ -654,7 +663,7 @@ std::vector Renderer::Impl::queryRenderedFeatures(const ScreenLineStrin std::unordered_map> resultsByLayer; for (const auto& sourceID : sourceIDs) { if (RenderSource* renderSource = getRenderSource(sourceID)) { - auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options, placement->collisionIndex); + auto sourceResults = renderSource->queryRenderedFeatures(geometry, transformState, layers, options, placement->result->collisionIndex); std::move(sourceResults.begin(), sourceResults.end(), std::inserter(resultsByLayer, resultsByLayer.begin())); } } @@ -730,7 +739,7 @@ bool Renderer::Impl::hasTransitions(TimePoint timePoint) const { } } - if (placement->hasTransitions(timePoint)) { + if (placement->hasTransitions(timePoint) || placementInProgress) { return true; } -- cgit v1.2.1