From be7e9bbb8d54c775127f53d793c117c4bf5e2764 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 14 Jun 2017 16:21:02 -0700 Subject: [core] Refactor CustomLayer internals Move the responsibility for initialization/deinitialization/rendering to RenderCustomLayer. This eliminates special case code from Map and Style. --- src/mbgl/map/map.cpp | 8 +--- src/mbgl/renderer/layers/render_custom_layer.cpp | 58 ++++++++++++++++++++++-- src/mbgl/renderer/layers/render_custom_layer.hpp | 6 ++- src/mbgl/renderer/painter.cpp | 15 ------ src/mbgl/renderer/render_layer.hpp | 4 -- src/mbgl/renderer/render_style.cpp | 7 ++- src/mbgl/style/layers/custom_layer_impl.cpp | 29 ------------ src/mbgl/style/layers/custom_layer_impl.hpp | 5 -- src/mbgl/style/style.cpp | 19 +------- 9 files changed, 66 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/mbgl/map/map.cpp b/src/mbgl/map/map.cpp index 0df9f11112..73a540a16a 100644 --- a/src/mbgl/map/map.cpp +++ b/src/mbgl/map/map.cpp @@ -904,20 +904,14 @@ Layer* Map::getLayer(const std::string& layerID) { void Map::addLayer(std::unique_ptr layer, const optional& before) { impl->styleMutated = true; - BackendScope guard(impl->backend); - impl->style->addLayer(std::move(layer), before); impl->onUpdate(Update::Repaint); } std::unique_ptr Map::removeLayer(const std::string& id) { impl->styleMutated = true; - BackendScope guard(impl->backend); - - auto removedLayer = impl->style->removeLayer(id); impl->onUpdate(Update::Repaint); - - return removedLayer; + return impl->style->removeLayer(id); } void Map::addImage(std::unique_ptr image) { diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp index add3d0d5ad..4d6084075d 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -1,15 +1,27 @@ #include +#include +#include #include -#include +#include +#include namespace mbgl { +using namespace style; + RenderCustomLayer::RenderCustomLayer(Immutable _impl) - : RenderLayer(style::LayerType::Custom, _impl) { + : RenderLayer(LayerType::Custom, _impl) { +} + +RenderCustomLayer::~RenderCustomLayer() { + assert(BackendScope::exists()); + if (initialized && impl().deinitializeFn) { + impl().deinitializeFn(impl().context); + } } -const style::CustomLayer::Impl& RenderCustomLayer::impl() const { - return static_cast(*baseImpl); +const CustomLayer::Impl& RenderCustomLayer::impl() const { + return static_cast(*baseImpl); } void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) { @@ -24,5 +36,41 @@ std::unique_ptr RenderCustomLayer::createBucket(const BucketParameters&, assert(false); return nullptr; } - + +void RenderCustomLayer::render(Painter& painter, PaintParameters& paintParameters, RenderSource*) { + if (!initialized) { + assert(impl().initializeFn); + impl().initializeFn(impl().context); + initialized = true; + } + + gl::Context& context = painter.context; + const TransformState& state = painter.state; + + // Reset GL state to a known state so the CustomLayer always has a clean slate. + context.vertexArrayObject = 0; + context.setDepthMode(painter.depthModeForSublayer(0, gl::DepthMode::ReadOnly)); + context.setStencilMode(gl::StencilMode::disabled()); + context.setColorMode(painter.colorModeForRenderPass()); + + CustomLayerRenderParameters parameters; + + parameters.width = state.getSize().width; + parameters.height = state.getSize().height; + parameters.latitude = state.getLatLng().latitude(); + parameters.longitude = state.getLatLng().longitude(); + parameters.zoom = state.getZoom(); + parameters.bearing = -state.getAngle() * util::RAD2DEG; + parameters.pitch = state.getPitch(); + parameters.fieldOfView = state.getFieldOfView(); + + assert(impl().renderFn); + impl().renderFn(impl().context, parameters); + + // Reset the view back to our original one, just in case the CustomLayer changed + // the viewport or Framebuffer. + paintParameters.view.bind(); + context.setDirtyState(); +} + } // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp index 2f7c2d3239..dd52d315cf 100644 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -8,15 +8,19 @@ namespace mbgl { class RenderCustomLayer: public RenderLayer { public: RenderCustomLayer(Immutable); - ~RenderCustomLayer() final = default; + ~RenderCustomLayer() final; void transition(const TransitionParameters&) final {} void evaluate(const PropertyEvaluationParameters&) override; bool hasTransition() const override; std::unique_ptr createBucket(const BucketParameters&, const std::vector&) const final; + void render(Painter&, PaintParameters&, RenderSource*) final; const style::CustomLayer::Impl& impl() const; + +private: + bool initialized = false; }; template <> diff --git a/src/mbgl/renderer/painter.cpp b/src/mbgl/renderer/painter.cpp index 5a70243a54..47db8254e2 100644 --- a/src/mbgl/renderer/painter.cpp +++ b/src/mbgl/renderer/painter.cpp @@ -292,21 +292,6 @@ void Painter::renderPass(PaintParameters& parameters, if (layer.is()) { MBGL_DEBUG_GROUP(context, "background"); renderBackground(parameters, *layer.as()); - } else if (layer.is()) { - MBGL_DEBUG_GROUP(context, layer.baseImpl->id + " - custom"); - - // Reset GL state to a known state so the CustomLayer always has a clean slate. - context.vertexArrayObject = 0; - context.setDepthMode(depthModeForSublayer(0, gl::DepthMode::ReadOnly)); - context.setStencilMode(gl::StencilMode::disabled()); - context.setColorMode(colorModeForRenderPass()); - - layer.as()->impl().render(state); - - // Reset the view back to our original one, just in case the CustomLayer changed - // the viewport or Framebuffer. - parameters.view.bind(); - context.setDirtyState(); } else if (layer.is()) { const auto size = context.viewport.getCurrentValue().size; diff --git a/src/mbgl/renderer/render_layer.hpp b/src/mbgl/renderer/render_layer.hpp index 50ad4c771a..e06f479281 100644 --- a/src/mbgl/renderer/render_layer.hpp +++ b/src/mbgl/renderer/render_layer.hpp @@ -19,10 +19,6 @@ class PaintParameters; class RenderSource; class RenderTile; -namespace gl { -class Context; -} // namespace gl - class RenderLayer { protected: RenderLayer(style::LayerType, Immutable); diff --git a/src/mbgl/renderer/render_style.cpp b/src/mbgl/renderer/render_style.cpp index 589a493621..f9c3f0ca9f 100644 --- a/src/mbgl/renderer/render_style.cpp +++ b/src/mbgl/renderer/render_style.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -48,7 +49,9 @@ RenderStyle::RenderStyle(Scheduler& scheduler_, FileSource& fileSource_) glyphManager->setObserver(this); } -RenderStyle::~RenderStyle() = default; +RenderStyle::~RenderStyle() { + assert(BackendScope::exists()); // Required for custom layers. +} void RenderStyle::setObserver(RenderStyleObserver* observer_) { observer = observer_; @@ -78,6 +81,8 @@ const RenderLight& RenderStyle::getRenderLight() const { } void RenderStyle::update(const UpdateParameters& parameters) { + assert(BackendScope::exists()); // Required for custom layers. + const bool zoomChanged = zoomHistory.update(parameters.transformState.getZoom(), parameters.timePoint); const TransitionParameters transitionParameters { diff --git a/src/mbgl/style/layers/custom_layer_impl.cpp b/src/mbgl/style/layers/custom_layer_impl.cpp index 10dd058861..42e60c582c 100644 --- a/src/mbgl/style/layers/custom_layer_impl.cpp +++ b/src/mbgl/style/layers/custom_layer_impl.cpp @@ -1,5 +1,4 @@ #include -#include namespace mbgl { namespace style { @@ -23,33 +22,5 @@ bool CustomLayer::Impl::hasLayoutDifference(const Layer::Impl&) const { void CustomLayer::Impl::stringifyLayout(rapidjson::Writer&) const { } -void CustomLayer::Impl::initialize() const { - assert(initializeFn); - initializeFn(context); -} - -void CustomLayer::Impl::deinitialize() const { - if (deinitializeFn) { - deinitializeFn(context); - } -} - -void CustomLayer::Impl::render(const TransformState& state) const { - assert(renderFn); - - CustomLayerRenderParameters parameters; - - parameters.width = state.getSize().width; - parameters.height = state.getSize().height; - parameters.latitude = state.getLatLng().latitude(); - parameters.longitude = state.getLatLng().longitude(); - parameters.zoom = state.getZoom(); - parameters.bearing = -state.getAngle() * util::RAD2DEG; - parameters.pitch = state.getPitch(); - parameters.fieldOfView = state.getFieldOfView(); - - renderFn(context, parameters); -} - } // namespace style } // namespace mbgl diff --git a/src/mbgl/style/layers/custom_layer_impl.hpp b/src/mbgl/style/layers/custom_layer_impl.hpp index 466d1f3e3f..defbbe6894 100644 --- a/src/mbgl/style/layers/custom_layer_impl.hpp +++ b/src/mbgl/style/layers/custom_layer_impl.hpp @@ -17,11 +17,6 @@ public: CustomLayerDeinitializeFunction, void* context); - void initialize() const; - void deinitialize() const; - void render(const TransformState&) const; - -private: bool hasLayoutDifference(const Layer::Impl&) const override; void stringifyLayout(rapidjson::Writer&) const override; diff --git a/src/mbgl/style/style.cpp b/src/mbgl/style/style.cpp index d667ef656f..41b4310dcf 100644 --- a/src/mbgl/style/style.cpp +++ b/src/mbgl/style/style.cpp @@ -2,11 +2,8 @@ #include #include #include -#include #include -#include #include -#include #include #include #include @@ -35,13 +32,7 @@ Style::Style(Scheduler& scheduler_, FileSource& fileSource_, float pixelRatio) light->setObserver(this); } -Style::~Style() { - for (const auto& layer : layers) { - if (auto* customLayer = layer->as()) { - customLayer->impl().deinitialize(); - } - } -} +Style::~Style() = default; void Style::setTransitionOptions(const TransitionOptions& options) { transitionOptions = options; @@ -153,10 +144,6 @@ Layer* Style::addLayer(std::unique_ptr layer, optional befor throw std::runtime_error(std::string{"Layer "} + layer->getID() + " already exists"); } - if (auto* customLayer = layer->as()) { - customLayer->impl().initialize(); - } - layer->setObserver(this); return layers.add(std::move(layer), before); @@ -167,10 +154,6 @@ std::unique_ptr Style::removeLayer(const std::string& id) { if (layer) { layer->setObserver(nullptr); - - if (auto* customLayer = layer->as()) { - customLayer->impl().deinitialize(); - } } return layer; -- cgit v1.2.1