diff options
author | Minh Nguyễn <mxn@1ec5.org> | 2015-08-25 14:13:16 -0700 |
---|---|---|
committer | Minh Nguyễn <mxn@1ec5.org> | 2015-08-25 14:13:16 -0700 |
commit | 0e456940b98f53624618f4e2a42bf025ce392a9e (patch) | |
tree | 0d62efd250cd4c50689247e6959942769edb9c8b /src | |
parent | 36d71c95dc36a182e2b27cf874ab4cbd168a8cd0 (diff) | |
parent | 765c4695d85ca9114c419e2e49f121b41f80a85d (diff) | |
download | qtlocation-mapboxgl-0e456940b98f53624618f4e2a42bf025ce392a9e.tar.gz |
Merge branch 'master' into perspective-without-y-flip
Diffstat (limited to 'src')
-rw-r--r-- | src/mbgl/map/map_context.cpp | 5 | ||||
-rw-r--r-- | src/mbgl/map/source.cpp | 9 | ||||
-rw-r--r-- | src/mbgl/renderer/bucket.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 28 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 6 |
5 files changed, 26 insertions, 28 deletions
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp index 19e8d02ece..a8dd86284f 100644 --- a/src/mbgl/map/map_context.cpp +++ b/src/mbgl/map/map_context.cpp @@ -334,7 +334,6 @@ bool MapContext::renderSync(const TransformState& state, const FrameData& frame) if (!painter) { painter = std::make_unique<Painter>(data); painter->setup(); - painter->updateRenderOrder(*style); } painter->setDebug(data.getDebug()); @@ -401,10 +400,6 @@ void MapContext::setSprite(const std::string& name, std::shared_ptr<const Sprite void MapContext::onTileDataChanged() { assert(util::ThreadContext::currentlyOn(util::ThreadType::Map)); - if (painter) { - painter->updateRenderOrder(*style); - } - updateFlags |= Update::Repaint; asyncUpdate->send(); } diff --git a/src/mbgl/map/source.cpp b/src/mbgl/map/source.cpp index 9aedf26a65..5899fea1ec 100644 --- a/src/mbgl/map/source.cpp +++ b/src/mbgl/map/source.cpp @@ -530,14 +530,9 @@ void Source::invalidateTiles(const std::unordered_set<TileID, TileID::Hash>& ids } void Source::updateTilePtrs() { - std::vector<Tile*> newPtrs; + tilePtrs.clear(); for (const auto& pair : tiles) { - newPtrs.push_back(pair.second.get()); - } - - if (tilePtrs != newPtrs) { - tilePtrs = newPtrs; - emitTileLoaded(true); + tilePtrs.push_back(pair.second.get()); } } diff --git a/src/mbgl/renderer/bucket.hpp b/src/mbgl/renderer/bucket.hpp index c6a7b788de..eb02f32ebc 100644 --- a/src/mbgl/renderer/bucket.hpp +++ b/src/mbgl/renderer/bucket.hpp @@ -5,6 +5,8 @@ #include <mbgl/util/noncopyable.hpp> #include <mbgl/util/mat4.hpp> +#include <atomic> + #define BUFFER_OFFSET(i) ((char*)nullptr + (i)) namespace mbgl { @@ -16,6 +18,8 @@ class CollisionTile; class Bucket : private util::noncopyable { public: + Bucket() : uploaded(false) {} + // As long as this bucket has a Prepare render pass, this function is getting called. Typically, // this only happens once when the bucket is being rendered for the first time. virtual void upload() = 0; @@ -34,7 +38,7 @@ public: virtual void swapRenderData() {} protected: - bool uploaded = false; + std::atomic<bool> uploaded; }; diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 9ea75efb88..e757d682a6 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -178,6 +178,9 @@ void Painter::render(const Style& style, TransformState state_, const FrameData& resize(); changeMatrix(); + // Figure out what buckets we have to draw and what order we have to draw them in. + const auto order = determineRenderOrder(style); + // - UPLOAD PASS ------------------------------------------------------------------------------- // Uploads all required buffers and images before we do any actual rendering. { @@ -196,6 +199,7 @@ void Painter::render(const Style& style, TransformState state_, const FrameData& } } + // - CLIPPING MASKS ---------------------------------------------------------------------------- // Draws the clipping masks to the stencil buffer. { @@ -265,8 +269,6 @@ void Painter::renderPass(RenderPass pass_, std::size_t i, int8_t increment) { pass = pass_; - const double zoom = state.getZoom(); - MBGL_DEBUG_GROUP(pass == RenderPass::Opaque ? "opaque" : "translucent"); if (debug::renderTree) { @@ -280,13 +282,6 @@ void Painter::renderPass(RenderPass pass_, currentLayer = i; const auto& item = *it; if (item.bucket && item.tile) { - // Skip this layer if it's outside the range of min/maxzoom. - // This may occur when there /is/ a bucket created for this layer, but the min/max-zoom - // is set to a fractional value, or value that is larger than the source maxzoom. - if (item.layer.bucket->min_zoom > zoom || - item.layer.bucket->max_zoom <= zoom) { - continue; - } if (item.layer.hasRenderPass(pass)) { MBGL_DEBUG_GROUP(item.layer.id + " - " + std::string(item.tile->id)); prepareTile(*item.tile); @@ -303,8 +298,8 @@ void Painter::renderPass(RenderPass pass_, } } -void Painter::updateRenderOrder(const Style& style) { - order.clear(); +std::vector<RenderItem> Painter::determineRenderOrder(const Style& style) { + std::vector<RenderItem> order; for (const auto& layerPtr : style.layers) { const auto& layer = *layerPtr; @@ -341,6 +336,15 @@ void Painter::updateRenderOrder(const Style& style) { continue; } + // Skip this layer if it's outside the range of min/maxzoom. + // This may occur when there /is/ a bucket created for this layer, but the min/max-zoom + // is set to a fractional value, or value that is larger than the source maxzoom. + const double zoom = state.getZoom(); + if (layer.bucket->min_zoom > zoom || + layer.bucket->max_zoom <= zoom) { + continue; + } + const auto& tiles = source->getTiles(); for (auto tile : tiles) { assert(tile); @@ -354,6 +358,8 @@ void Painter::updateRenderOrder(const Style& style) { } } } + + return order; } void Painter::renderBackground(const StyleLayer &layer_desc) { diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp index dfe13fa2df..9c0f5db8ca 100644 --- a/src/mbgl/renderer/painter.hpp +++ b/src/mbgl/renderer/painter.hpp @@ -134,12 +134,12 @@ public: bool needsAnimation() const; - void updateRenderOrder(const Style& style); - private: void setupShaders(); mat4 translatedMatrix(const mat4& matrix, const std::array<float, 2> &translation, const TileID &id, TranslateAnchorType anchor); + std::vector<RenderItem> determineRenderOrder(const Style& style); + template <class Iterator> void renderPass(RenderPass, Iterator it, Iterator end, @@ -200,8 +200,6 @@ private: RenderPass pass = RenderPass::Opaque; Color background = {{ 0, 0, 0, 0 }}; - std::vector<RenderItem> order; - int numSublayers = 3; size_t currentLayer; float depthRangeSize; |