summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Kassebaum <john.kassebaum@onxmaps.com>2019-07-25 16:58:36 -0700
committerJohn Kassebaum <john.kassebaum@onxmaps.com>2019-07-26 12:24:35 -0700
commit76f6fd4e6147a02a4f381bb259936d0b5240b640 (patch)
treee63e2b010af701ae91a9f023f9f363a2e2b87c8d
parentb5980bda75b6f671718952054845c71f7c6a3356 (diff)
downloadqtlocation-mapboxgl-upstream/pr-15231.tar.gz
[core] Perform render pass layer introspection only if layer is need by source or if sourceless.upstream/pr-15231
Remove orchestrator property vector of layer propertes which was intended to avoid reallocation per frame, but the cost of resizing reduced frame rate by half, and even so, without per frame resizing is no faster than local instantiation per frame. Only evaluate zoom state on a sourceless layer after first verifying the layer is sourceless and visible.
-rw-r--r--src/mbgl/renderer/render_orchestrator.cpp23
-rw-r--r--src/mbgl/renderer/render_orchestrator.hpp4
2 files changed, 10 insertions, 17 deletions
diff --git a/src/mbgl/renderer/render_orchestrator.cpp b/src/mbgl/renderer/render_orchestrator.cpp
index 4d8ef77302..7776e9da1e 100644
--- a/src/mbgl/renderer/render_orchestrator.cpp
+++ b/src/mbgl/renderer/render_orchestrator.cpp
@@ -271,19 +271,12 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
std::vector<std::reference_wrapper<RenderLayer>> layersNeedPlacement;
auto renderItemsEmplaceHint = layerRenderItems.begin();
- // Reserve size for filteredLayersForSource if there are sources.
- if (!sourceImpls->empty()) {
- filteredLayersForSource.reserve(layerImpls->size());
- if (filteredLayersForSource.capacity() > layerImpls->size()) {
- filteredLayersForSource.shrink_to_fit();
- }
- }
-
// Update all sources and initialize renderItems.
for (const auto& sourceImpl : *sourceImpls) {
RenderSource* source = renderSources.at(sourceImpl->id).get();
bool sourceNeedsRendering = false;
- bool sourceNeedsRelayout = false;
+ bool sourceNeedsRelayout = false;
+ std::vector<Immutable<style::LayerProperties>> filteredLayersForSource;
uint32_t index = 0u;
const auto begin = layerImpls->begin();
@@ -292,15 +285,18 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
const Immutable<Layer::Impl>& layerImpl = *it;
RenderLayer* layer = getRenderLayer(layerImpl->id);
const auto* layerInfo = layerImpl->getTypeInfo();
- const bool layerIsVisible = layer->baseImpl->visibility != style::VisibilityType::None;
- const bool zoomFitsLayer = layer->supportsZoom(zoomHistory.lastZoom);
+
renderTreeParameters->has3D |= (layerInfo->pass3d == LayerTypeInfo::Pass3D::Required);
if (layerInfo->source != LayerTypeInfo::Source::NotRequired) {
if (layerImpl->source == sourceImpl->id) {
sourceNeedsRelayout = (sourceNeedsRelayout || hasImageDiff || constantsMaskChanged.count(layerImpl->id) || hasLayoutDifference(layerDiff, layerImpl->id));
+
+ const bool layerIsVisible = layer->baseImpl->visibility != style::VisibilityType::None;
if (layerIsVisible) {
filteredLayersForSource.push_back(layer->evaluatedProperties);
+
+ const bool zoomFitsLayer = layer->supportsZoom(zoomHistory.lastZoom);
if (zoomFitsLayer) {
sourceNeedsRendering = true;
renderItemsEmplaceHint = layerRenderItems.emplace_hint(renderItemsEmplaceHint, *layer, source, index);
@@ -311,7 +307,8 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
}
// Handle layers without source.
- if (layerIsVisible && zoomFitsLayer && sourceImpl.get() == sourceImpls->at(0).get()) {
+ if (sourceImpl.get() != sourceImpls->at(0).get() || layer->baseImpl->visibility == style::VisibilityType::None) continue;
+ if (layer->supportsZoom(zoomHistory.lastZoom)) {
if (backgroundLayerAsColor && layerImpl.get() == layerImpls->at(0).get()) {
const auto& solidBackground = layer->getSolidBackground();
if (solidBackground) {
@@ -322,12 +319,12 @@ std::unique_ptr<RenderTree> RenderOrchestrator::createRenderTree(const UpdatePar
renderItemsEmplaceHint = layerRenderItems.emplace_hint(renderItemsEmplaceHint, *layer, nullptr, index);
}
}
+
source->update(sourceImpl,
filteredLayersForSource,
sourceNeedsRendering,
sourceNeedsRelayout,
tileParameters);
- filteredLayersForSource.clear();
}
renderTreeParameters->loaded = updateParameters.styleLoaded && isLoaded();
diff --git a/src/mbgl/renderer/render_orchestrator.hpp b/src/mbgl/renderer/render_orchestrator.hpp
index 884bd21b7b..d36e2606dc 100644
--- a/src/mbgl/renderer/render_orchestrator.hpp
+++ b/src/mbgl/renderer/render_orchestrator.hpp
@@ -117,10 +117,6 @@ private:
const bool backgroundLayerAsColor;
bool contextLost = false;
-
- // Vector with reserved capacity of layerImpls->size() to avoid reallocation
- // on each frame.
- std::vector<Immutable<style::LayerProperties>> filteredLayersForSource;
};
} // namespace mbgl