summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.cpp25
-rw-r--r--src/mbgl/renderer/layers/render_symbol_layer.hpp2
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp41
3 files changed, 65 insertions, 3 deletions
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.cpp b/src/mbgl/renderer/layers/render_symbol_layer.cpp
index e194c9c857..96f979cdcf 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.cpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.cpp
@@ -69,11 +69,18 @@ bool RenderSymbolLayer::hasTransition() const {
return unevaluated.hasTransition();
}
-void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
+void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource* source) {
+ renderWithTiming(parameters, source);
+}
+
+std::pair<uint64_t,uint64_t> RenderSymbolLayer::renderWithTiming(PaintParameters& parameters, RenderSource*) {
+ uint64_t reprojectTime = 0;
+ std::chrono::steady_clock::time_point started = std::chrono::steady_clock::now();
if (parameters.pass == RenderPass::Opaque) {
- return;
+ return std::make_pair(0,0);
}
+
for (const RenderTile& tile : renderTiles) {
assert(dynamic_cast<SymbolBucket*>(tile.tile.getBucket(*baseImpl)));
SymbolBucket& bucket = *reinterpret_cast<SymbolBucket*>(tile.tile.getBucket(*baseImpl));
@@ -126,6 +133,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
layout.get<IconRotationAlignment>() == AlignmentType::Map;
if (alongLine) {
+ std::chrono::steady_clock::time_point startedReproject = std::chrono::steady_clock::now();
+
reprojectLineLabels(bucket.icon.dynamicVertices,
bucket.icon.placedSymbols,
tile.matrix,
@@ -135,6 +144,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
parameters.state);
parameters.context.updateVertexBuffer(*bucket.icon.dynamicVertexBuffer, std::move(bucket.icon.dynamicVertices));
+ std::chrono::steady_clock::time_point finishedReproject = std::chrono::steady_clock::now();
+ reprojectTime += std::chrono::duration_cast<std::chrono::microseconds>(finishedReproject - startedReproject).count();
+
}
const bool iconScaled = layout.get<IconSize>().constantOr(1.0) != 1.0 || bucket.iconsNeedLinear;
@@ -187,6 +199,8 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
layout.get<TextRotationAlignment>() == AlignmentType::Map;
if (alongLine) {
+ std::chrono::steady_clock::time_point startedReproject = std::chrono::steady_clock::now();
+
reprojectLineLabels(bucket.text.dynamicVertices,
bucket.text.placedSymbols,
tile.matrix,
@@ -196,6 +210,9 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
parameters.state);
parameters.context.updateVertexBuffer(*bucket.text.dynamicVertexBuffer, std::move(bucket.text.dynamicVertices));
+ std::chrono::steady_clock::time_point finishedReproject = std::chrono::steady_clock::now();
+ reprojectTime += std::chrono::duration_cast<std::chrono::microseconds>(finishedReproject - startedReproject).count();
+
}
const Size texsize = geometryTile.glyphAtlasTexture->size;
@@ -290,6 +307,10 @@ void RenderSymbolLayer::render(PaintParameters& parameters, RenderSource*) {
}
}
+ std::chrono::steady_clock::time_point finished = std::chrono::steady_clock::now();
+ uint64_t totalTime = std::chrono::duration_cast<std::chrono::microseconds>(finished - started).count();
+ return std::make_pair(reprojectTime, totalTime);
+
}
style::IconPaintProperties::PossiblyEvaluated RenderSymbolLayer::iconPaintProperties() const {
diff --git a/src/mbgl/renderer/layers/render_symbol_layer.hpp b/src/mbgl/renderer/layers/render_symbol_layer.hpp
index 83709b5122..4966e03cc0 100644
--- a/src/mbgl/renderer/layers/render_symbol_layer.hpp
+++ b/src/mbgl/renderer/layers/render_symbol_layer.hpp
@@ -67,6 +67,8 @@ public:
void evaluate(const PropertyEvaluationParameters&) override;
bool hasTransition() const override;
void render(PaintParameters&, RenderSource*) override;
+ std::pair<uint64_t,uint64_t> renderWithTiming(PaintParameters&, RenderSource*);
+
style::IconPaintProperties::PossiblyEvaluated iconPaintProperties() const;
style::TextPaintProperties::PossiblyEvaluated textPaintProperties() const;
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp
index af0c491e15..f26a2a26f9 100644
--- a/src/mbgl/renderer/renderer_impl.cpp
+++ b/src/mbgl/renderer/renderer_impl.cpp
@@ -29,6 +29,8 @@
#include <mbgl/util/string.hpp>
#include <mbgl/util/logging.hpp>
+#include <iostream>
+
namespace mbgl {
using namespace style;
@@ -83,6 +85,9 @@ void Renderer::Impl::setObserver(RendererObserver* observer_) {
}
void Renderer::Impl::render(const UpdateParameters& updateParameters) {
+ static uint32_t frameID = 0;
+ std::chrono::steady_clock::time_point started = std::chrono::steady_clock::now();
+ std::cout << frameID++ << ", ";
if (updateParameters.mode == MapMode::Still) {
// Don't load/render anyting in still mode until explicitly requested.
if (!updateParameters.stillImageRequest) {
@@ -365,6 +370,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
order.emplace_back(RenderItem { *layer, source });
}
+ std::chrono::steady_clock::time_point builtTiles = std::chrono::steady_clock::now();
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(builtTiles - started).count() << ", ";
+
bool symbolBucketsChanged = false;
if (parameters.mapMode == MapMode::Still) {
// TODO: Think about right way for symbol index to handle still rendering
@@ -396,6 +404,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
parameters.symbolFadeChange = placement->symbolFadeChange(parameters.timePoint);
+
+ std::chrono::steady_clock::time_point placementTime = std::chrono::steady_clock::now();
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(placementTime - builtTiles).count() << ", ";
if (placementChanged || symbolBucketsChanged) {
for (auto it = order.rbegin(); it != order.rend(); ++it) {
@@ -404,6 +415,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
}
}
+
+ std::chrono::steady_clock::time_point updateOpacities = std::chrono::steady_clock::now();
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(updateOpacities - placementTime).count() << ", ";
// - UPLOAD PASS -------------------------------------------------------------------------------
// Uploads all required buffers and images before we do any actual rendering.
@@ -420,6 +434,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
}
}
}
+
+ std::chrono::steady_clock::time_point uploadTime = std::chrono::steady_clock::now();
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(uploadTime - updateOpacities).count() << ", ";
// - 3D PASS -------------------------------------------------------------------------------------
// Renders any 3D layers bottom-to-top to unique FBOs with texture attachments, but share the same
@@ -530,6 +547,9 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
// Actually render the layers
+ uint64_t reprojectTime = 0;
+ uint64_t symbolTime = 0;
+
parameters.depthRangeSize = 1 - (order.size() + 2) * parameters.numSublayers * parameters.depthEpsilon;
// - OPAQUE PASS -------------------------------------------------------------------------------
@@ -559,7 +579,14 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
parameters.currentLayer = i;
if (it->layer.hasRenderPass(parameters.pass)) {
MBGL_DEBUG_GROUP(parameters.context, it->layer.getID());
- it->layer.render(parameters, it->source);
+ if (it->layer.as<RenderSymbolLayer>()) {
+ auto timing = it->layer.as<RenderSymbolLayer>()->renderWithTiming(parameters, it->source);
+ reprojectTime += timing.first;
+ symbolTime += timing.second;
+ } else {
+ it->layer.render(parameters, it->source);
+ }
+
}
}
}
@@ -630,6 +657,18 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
// Cleanup only after signaling completion
parameters.context.performCleanup();
+
+ std::chrono::steady_clock::time_point renderTime = std::chrono::steady_clock::now();
+
+ symbolTime -= reprojectTime;
+ std::cout << reprojectTime << ", " << symbolTime << ", ";
+
+ uint64_t totalRenderTime = std::chrono::duration_cast<std::chrono::microseconds>(renderTime - uploadTime).count();
+ std::cout << totalRenderTime - symbolTime - reprojectTime << ", ";
+
+
+ std::cout << std::chrono::duration_cast<std::chrono::microseconds>(renderTime - started).count() << std::endl;
+
}
std::vector<Feature> Renderer::Impl::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const {