diff options
author | Konstantin Käfer <mail@kkaefer.com> | 2016-03-15 17:43:13 +0100 |
---|---|---|
committer | Konstantin Käfer <mail@kkaefer.com> | 2016-04-06 14:19:13 -0700 |
commit | e7ac0f6d4c39fed294effaed3ccd1d423fb4d913 (patch) | |
tree | e6c155e66423d2d323895e1ff57b26d956b3deab | |
parent | 3a36079ccc9e70500f8e7eb5e54451c0075150ce (diff) | |
download | qtlocation-mapboxgl-e7ac0f6d4c39fed294effaed3ccd1d423fb4d913.tar.gz |
[core] do not call glStencilFunc when we're not clipping
-rw-r--r-- | src/mbgl/renderer/bucket.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/circle_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/circle_bucket.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/fill_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/fill_bucket.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/line_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/line_bucket.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 10 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/painter_debug.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/raster_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/raster_bucket.hpp | 1 | ||||
-rw-r--r-- | src/mbgl/renderer/symbol_bucket.cpp | 4 | ||||
-rw-r--r-- | src/mbgl/renderer/symbol_bucket.hpp | 1 |
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&, |