summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2015-05-22 15:56:05 +0200
committerJohn Firebaugh <john.firebaugh@gmail.com>2015-06-26 10:32:06 -0700
commit84e2ea886dc55917a1d6b665337fff6d3862984a (patch)
tree75d7411f09f48aa8b35be9348bc3687cb4efb1f8 /src
parent740281cc89e99fbbedf07fcf62253ada84f60776 (diff)
downloadqtlocation-mapboxgl-84e2ea886dc55917a1d6b665337fff6d3862984a.tar.gz
drive map rendering from main thread
Diffstat (limited to 'src')
-rw-r--r--src/mbgl/map/map.cpp2
-rw-r--r--src/mbgl/map/map_context.cpp21
-rw-r--r--src/mbgl/map/map_context.hpp4
3 files changed, 22 insertions, 5 deletions
diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp
index 1b8cd2b0e7..5360e294c0 100644
--- a/src/mbgl/map/map.cpp
+++ b/src/mbgl/map/map.cpp
@@ -43,7 +43,7 @@ void Map::renderStill(StillImageCallback callback) {
}
void Map::renderSync() {
- context->invokeSync(&MapContext::render);
+ context->invokeSync(&MapContext::renderSync);
}
void Map::update(Update update_) {
diff --git a/src/mbgl/map/map_context.cpp b/src/mbgl/map/map_context.cpp
index bc4dc8c723..3ac05c8e4c 100644
--- a/src/mbgl/map/map_context.cpp
+++ b/src/mbgl/map/map_context.cpp
@@ -269,7 +269,11 @@ void MapContext::update() {
}
}
- view.invalidate([this] { render(); });
+ if (mayRender) {
+ render();
+ } else {
+ view.invalidate();
+ }
}
updated = static_cast<UpdateType>(Update::Nothing);
@@ -302,9 +306,16 @@ void MapContext::renderStill(StillImageCallback fn) {
}
callback = fn;
+ mayRender = true;
triggerUpdate(Update::RenderStill);
}
+void MapContext::renderSync() {
+ mayRender = true;
+ render();
+ mayRender = false;
+}
+
void MapContext::render() {
assert(util::ThreadContext::currentlyOn(util::ThreadType::Map));
@@ -326,11 +337,15 @@ void MapContext::render() {
painter->setDebug(data.getDebug());
painter->render(*style, transformState, data.getAnimationTime());
+ mayRender = false;
+
if (data.mode == MapMode::Still) {
callback(nullptr, view.readStillImage());
callback = nullptr;
}
+ view.swap();
+
// Schedule another rerender when we definitely need a next frame.
if (data.transform.needsTransition() || style->hasTransitions()) {
triggerUpdate();
@@ -351,7 +366,7 @@ void MapContext::setSourceTileCacheSize(size_t size) {
for (const auto &source : style->sources) {
source->setCacheSize(sourceCacheSize);
}
- view.invalidate([this] { render(); });
+ view.invalidate();
}
}
@@ -361,7 +376,7 @@ void MapContext::onLowMemory() {
for (const auto &source : style->sources) {
source->onLowMemory();
}
- view.invalidate([this] { render(); });
+ view.invalidate();
}
void MapContext::onTileDataChanged() {
diff --git a/src/mbgl/map/map_context.hpp b/src/mbgl/map/map_context.hpp
index 6185db4a55..89b1b28a95 100644
--- a/src/mbgl/map/map_context.hpp
+++ b/src/mbgl/map/map_context.hpp
@@ -34,12 +34,12 @@ public:
~MapContext();
void pause();
- void render();
void resize(uint16_t width, uint16_t height, float ratio);
using StillImageCallback = std::function<void(std::exception_ptr, std::unique_ptr<const StillImage>)>;
void renderStill(StillImageCallback callback);
+ void renderSync();
void triggerUpdate(Update = Update::Nothing);
@@ -62,6 +62,7 @@ public:
private:
void updateTiles();
+ void render();
// Style-related updates.
void cascadeClasses();
@@ -88,6 +89,7 @@ private:
std::string styleURL;
std::string styleJSON;
+ bool mayRender = false;
StillImageCallback callback;
size_t sourceCacheSize;
TransformState transformState;