summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2016-03-15 17:43:13 +0100
committerKonstantin Käfer <mail@kkaefer.com>2016-04-06 14:19:13 -0700
commite7ac0f6d4c39fed294effaed3ccd1d423fb4d913 (patch)
treee6c155e66423d2d323895e1ff57b26d956b3deab
parent3a36079ccc9e70500f8e7eb5e54451c0075150ce (diff)
downloadqtlocation-mapboxgl-e7ac0f6d4c39fed294effaed3ccd1d423fb4d913.tar.gz
[core] do not call glStencilFunc when we're not clipping
-rw-r--r--src/mbgl/renderer/bucket.hpp2
-rw-r--r--src/mbgl/renderer/circle_bucket.cpp4
-rw-r--r--src/mbgl/renderer/circle_bucket.hpp1
-rw-r--r--src/mbgl/renderer/fill_bucket.cpp4
-rw-r--r--src/mbgl/renderer/fill_bucket.hpp1
-rw-r--r--src/mbgl/renderer/line_bucket.cpp4
-rw-r--r--src/mbgl/renderer/line_bucket.hpp1
-rw-r--r--src/mbgl/renderer/painter.cpp10
-rw-r--r--src/mbgl/renderer/painter.hpp2
-rw-r--r--src/mbgl/renderer/painter_debug.cpp2
-rw-r--r--src/mbgl/renderer/raster_bucket.cpp4
-rw-r--r--src/mbgl/renderer/raster_bucket.hpp1
-rw-r--r--src/mbgl/renderer/symbol_bucket.cpp4
-rw-r--r--src/mbgl/renderer/symbol_bucket.hpp1
14 files changed, 35 insertions, 6 deletions
diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp
index 85f97688dd..4212e7c30e 100644
--- a/src/mbgl/renderer/bucket.hpp
+++ b/src/mbgl/renderer/bucket.hpp
@@ -38,6 +38,8 @@ public:
virtual bool hasData() const = 0;
+ virtual bool needsClipping() const = 0;
+
inline bool needsUpload() const {
return !uploaded;
}
diff --git a/src/mbgl/renderer/circle_bucket.cpp b/src/mbgl/renderer/circle_bucket.cpp
index 9ed8f98ae2..4c94bfa0d0 100644
--- a/src/mbgl/renderer/circle_bucket.cpp
+++ b/src/mbgl/renderer/circle_bucket.cpp
@@ -31,6 +31,10 @@ bool CircleBucket::hasData() const {
return !triangleGroups_.empty();
}
+bool CircleBucket::needsClipping() const {
+ return true;
+}
+
void CircleBucket::addGeometry(const GeometryCollection& geometryCollection) {
for (auto& circle : geometryCollection) {
for(auto & geometry : circle) {
diff --git a/src/mbgl/renderer/circle_bucket.hpp b/src/mbgl/renderer/circle_bucket.hpp
index 89d8de27be..defa7b069f 100644
--- a/src/mbgl/renderer/circle_bucket.hpp
+++ b/src/mbgl/renderer/circle_bucket.hpp
@@ -23,6 +23,7 @@ public:
void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override;
bool hasData() const override;
+ bool needsClipping() const override;
void addGeometry(const GeometryCollection&);
void drawCircles(CircleShader&, gl::GLObjectStore&);
diff --git a/src/mbgl/renderer/fill_bucket.cpp b/src/mbgl/renderer/fill_bucket.cpp
index d3a4bc2b57..1388c6dfb7 100644
--- a/src/mbgl/renderer/fill_bucket.cpp
+++ b/src/mbgl/renderer/fill_bucket.cpp
@@ -206,6 +206,10 @@ bool FillBucket::hasData() const {
return !triangleGroups.empty() || !lineGroups.empty();
}
+bool FillBucket::needsClipping() const {
+ return true;
+}
+
void FillBucket::drawElements(PlainShader& shader, gl::GLObjectStore& glObjectStore) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
diff --git a/src/mbgl/renderer/fill_bucket.hpp b/src/mbgl/renderer/fill_bucket.hpp
index b3b46f030b..61a3b986ba 100644
--- a/src/mbgl/renderer/fill_bucket.hpp
+++ b/src/mbgl/renderer/fill_bucket.hpp
@@ -35,6 +35,7 @@ public:
void upload(gl::GLObjectStore&) override;
void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override;
bool hasData() const override;
+ bool needsClipping() const override;
void addGeometry(const GeometryCollection&);
void tessellate();
diff --git a/src/mbgl/renderer/line_bucket.cpp b/src/mbgl/renderer/line_bucket.cpp
index dfaa93419c..83a14acbc1 100644
--- a/src/mbgl/renderer/line_bucket.cpp
+++ b/src/mbgl/renderer/line_bucket.cpp
@@ -452,6 +452,10 @@ bool LineBucket::hasData() const {
return !triangleGroups.empty();
}
+bool LineBucket::needsClipping() const {
+ return true;
+}
+
void LineBucket::drawLines(LineShader& shader, gl::GLObjectStore& glObjectStore) {
GLbyte* vertex_index = BUFFER_OFFSET(0);
GLbyte* elements_index = BUFFER_OFFSET(0);
diff --git a/src/mbgl/renderer/line_bucket.hpp b/src/mbgl/renderer/line_bucket.hpp
index 9383bc2af7..d6dd1b5567 100644
--- a/src/mbgl/renderer/line_bucket.hpp
+++ b/src/mbgl/renderer/line_bucket.hpp
@@ -30,6 +30,7 @@ public:
void upload(gl::GLObjectStore&) override;
void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override;
bool hasData() const override;
+ bool needsClipping() const override;
void addGeometry(const GeometryCollection&);
void addGeometry(const GeometryCoordinates& line);
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index dec866ec6e..cf8be08756 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -74,9 +74,9 @@ bool Painter::needsAnimation() const {
return frameHistory.needsAnimation(util::DEFAULT_FADE_DURATION);
}
-void Painter::prepareTile(const Tile& tile) {
- const GLint ref = (GLint)tile.clip.reference.to_ulong();
- const GLuint mask = (GLuint)tile.clip.mask.to_ulong();
+void Painter::setClipping(const ClipID& clip) {
+ const GLint ref = (GLint)clip.reference.to_ulong();
+ const GLuint mask = (GLuint)clip.mask.to_ulong();
config.stencilFunc = { GL_EQUAL, ref, mask };
}
@@ -249,7 +249,9 @@ void Painter::renderPass(RenderPass pass_,
config.setDirty();
} else {
MBGL_DEBUG_GROUP(layer.id + " - " + std::string(item.tile->id));
- prepareTile(*item.tile);
+ if (item.bucket->needsClipping()) {
+ setClipping(item.tile->clip);
+ }
item.bucket->render(*this, layer, item.tile->id, item.tile->matrix);
}
}
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index e58985dcc1..89fb96ca4e 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -111,7 +111,7 @@ private:
Iterator it, Iterator end,
GLsizei i, int8_t increment);
- void prepareTile(const Tile& tile);
+ void setClipping(const ClipID&);
template <typename BucketProperties, typename StyleProperties>
void renderSDF(SymbolBucket &bucket,
diff --git a/src/mbgl/renderer/painter_debug.cpp b/src/mbgl/renderer/painter_debug.cpp
index 580b2e72ba..cdb2782a43 100644
--- a/src/mbgl/renderer/painter_debug.cpp
+++ b/src/mbgl/renderer/painter_debug.cpp
@@ -13,7 +13,7 @@ void Painter::renderTileDebug(const Tile& tile) {
MBGL_DEBUG_GROUP(std::string { "debug " } + std::string(tile.id));
assert(tile.data);
if (data.getDebug() != MapDebugOptions::NoDebug) {
- prepareTile(tile);
+ setClipping(tile.clip);
if (data.getDebug() & (MapDebugOptions::Timestamps | MapDebugOptions::ParseStatus)) {
renderDebugText(*tile.data, tile.matrix);
}
diff --git a/src/mbgl/renderer/raster_bucket.cpp b/src/mbgl/renderer/raster_bucket.cpp
index 137574b731..12f4c31621 100644
--- a/src/mbgl/renderer/raster_bucket.cpp
+++ b/src/mbgl/renderer/raster_bucket.cpp
@@ -37,3 +37,7 @@ void RasterBucket::drawRaster(RasterShader& shader, StaticVertexBuffer &vertices
bool RasterBucket::hasData() const {
return raster.isLoaded();
}
+
+bool RasterBucket::needsClipping() const {
+ return false;
+}
diff --git a/src/mbgl/renderer/raster_bucket.hpp b/src/mbgl/renderer/raster_bucket.hpp
index 466a7602ed..744cb4c297 100644
--- a/src/mbgl/renderer/raster_bucket.hpp
+++ b/src/mbgl/renderer/raster_bucket.hpp
@@ -17,6 +17,7 @@ public:
void upload(gl::GLObjectStore&) override;
void render(Painter&, const StyleLayer&, const TileID&, const mat4&) override;
bool hasData() const override;
+ bool needsClipping() const override;
void setImage(PremultipliedImage);
diff --git a/src/mbgl/renderer/symbol_bucket.cpp b/src/mbgl/renderer/symbol_bucket.cpp
index 6530510e27..e189104490 100644
--- a/src/mbgl/renderer/symbol_bucket.cpp
+++ b/src/mbgl/renderer/symbol_bucket.cpp
@@ -95,6 +95,10 @@ bool SymbolBucket::hasIconData() const { return renderData && !renderData->icon.
bool SymbolBucket::hasCollisionBoxData() const { return renderData && !renderData->collisionBox.groups.empty(); }
+bool SymbolBucket::needsClipping() const {
+ return mode == MapMode::Still;
+}
+
void SymbolBucket::parseFeatures(const GeometryTileLayer& layer,
const FilterExpression& filter) {
const bool has_text = !layout.text.field.value.empty() && !layout.text.font.value.empty();
diff --git a/src/mbgl/renderer/symbol_bucket.hpp b/src/mbgl/renderer/symbol_bucket.hpp
index 6f65062adb..08ef9f4cfa 100644
--- a/src/mbgl/renderer/symbol_bucket.hpp
+++ b/src/mbgl/renderer/symbol_bucket.hpp
@@ -76,6 +76,7 @@ public:
bool hasTextData() const;
bool hasIconData() const;
bool hasCollisionBoxData() const;
+ bool needsClipping() const override;
void addFeatures(uintptr_t tileUID,
SpriteAtlas&,