From 2e1bda2ad8ba06a812f767f32b76c5b46d412f5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20M=C3=B6nicke?= Date: Mon, 3 Feb 2020 16:06:45 +0200 Subject: [build] Moving custom layer to mbgl/gl --- include/mbgl/gl/custom_layer_factory.hpp | 17 ++++ include/mbgl/layermanager/custom_layer_factory.hpp | 17 ---- next/CMakeLists.txt | 12 +-- .../src/mbgl/layermanager/layer_manager.cpp | 6 +- src/mbgl/gl/custom_layer_factory.cpp | 21 ++++ src/mbgl/gl/render_custom_layer.cpp | 105 +++++++++++++++++++ src/mbgl/gl/render_custom_layer.hpp | 27 +++++ src/mbgl/layermanager/custom_layer_factory.cpp | 22 ---- src/mbgl/renderer/layers/render_custom_layer.cpp | 113 --------------------- src/mbgl/renderer/layers/render_custom_layer.hpp | 27 ----- src/mbgl/style/layers/custom_layer.cpp | 4 +- src/mbgl/tile/geometry_tile.cpp | 2 +- 12 files changed, 185 insertions(+), 188 deletions(-) create mode 100644 include/mbgl/gl/custom_layer_factory.hpp delete mode 100644 include/mbgl/layermanager/custom_layer_factory.hpp create mode 100644 src/mbgl/gl/custom_layer_factory.cpp create mode 100644 src/mbgl/gl/render_custom_layer.cpp create mode 100644 src/mbgl/gl/render_custom_layer.hpp delete mode 100644 src/mbgl/layermanager/custom_layer_factory.cpp delete mode 100644 src/mbgl/renderer/layers/render_custom_layer.cpp delete mode 100644 src/mbgl/renderer/layers/render_custom_layer.hpp diff --git a/include/mbgl/gl/custom_layer_factory.hpp b/include/mbgl/gl/custom_layer_factory.hpp new file mode 100644 index 0000000000..963a3dc2fd --- /dev/null +++ b/include/mbgl/gl/custom_layer_factory.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include +#include + +#include + +namespace mbgl { + +class CustomLayerFactory : public LayerFactory { +protected: + const style::LayerTypeInfo* getTypeInfo() const noexcept final; + std::unique_ptr createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept final; + std::unique_ptr createRenderLayer(Immutable) noexcept final; +}; + +} // namespace mbgl diff --git a/include/mbgl/layermanager/custom_layer_factory.hpp b/include/mbgl/layermanager/custom_layer_factory.hpp deleted file mode 100644 index 963a3dc2fd..0000000000 --- a/include/mbgl/layermanager/custom_layer_factory.hpp +++ /dev/null @@ -1,17 +0,0 @@ -#pragma once - -#include -#include - -#include - -namespace mbgl { - -class CustomLayerFactory : public LayerFactory { -protected: - const style::LayerTypeInfo* getTypeInfo() const noexcept final; - std::unique_ptr createLayer(const std::string& id, const style::conversion::Convertible& value) noexcept final; - std::unique_ptr createRenderLayer(Immutable) noexcept final; -}; - -} // namespace mbgl diff --git a/next/CMakeLists.txt b/next/CMakeLists.txt index 9b57650d22..36001bc6eb 100644 --- a/next/CMakeLists.txt +++ b/next/CMakeLists.txt @@ -100,7 +100,6 @@ add_library( ${MBGL_ROOT}/include/mbgl/gfx/rendering_stats.hpp ${MBGL_ROOT}/include/mbgl/layermanager/background_layer_factory.hpp ${MBGL_ROOT}/include/mbgl/layermanager/circle_layer_factory.hpp - ${MBGL_ROOT}/include/mbgl/layermanager/custom_layer_factory.hpp ${MBGL_ROOT}/include/mbgl/layermanager/fill_extrusion_layer_factory.hpp ${MBGL_ROOT}/include/mbgl/layermanager/fill_layer_factory.hpp ${MBGL_ROOT}/include/mbgl/layermanager/heatmap_layer_factory.hpp @@ -323,7 +322,6 @@ add_library( ${MBGL_ROOT}/src/mbgl/gfx/vertex_vector.hpp ${MBGL_ROOT}/src/mbgl/layermanager/background_layer_factory.cpp ${MBGL_ROOT}/src/mbgl/layermanager/circle_layer_factory.cpp - ${MBGL_ROOT}/src/mbgl/layermanager/custom_layer_factory.cpp ${MBGL_ROOT}/src/mbgl/layermanager/fill_extrusion_layer_factory.cpp ${MBGL_ROOT}/src/mbgl/layermanager/fill_layer_factory.cpp ${MBGL_ROOT}/src/mbgl/layermanager/heatmap_layer_factory.cpp @@ -442,8 +440,6 @@ add_library( ${MBGL_ROOT}/src/mbgl/renderer/layers/render_background_layer.hpp ${MBGL_ROOT}/src/mbgl/renderer/layers/render_circle_layer.cpp ${MBGL_ROOT}/src/mbgl/renderer/layers/render_circle_layer.hpp - ${MBGL_ROOT}/src/mbgl/renderer/layers/render_custom_layer.cpp - ${MBGL_ROOT}/src/mbgl/renderer/layers/render_custom_layer.hpp ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_extrusion_layer.cpp ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_extrusion_layer.hpp ${MBGL_ROOT}/src/mbgl/renderer/layers/render_fill_layer.cpp @@ -806,8 +802,6 @@ add_library( ${MBGL_ROOT}/src/mbgl/util/work_request.cpp ${MBGL_ROOT}/src/parsedate/parsedate.cpp ${MBGL_ROOT}/src/parsedate/parsedate.hpp - ${MBGL_ROOT}/src/mbgl/platform/gl_functions.cpp - ${MBGL_ROOT}/include/mbgl/platform/gl_functions.hpp ) if(MBGL_WITH_OPENGL) @@ -820,14 +814,17 @@ if(MBGL_WITH_OPENGL) mbgl-core PRIVATE ${MBGL_ROOT}/include/mbgl/gfx/backend.hpp + ${MBGL_ROOT}/include/mbgl/gl/custom_layer_factory.hpp ${MBGL_ROOT}/include/mbgl/gl/renderable_resource.hpp ${MBGL_ROOT}/include/mbgl/gl/renderer_backend.hpp + ${MBGL_ROOT}/include/mbgl/platform/gl_functions.hpp ${MBGL_ROOT}/src/mbgl/gl/attribute.cpp ${MBGL_ROOT}/src/mbgl/gl/attribute.hpp ${MBGL_ROOT}/src/mbgl/gl/command_encoder.cpp ${MBGL_ROOT}/src/mbgl/gl/command_encoder.hpp ${MBGL_ROOT}/src/mbgl/gl/context.cpp ${MBGL_ROOT}/src/mbgl/gl/context.hpp + ${MBGL_ROOT}/src/mbgl/gl/custom_layer_factory.cpp ${MBGL_ROOT}/src/mbgl/gl/debugging_extension.cpp ${MBGL_ROOT}/src/mbgl/gl/debugging_extension.hpp ${MBGL_ROOT}/src/mbgl/gl/defines.hpp @@ -847,6 +844,8 @@ if(MBGL_WITH_OPENGL) ${MBGL_ROOT}/src/mbgl/gl/render_pass.hpp ${MBGL_ROOT}/src/mbgl/gl/renderbuffer_resource.hpp ${MBGL_ROOT}/src/mbgl/gl/renderer_backend.cpp + ${MBGL_ROOT}/src/mbgl/gl/render_custom_layer.cpp + ${MBGL_ROOT}/src/mbgl/gl/render_custom_layer.hpp ${MBGL_ROOT}/src/mbgl/gl/state.hpp ${MBGL_ROOT}/src/mbgl/gl/texture.cpp ${MBGL_ROOT}/src/mbgl/gl/texture.hpp @@ -864,6 +863,7 @@ if(MBGL_WITH_OPENGL) ${MBGL_ROOT}/src/mbgl/gl/vertex_array_extension.hpp ${MBGL_ROOT}/src/mbgl/gl/vertex_buffer_resource.cpp ${MBGL_ROOT}/src/mbgl/gl/vertex_buffer_resource.hpp + ${MBGL_ROOT}/src/mbgl/platform/gl_functions.cpp ${MBGL_ROOT}/src/mbgl/programs/gl/background.cpp ${MBGL_ROOT}/src/mbgl/programs/gl/background_pattern.cpp ${MBGL_ROOT}/src/mbgl/programs/gl/circle.cpp diff --git a/platform/default/src/mbgl/layermanager/layer_manager.cpp b/platform/default/src/mbgl/layermanager/layer_manager.cpp index b8abf794fc..f9e46d78ab 100644 --- a/platform/default/src/mbgl/layermanager/layer_manager.cpp +++ b/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -2,7 +2,9 @@ #include #include -#include +#ifdef MBGL_RENDER_BACKEND_OPENGL +#include +#endif #include #include #include @@ -59,9 +61,11 @@ LayerManagerDefault::LayerManagerDefault() { #if !defined(MBGL_LAYER_HEATMAP_DISABLE_ALL) addLayerType(std::make_unique()); #endif +#ifdef MBGL_RENDER_BACKEND_OPENGL #if !defined(MBGL_LAYER_CUSTOM_DISABLE_ALL) addLayerType(std::make_unique()); #endif +#endif } void LayerManagerDefault::addLayerType(std::unique_ptr factory) { diff --git a/src/mbgl/gl/custom_layer_factory.cpp b/src/mbgl/gl/custom_layer_factory.cpp new file mode 100644 index 0000000000..b70bb41c92 --- /dev/null +++ b/src/mbgl/gl/custom_layer_factory.cpp @@ -0,0 +1,21 @@ +#include +#include +#include +#include + +namespace mbgl { + +const style::LayerTypeInfo* CustomLayerFactory::getTypeInfo() const noexcept { + return style::CustomLayer::Impl::staticTypeInfo(); +} + +std::unique_ptr CustomLayerFactory::createLayer(const std::string&, const style::conversion::Convertible&) noexcept { + assert(false); + return nullptr; +} + +std::unique_ptr CustomLayerFactory::createRenderLayer(Immutable impl) noexcept { + return std::make_unique(staticImmutableCast(impl)); +} + +} // namespace mbgl diff --git a/src/mbgl/gl/render_custom_layer.cpp b/src/mbgl/gl/render_custom_layer.cpp new file mode 100644 index 0000000000..85c060c740 --- /dev/null +++ b/src/mbgl/gl/render_custom_layer.cpp @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace mbgl { + +using namespace style; + +namespace { + +inline const CustomLayer::Impl& impl(const Immutable& impl) { + assert(impl->getTypeInfo() == CustomLayer::Impl::staticTypeInfo()); + return static_cast(*impl); +} + +} // namespace + +RenderCustomLayer::RenderCustomLayer(Immutable _impl) + : RenderLayer(makeMutable(std::move(_impl))), + host(impl(baseImpl).host) { + assert(gfx::BackendScope::exists()); + MBGL_CHECK_ERROR(host->initialize()); +} + +RenderCustomLayer::~RenderCustomLayer() { + assert(gfx::BackendScope::exists()); + if (contextDestroyed) { + host->contextLost(); + } else { + MBGL_CHECK_ERROR(host->deinitialize()); + } +} + +void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) { + passes = RenderPass::Translucent; + // It is fine to not update `evaluatedProperties`, as `baseImpl` should never be updated for this layer. +} + +bool RenderCustomLayer::hasTransition() const { + return false; +} +bool RenderCustomLayer::hasCrossfade() const { + return false; +} + +void RenderCustomLayer::markContextDestroyed() { + contextDestroyed = true; +} + +void RenderCustomLayer::prepare(const LayerPrepareParameters&) { +} + +void RenderCustomLayer::render(PaintParameters& paintParameters) { + if (host != impl(baseImpl).host) { + //If the context changed, deinitialize the previous one before initializing the new one. + if (host && !contextDestroyed) { + MBGL_CHECK_ERROR(host->deinitialize()); + } + host = impl(baseImpl).host; + MBGL_CHECK_ERROR(host->initialize()); + } + + const TransformState& state = paintParameters.state; + + // TODO: remove cast + auto& glContext = static_cast(paintParameters.context); + // Reset GL state to a known state so the CustomLayer always has a clean slate. + glContext.bindVertexArray = 0; + glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly)); + glContext.setStencilMode(gfx::StencilMode::disabled()); + glContext.setColorMode(paintParameters.colorModeForRenderPass()); + glContext.setCullFaceMode(gfx::CullFaceMode::disabled()); + + 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.getBearing() * util::RAD2DEG; + parameters.pitch = state.getPitch(); + parameters.fieldOfView = state.getFieldOfView(); + mat4 projMatrix; + state.getProjMatrix(projMatrix); + parameters.projectionMatrix = projMatrix; + + MBGL_CHECK_ERROR(host->render(parameters)); + if (gfx::Backend::GetType() == gfx::Backend::Type::OpenGL) { + // Reset the view back to our original one, just in case the CustomLayer changed + // the viewport or Framebuffer. + paintParameters.backend.getDefaultRenderable().getResource().bind(); + glContext.setDirtyState(); + } +} + +} // namespace mbgl diff --git a/src/mbgl/gl/render_custom_layer.hpp b/src/mbgl/gl/render_custom_layer.hpp new file mode 100644 index 0000000000..698621eae6 --- /dev/null +++ b/src/mbgl/gl/render_custom_layer.hpp @@ -0,0 +1,27 @@ +#pragma once + +#include +#include + +namespace mbgl { + +class RenderCustomLayer final : public RenderLayer { +public: + explicit RenderCustomLayer(Immutable); + ~RenderCustomLayer() override; + +private: + void transition(const TransitionParameters&) override {} + void evaluate(const PropertyEvaluationParameters&) override; + bool hasTransition() const override; + bool hasCrossfade() const override; + void markContextDestroyed() override; + void prepare(const LayerPrepareParameters&) override; + + void render(PaintParameters&) override; + + bool contextDestroyed = false; + std::shared_ptr host; +}; + +} // namespace mbgl diff --git a/src/mbgl/layermanager/custom_layer_factory.cpp b/src/mbgl/layermanager/custom_layer_factory.cpp deleted file mode 100644 index f84f261e79..0000000000 --- a/src/mbgl/layermanager/custom_layer_factory.cpp +++ /dev/null @@ -1,22 +0,0 @@ -#include - -#include -#include -#include - -namespace mbgl { - -const style::LayerTypeInfo* CustomLayerFactory::getTypeInfo() const noexcept { - return style::CustomLayer::Impl::staticTypeInfo(); -} - -std::unique_ptr CustomLayerFactory::createLayer(const std::string&, const style::conversion::Convertible&) noexcept { - assert(false); - return nullptr; -} - -std::unique_ptr CustomLayerFactory::createRenderLayer(Immutable impl) noexcept { - return std::make_unique(staticImmutableCast(impl)); -} - -} // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp deleted file mode 100644 index b891869353..0000000000 --- a/src/mbgl/renderer/layers/render_custom_layer.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef MBGL_RENDER_BACKEND_OPENGL -#include -#include -#endif -#include - -namespace mbgl { - -using namespace style; - -namespace { - -inline const CustomLayer::Impl& impl(const Immutable& impl) { - assert(impl->getTypeInfo() == CustomLayer::Impl::staticTypeInfo()); - return static_cast(*impl); -} - -} // namespace - -RenderCustomLayer::RenderCustomLayer(Immutable _impl) - : RenderLayer(makeMutable(std::move(_impl))), - host(impl(baseImpl).host) { - assert(gfx::BackendScope::exists()); - MBGL_CHECK_ERROR(host->initialize()); -} - -RenderCustomLayer::~RenderCustomLayer() { - assert(gfx::BackendScope::exists()); - if (contextDestroyed) { - host->contextLost(); - } else { - MBGL_CHECK_ERROR(host->deinitialize()); - } -} - -void RenderCustomLayer::evaluate(const PropertyEvaluationParameters&) { - passes = RenderPass::Translucent; - // It is fine to not update `evaluatedProperties`, as `baseImpl` should never be updated for this layer. -} - -bool RenderCustomLayer::hasTransition() const { - return false; -} -bool RenderCustomLayer::hasCrossfade() const { - return false; -} - -void RenderCustomLayer::markContextDestroyed() { - contextDestroyed = true; -} - -void RenderCustomLayer::prepare(const LayerPrepareParameters&) { -} - -void RenderCustomLayer::render(PaintParameters& paintParameters) { - if (host != impl(baseImpl).host) { - //If the context changed, deinitialize the previous one before initializing the new one. - if (host && !contextDestroyed) { - MBGL_CHECK_ERROR(host->deinitialize()); - } - host = impl(baseImpl).host; - MBGL_CHECK_ERROR(host->initialize()); - } - - const TransformState& state = paintParameters.state; -#ifdef MBGL_RENDER_BACKEND_OPENGL - // TODO: remove cast - auto& glContext = static_cast(paintParameters.context); - if (gfx::Backend::GetType() == gfx::Backend::Type::OpenGL) { - // Reset GL state to a known state so the CustomLayer always has a clean slate. - glContext.bindVertexArray = 0; - glContext.setDepthMode(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly)); - glContext.setStencilMode(gfx::StencilMode::disabled()); - glContext.setColorMode(paintParameters.colorModeForRenderPass()); - glContext.setCullFaceMode(gfx::CullFaceMode::disabled()); - } -#endif - 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.getBearing() * util::RAD2DEG; - parameters.pitch = state.getPitch(); - parameters.fieldOfView = state.getFieldOfView(); - mat4 projMatrix; - state.getProjMatrix(projMatrix); - parameters.projectionMatrix = projMatrix; - - MBGL_CHECK_ERROR(host->render(parameters)); -#ifdef MBGL_RENDER_BACKEND_OPENGL - if (gfx::Backend::GetType() == gfx::Backend::Type::OpenGL) { - // Reset the view back to our original one, just in case the CustomLayer changed - // the viewport or Framebuffer. - paintParameters.backend.getDefaultRenderable().getResource().bind(); - glContext.setDirtyState(); - } -#else - (void)&paintParameters; -#endif -} - -} // namespace mbgl diff --git a/src/mbgl/renderer/layers/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp deleted file mode 100644 index 698621eae6..0000000000 --- a/src/mbgl/renderer/layers/render_custom_layer.hpp +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once - -#include -#include - -namespace mbgl { - -class RenderCustomLayer final : public RenderLayer { -public: - explicit RenderCustomLayer(Immutable); - ~RenderCustomLayer() override; - -private: - void transition(const TransitionParameters&) override {} - void evaluate(const PropertyEvaluationParameters&) override; - bool hasTransition() const override; - bool hasCrossfade() const override; - void markContextDestroyed() override; - void prepare(const LayerPrepareParameters&) override; - - void render(PaintParameters&) override; - - bool contextDestroyed = false; - std::shared_ptr host; -}; - -} // namespace mbgl diff --git a/src/mbgl/style/layers/custom_layer.cpp b/src/mbgl/style/layers/custom_layer.cpp index 30bb2d220e..44fb982167 100644 --- a/src/mbgl/style/layers/custom_layer.cpp +++ b/src/mbgl/style/layers/custom_layer.cpp @@ -2,7 +2,9 @@ #include #include -#include +#ifdef MBGL_RENDER_BACKEND_OPENGL +#include +#endif namespace mbgl { namespace style { diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index 04ee5f9df7..b92b4485b1 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include #include -- cgit v1.2.1