summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2017-10-13 17:53:30 -0700
committerKonstantin Käfer <mail@kkaefer.com>2017-10-17 15:48:41 -0700
commit0cd646180e787a59e600cb184b189a801e261c5c (patch)
tree715fdf2c710c9cb01146e0eccf3fb1dc8567e3a6
parentd95079a0f94fdc9294c41739fa993eb48ea2971d (diff)
downloadqtlocation-mapboxgl-0cd646180e787a59e600cb184b189a801e261c5c.tar.gz
[core] don't generate clip IDs for buckets/layers that don't need to be clipped
-rw-r--r--src/mbgl/algorithm/generate_clip_ids_impl.hpp2
-rw-r--r--src/mbgl/renderer/render_tile.hpp1
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp7
-rw-r--r--test/algorithm/generate_clip_ids.test.cpp7
4 files changed, 14 insertions, 3 deletions
diff --git a/src/mbgl/algorithm/generate_clip_ids_impl.hpp b/src/mbgl/algorithm/generate_clip_ids_impl.hpp
index db62214220..6a316dcdad 100644
--- a/src/mbgl/algorithm/generate_clip_ids_impl.hpp
+++ b/src/mbgl/algorithm/generate_clip_ids_impl.hpp
@@ -17,7 +17,7 @@ void ClipIDGenerator::update(std::vector<std::reference_wrapper<Renderable>> ren
const auto end = renderables.end();
for (auto it = renderables.begin(); it != end; it++) {
auto& renderable = it->get();
- if (!renderable.used) {
+ if (!renderable.used || !renderable.needsClipping) {
continue;
}
diff --git a/src/mbgl/renderer/render_tile.hpp b/src/mbgl/renderer/render_tile.hpp
index b498972f5c..3db02393d2 100644
--- a/src/mbgl/renderer/render_tile.hpp
+++ b/src/mbgl/renderer/render_tile.hpp
@@ -28,6 +28,7 @@ public:
mat4 matrix;
mat4 nearClippedMatrix;
bool used = false;
+ bool needsClipping = false;
mat4 translatedMatrix(const std::array<float, 2>& translate,
style::TranslateAnchorType anchor,
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp
index 1a828b80a3..6a8c18792e 100644
--- a/src/mbgl/renderer/renderer_impl.cpp
+++ b/src/mbgl/renderer/renderer_impl.cpp
@@ -370,6 +370,13 @@ void Renderer::Impl::render(const UpdateParameters& updateParameters) {
if (bucket) {
sortedTilesForInsertion.emplace_back(tile);
tile.used = true;
+
+ // We only need clipping when we're _not_ drawing a symbol layer. The only exception
+ // for symbol layers is when we're rendering still images. See render_symbol_layer.cpp
+ // for the exception we make there.
+ if (!symbolLayer || parameters.mapMode == MapMode::Still) {
+ tile.needsClipping = true;
+ }
}
}
layer->setRenderTiles(std::move(sortedTilesForInsertion));
diff --git a/test/algorithm/generate_clip_ids.test.cpp b/test/algorithm/generate_clip_ids.test.cpp
index 1ebdccb99e..9dc86305af 100644
--- a/test/algorithm/generate_clip_ids.test.cpp
+++ b/test/algorithm/generate_clip_ids.test.cpp
@@ -8,13 +8,16 @@ struct Renderable {
UnwrappedTileID id;
ClipID clip;
bool used;
+ bool needsClipping;
Renderable(UnwrappedTileID id_,
ClipID clip_,
- bool used_ = true)
+ bool used_ = true,
+ bool needsClipping_ = true)
: id(std::move(id_)),
clip(std::move(clip_)),
- used(used_) {}
+ used(used_),
+ needsClipping(needsClipping_) {}
bool operator==(const Renderable& rhs) const {
return id == rhs.id && clip == rhs.clip;