summaryrefslogtreecommitdiff
path: root/src/mbgl/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r--src/mbgl/renderer/painter.cpp2
-rw-r--r--src/mbgl/renderer/painter.hpp6
-rw-r--r--src/mbgl/renderer/render_style.cpp2
-rw-r--r--src/mbgl/renderer/renderer.cpp78
-rw-r--r--src/mbgl/renderer/renderer_impl.cpp151
-rw-r--r--src/mbgl/renderer/renderer_impl.hpp65
-rw-r--r--src/mbgl/renderer/renderer_observer.hpp35
-rw-r--r--src/mbgl/renderer/tile_pyramid.cpp2
-rw-r--r--src/mbgl/renderer/update_parameters.hpp21
9 files changed, 350 insertions, 12 deletions
diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp
index 9ab50e83b0..8e76d6bfc4 100644
--- a/src/mbgl/renderer/painter.cpp
+++ b/src/mbgl/renderer/painter.cpp
@@ -88,11 +88,9 @@ static gl::VertexVector<ExtrusionTextureLayoutVertex> extrusionTextureVertices()
Painter::Painter(gl::Context& context_,
- const TransformState& state_,
float pixelRatio,
const optional<std::string>& programCacheDir)
: context(context_),
- state(state_),
tileVertexBuffer(context.createVertexBuffer(tileVertices())),
rasterVertexBuffer(context.createVertexBuffer(rasterVertices())),
extrusionTextureVertexBuffer(context.createVertexBuffer(extrusionTextureVertices())),
diff --git a/src/mbgl/renderer/painter.hpp b/src/mbgl/renderer/painter.hpp
index 0b6ee3497e..08ca76bf16 100644
--- a/src/mbgl/renderer/painter.hpp
+++ b/src/mbgl/renderer/painter.hpp
@@ -70,7 +70,7 @@ struct FrameData {
class Painter : private util::noncopyable {
public:
- Painter(gl::Context&, const TransformState&, float pixelRatio, const optional<std::string>& programCacheDir);
+ Painter(gl::Context&, float pixelRatio, const optional<std::string>& programCacheDir);
~Painter();
void render(RenderStyle&,
@@ -125,6 +125,8 @@ public:
gl::Context& context;
+ TransformState state;
+
algorithm::ClipIDGenerator clipIDGenerator;
mat4 projMatrix;
@@ -138,8 +140,6 @@ public:
return identity;
}();
- const TransformState& state;
-
FrameData frame;
int indent = 0;
diff --git a/src/mbgl/renderer/render_style.cpp b/src/mbgl/renderer/render_style.cpp
index 47639a57e7..a0f1fd4049 100644
--- a/src/mbgl/renderer/render_style.cpp
+++ b/src/mbgl/renderer/render_style.cpp
@@ -17,6 +17,7 @@
#include <mbgl/renderer/layers/render_symbol_layer.hpp>
#include <mbgl/renderer/style_diff.hpp>
#include <mbgl/renderer/image_manager.hpp>
+#include <mbgl/renderer/query.hpp>
#include <mbgl/style/style.hpp>
#include <mbgl/style/source_impl.hpp>
#include <mbgl/style/transition_options.hpp>
@@ -24,7 +25,6 @@
#include <mbgl/text/glyph_manager.hpp>
#include <mbgl/geometry/line_atlas.hpp>
#include <mbgl/map/backend_scope.hpp>
-#include <mbgl/map/query.hpp>
#include <mbgl/tile/tile.hpp>
#include <mbgl/util/math.hpp>
#include <mbgl/util/string.hpp>
diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp
new file mode 100644
index 0000000000..11d7726c79
--- /dev/null
+++ b/src/mbgl/renderer/renderer.cpp
@@ -0,0 +1,78 @@
+#include <mbgl/renderer/renderer.hpp>
+#include <mbgl/renderer/renderer_impl.hpp>
+#include <mbgl/renderer/update_parameters.hpp>
+#include <mbgl/annotation/annotation_manager.hpp>
+
+namespace mbgl {
+
+Renderer::Renderer(Backend& backend,
+ float pixelRatio_,
+ FileSource& fileSource_,
+ Scheduler& scheduler_,
+ GLContextMode contextMode_,
+ const optional<std::string> programCacheDir_)
+ : impl(std::make_unique<Impl>(backend, pixelRatio_, fileSource_, scheduler_,
+ contextMode_, std::move(programCacheDir_))) {
+}
+
+Renderer::~Renderer() = default;
+
+void Renderer::setObserver(RendererObserver* observer) {
+ impl->setObserver(observer);
+}
+
+void Renderer::render(View& view, const UpdateParameters& updateParameters) {
+ impl->render(view, updateParameters);
+}
+
+std::vector<Feature> Renderer::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const {
+ return impl->queryRenderedFeatures(geometry, options);
+}
+
+std::vector<Feature> Renderer::queryRenderedFeatures(const ScreenCoordinate& point, const RenderedQueryOptions& options) const {
+ return impl->queryRenderedFeatures({ point }, options);
+}
+
+std::vector<Feature> Renderer::queryRenderedFeatures(const ScreenBox& box, const RenderedQueryOptions& options) const {
+ return impl->queryRenderedFeatures(
+ {
+ box.min,
+ {box.max.x, box.min.y},
+ box.max,
+ {box.min.x, box.max.y},
+ box.min
+ },
+ options
+ );
+}
+
+AnnotationIDs Renderer::queryPointAnnotations(const ScreenBox& box) const {
+ RenderedQueryOptions options;
+ options.layerIDs = {{ AnnotationManager::PointLayerID }};
+ auto features = queryRenderedFeatures(box, options);
+ std::set<AnnotationID> set;
+ for (auto &feature : features) {
+ assert(feature.id);
+ assert(feature.id->is<uint64_t>());
+ assert(feature.id->get<uint64_t>() <= std::numeric_limits<AnnotationID>::max());
+ set.insert(static_cast<AnnotationID>(feature.id->get<uint64_t>()));
+ }
+ AnnotationIDs ids;
+ ids.reserve(set.size());
+ std::move(set.begin(), set.end(), std::back_inserter(ids));
+ return ids;
+}
+
+std::vector<Feature> Renderer::querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options) const {
+ return impl->querySourceFeatures(sourceID, options);
+}
+
+void Renderer::dumpDebugLogs() {
+ impl->dumDebugLogs();
+}
+
+void Renderer::onLowMemory() {
+ impl->onLowMemory();
+}
+
+} // namespace mbgl
diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp
new file mode 100644
index 0000000000..accdbc1332
--- /dev/null
+++ b/src/mbgl/renderer/renderer_impl.cpp
@@ -0,0 +1,151 @@
+#include <mbgl/renderer/renderer_impl.hpp>
+#include <mbgl/actor/scheduler.hpp>
+#include <mbgl/storage/file_source.hpp>
+#include <mbgl/renderer/render_style.hpp>
+#include <mbgl/renderer/painter.hpp>
+#include <mbgl/renderer/update_parameters.hpp>
+#include <mbgl/map/transform_state.hpp>
+#include <mbgl/map/backend_scope.hpp>
+
+namespace mbgl {
+
+static RendererObserver& nullObserver() {
+ static RendererObserver observer;
+ return observer;
+}
+
+Renderer::Impl::Impl(Backend& backend_,
+ float pixelRatio_,
+ FileSource& fileSource_,
+ Scheduler& scheduler_,
+ GLContextMode contextMode_,
+ const optional<std::string> programCacheDir_)
+ : backend(backend_)
+ , observer(&nullObserver())
+ , contextMode(contextMode_)
+ , pixelRatio(pixelRatio_),
+ programCacheDir(programCacheDir_)
+ , renderStyle(std::make_unique<RenderStyle>(scheduler_, fileSource_)) {
+
+ renderStyle->setObserver(this);
+}
+
+Renderer::Impl::~Impl() {
+ BackendScope guard { backend, backend.getScopeType()};
+ renderStyle.reset();
+};
+
+void Renderer::Impl::setObserver(RendererObserver* observer_) {
+ observer = observer_ ? observer_ : &nullObserver();
+}
+
+void Renderer::Impl::render(View& view, const UpdateParameters& updateParameters) {
+ // Don't load/render anyting in still mode until explicitly requested.
+ if (updateParameters.mode == MapMode::Still && !updateParameters.stillImageRequest) return;
+
+ BackendScope guard { backend, backend.getScopeType() };
+
+ // Update render style
+ renderStyle->update(updateParameters);
+
+ // Initialize painter
+ if (!painter) {
+ gl::Context& context = backend.getContext();
+ painter = std::make_unique<Painter>(context,
+ pixelRatio,
+ programCacheDir);
+ }
+
+ // Update transform state on painter.
+ painter->state = updateParameters.transformState;
+
+ bool loaded = updateParameters.styleLoaded && renderStyle->isLoaded();
+
+ if (updateParameters.mode == MapMode::Continuous) {
+ if (renderState == RenderState::Never) {
+ observer->onWillStartRenderingMap();
+ }
+
+ observer->onWillStartRenderingFrame();
+
+ FrameData frameData { updateParameters.timePoint,
+ pixelRatio,
+ updateParameters.mode,
+ contextMode,
+ updateParameters.debugOptions };
+
+ backend.updateAssumedState();
+
+ painter->render(*renderStyle, frameData, view);
+ painter->cleanup();
+
+ observer->onDidFinishRenderingFrame(
+ loaded ? RendererObserver::RenderMode::Full : RendererObserver::RenderMode::Partial,
+ renderStyle->hasTransitions() || painter->needsAnimation()
+ );
+
+ if (!loaded) {
+ renderState = RenderState::Partial;
+ } else if (renderState != RenderState::Fully) {
+ renderState = RenderState::Fully;
+ observer->onDidFinishRenderingMap();
+ }
+ } else if (loaded) {
+ // We can render the map in still mode
+ observer->onWillStartRenderingMap();
+ observer->onWillStartRenderingFrame();
+
+ FrameData frameData { updateParameters.timePoint,
+ pixelRatio,
+ updateParameters.mode,
+ contextMode,
+ updateParameters.debugOptions };
+
+ backend.updateAssumedState();
+
+ painter->render(*renderStyle, frameData, view);
+
+ observer->onDidFinishRenderingFrame(RendererObserver::RenderMode::Full, false);
+ observer->onDidFinishRenderingMap();
+
+ // Cleanup only after signaling completion
+ painter->cleanup();
+ }
+}
+
+std::vector<Feature> Renderer::Impl::queryRenderedFeatures(const ScreenLineString& geometry, const RenderedQueryOptions& options) const {
+ if (!painter) return {};
+
+ return renderStyle->queryRenderedFeatures(geometry, painter->state, options);
+}
+
+std::vector<Feature> Renderer::Impl::querySourceFeatures(const std::string& sourceID, const SourceQueryOptions& options) const {
+ const RenderSource* source = renderStyle->getRenderSource(sourceID);
+ if (!source) return {};
+
+ return source->querySourceFeatures(options);
+}
+
+void Renderer::Impl::onInvalidate() {
+ observer->onInvalidate();
+};
+
+void Renderer::Impl::onResourceError(std::exception_ptr ptr) {
+ observer->onResourceError(ptr);
+}
+
+void Renderer::Impl::onLowMemory() {
+ if (painter) {
+ BackendScope { backend, backend.getScopeType() };
+ painter->cleanup();
+ }
+ renderStyle->onLowMemory();
+ observer->onInvalidate();
+}
+
+void Renderer::Impl::dumDebugLogs() {
+ renderStyle->dumpDebugLogs();
+};
+
+
+}
diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp
new file mode 100644
index 0000000000..645b33b354
--- /dev/null
+++ b/src/mbgl/renderer/renderer_impl.hpp
@@ -0,0 +1,65 @@
+#pragma once
+#include <mbgl/renderer/renderer.hpp>
+#include <mbgl/renderer/renderer_observer.hpp>
+#include <mbgl/renderer/render_style_observer.hpp>
+#include <mbgl/style/style.hpp>
+
+#include <mbgl/map/backend.hpp>
+
+#include <memory>
+#include <string>
+
+namespace mbgl {
+
+enum class RenderState : uint8_t {
+ Never,
+ Partial,
+ Fully,
+};
+
+class Painter;
+class RenderStyle;
+class TransformState;
+class View;
+
+
+class Renderer::Impl : public RenderStyleObserver {
+public:
+ Impl(Backend&, float pixelRatio_, FileSource&, Scheduler&, GLContextMode,
+ const optional<std::string> programCacheDir);
+ ~Impl() final;
+
+ void setObserver(RendererObserver*);
+
+ void render(View&, const UpdateParameters&);
+
+ std::vector<Feature> queryRenderedFeatures(const ScreenLineString&, const RenderedQueryOptions&) const;
+ std::vector<Feature> querySourceFeatures(const std::string& sourceID, const SourceQueryOptions&) const;
+
+ void onLowMemory();
+
+ void dumDebugLogs() ;
+
+ // RenderStyleObserver implementation
+ void onInvalidate()override;
+ void onResourceError(std::exception_ptr) override;
+
+private:
+ friend class Renderer;
+
+ Backend& backend;
+
+ RendererObserver* observer;
+
+ const GLContextMode contextMode;
+ const float pixelRatio;
+ const optional<std::string> programCacheDir;
+
+ RenderState renderState = RenderState::Never;
+
+ std::unique_ptr<RenderStyle> renderStyle;
+ std::unique_ptr<Painter> painter;
+
+};
+
+} // namespace mbgl
diff --git a/src/mbgl/renderer/renderer_observer.hpp b/src/mbgl/renderer/renderer_observer.hpp
new file mode 100644
index 0000000000..551b5c803e
--- /dev/null
+++ b/src/mbgl/renderer/renderer_observer.hpp
@@ -0,0 +1,35 @@
+#pragma once
+
+#include <exception>
+
+namespace mbgl {
+
+class RendererObserver {
+public:
+ virtual ~RendererObserver() = default;
+
+ enum class RenderMode : uint32_t {
+ Partial,
+ Full
+ };
+
+ // Signals that a repaint is required
+ virtual void onInvalidate() {}
+
+ // Resource failed to download / parse
+ virtual void onResourceError(std::exception_ptr) {}
+
+ // First frame
+ virtual void onWillStartRenderingMap() {}
+
+ // Start of frame, initial is the first frame for this map
+ virtual void onWillStartRenderingFrame() {}
+
+ // End of frame, boolean flags that a repaint is required
+ virtual void onDidFinishRenderingFrame(RenderMode, bool) {}
+
+ // Final frame
+ virtual void onDidFinishRenderingMap() {}
+};
+
+} // namespace mbgl
diff --git a/src/mbgl/renderer/tile_pyramid.cpp b/src/mbgl/renderer/tile_pyramid.cpp
index 5b1e621743..4abe189826 100644
--- a/src/mbgl/renderer/tile_pyramid.cpp
+++ b/src/mbgl/renderer/tile_pyramid.cpp
@@ -3,8 +3,8 @@
#include <mbgl/renderer/painter.hpp>
#include <mbgl/renderer/render_source.hpp>
#include <mbgl/renderer/tile_parameters.hpp>
+#include <mbgl/renderer/query.hpp>
#include <mbgl/map/transform.hpp>
-#include <mbgl/map/query.hpp>
#include <mbgl/text/placement_config.hpp>
#include <mbgl/math/clamp.hpp>
#include <mbgl/util/tile_cover.hpp>
diff --git a/src/mbgl/renderer/update_parameters.hpp b/src/mbgl/renderer/update_parameters.hpp
index 04b59699b3..9fe8afcd89 100644
--- a/src/mbgl/renderer/update_parameters.hpp
+++ b/src/mbgl/renderer/update_parameters.hpp
@@ -2,11 +2,14 @@
#include <mbgl/map/mode.hpp>
#include <mbgl/map/transform_state.hpp>
-#include <mbgl/util/chrono.hpp>
#include <mbgl/style/light.hpp>
#include <mbgl/style/image.hpp>
#include <mbgl/style/source.hpp>
#include <mbgl/style/layer.hpp>
+#include <mbgl/util/chrono.hpp>
+#include <mbgl/util/immutable.hpp>
+
+#include <vector>
namespace mbgl {
@@ -16,7 +19,8 @@ class AnnotationManager;
class UpdateParameters {
public:
- UpdateParameters(const MapMode mode_,
+ UpdateParameters(const bool styleLoaded_,
+ const MapMode mode_,
const float pixelRatio_,
const MapDebugOptions debugOptions_,
const TimePoint timePoint_,
@@ -31,8 +35,10 @@ public:
Scheduler& scheduler_,
FileSource& fileSource_,
AnnotationManager& annotationManager_,
- const uint8_t prefetchZoomDelta_)
- : mode(mode_),
+ const uint8_t prefetchZoomDelta_,
+ const bool stillImageRequest_)
+ : styleLoaded(styleLoaded_),
+ mode(mode_),
pixelRatio(pixelRatio_),
debugOptions(debugOptions_),
timePoint(std::move(timePoint_)),
@@ -47,8 +53,10 @@ public:
scheduler(scheduler_),
fileSource(fileSource_),
annotationManager(annotationManager_),
- prefetchZoomDelta(prefetchZoomDelta_) {}
+ prefetchZoomDelta(prefetchZoomDelta_),
+ stillImageRequest(stillImageRequest_) {}
+ const bool styleLoaded;
const MapMode mode;
const float pixelRatio;
const MapDebugOptions debugOptions;
@@ -68,6 +76,9 @@ public:
AnnotationManager& annotationManager;
const uint8_t prefetchZoomDelta;
+
+ // For still image requests, render requested
+ const bool stillImageRequest;
};
} // namespace mbgl