diff options
Diffstat (limited to 'src/mbgl/renderer')
-rw-r--r-- | src/mbgl/renderer/painter.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/painter.hpp | 6 | ||||
-rw-r--r-- | src/mbgl/renderer/render_style.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer.cpp | 78 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.cpp | 151 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_impl.hpp | 65 | ||||
-rw-r--r-- | src/mbgl/renderer/renderer_observer.hpp | 35 | ||||
-rw-r--r-- | src/mbgl/renderer/tile_pyramid.cpp | 2 | ||||
-rw-r--r-- | src/mbgl/renderer/update_parameters.hpp | 21 |
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 |