From a42b559fbef38cee9937f0973d9f5e0518a087bf Mon Sep 17 00:00:00 2001 From: Stefan Karschti Date: Fri, 7 Jul 2023 21:24:10 +0300 Subject: [PATCH] Drawable Renderer (#1570), Custom layer (issue #1272) --- CMakeLists.txt | 18 +++-- bazel/core.bzl | 18 +++-- include/mbgl/gfx/drawable.hpp | 5 ++ include/mbgl/gfx/drawable_builder.hpp | 2 +- .../drawable_custom_layer_host_tweaker.hpp | 31 ++++++++ include/mbgl/gfx/renderable.hpp | 2 + .../custom_layer_factory.hpp | 0 .../{gl => style/layers}/custom_layer.hpp | 0 .../src/cpp/style/layers/custom_layer.hpp | 4 +- platform/android/src/example_custom_layer.cpp | 2 +- platform/darwin/src/MLNOpenGLStyleLayer.mm | 2 +- .../darwin/src/MLNOpenGLStyleLayer_Private.h | 2 +- .../src/mbgl/layermanager/layer_manager.cpp | 4 +- platform/ios/src/MLNMapView.mm | 2 +- src/mbgl/gfx/context.hpp | 6 ++ src/mbgl/gfx/drawable_builder.cpp | 2 +- .../drawable_custom_layer_host_tweaker.cpp | 46 +++++++++++ src/mbgl/gl/context.cpp | 11 +++ src/mbgl/gl/context.hpp | 6 +- src/mbgl/gl/drawable_gl.cpp | 4 + src/mbgl/gl/layer_group_gl.cpp | 7 +- .../custom_layer_factory.cpp | 8 +- .../layers}/render_custom_layer.cpp | 78 +++++++++++++++++-- .../layers}/render_custom_layer.hpp | 13 +++- src/mbgl/renderer/renderer.cpp | 13 +--- src/mbgl/renderer/renderer_impl.cpp | 29 +++++-- src/mbgl/renderer/renderer_impl.hpp | 2 + .../{gl => style/layers}/custom_layer.cpp | 6 +- .../layers}/custom_layer_impl.cpp | 2 +- .../layers}/custom_layer_impl.hpp | 2 +- src/mbgl/style/style_impl.cpp | 2 +- src/mbgl/tile/geometry_tile.cpp | 4 +- test/api/custom_layer.test.cpp | 2 +- test/gl/context.test.cpp | 2 +- test/style/style_layer.test.cpp | 4 +- 35 files changed, 264 insertions(+), 77 deletions(-) create mode 100644 include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp rename include/mbgl/{gl => layermanager}/custom_layer_factory.hpp (100%) rename include/mbgl/{gl => style/layers}/custom_layer.hpp (100%) create mode 100644 src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp rename src/mbgl/{gl => layermanager}/custom_layer_factory.cpp (75%) rename src/mbgl/{gl => renderer/layers}/render_custom_layer.cpp (59%) rename src/mbgl/{gl => renderer/layers}/render_custom_layer.hpp (66%) rename src/mbgl/{gl => style/layers}/custom_layer.cpp (91%) rename src/mbgl/{gl => style/layers}/custom_layer_impl.cpp (89%) rename src/mbgl/{gl => style/layers}/custom_layer_impl.hpp (94%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8e2436ebd..d4acdc480 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -142,6 +142,7 @@ if(MLN_DRAWABLE_RENDERER) ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_builder.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_tweaker.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_atlases_tweaker.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_block.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/uniform_buffer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/vertex_attribute.hpp @@ -170,6 +171,7 @@ if(MLN_DRAWABLE_RENDERER) ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_builder_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_atlases_tweaker.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/image_drawable_data.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/line_drawable_data.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gfx/symbol_drawable_data.hpp @@ -980,8 +982,8 @@ if(MLN_WITH_OPENGL) list(APPEND INCLUDE_FILES ${PROJECT_SOURCE_DIR}/include/mbgl/gfx/backend.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/custom_layer.hpp - ${PROJECT_SOURCE_DIR}/include/mbgl/gl/custom_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_layer.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_layer_factory.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/renderable_resource.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/gl/renderer_backend.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/location_indicator_layer_factory.hpp @@ -1046,10 +1048,10 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/command_encoder.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/context.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/context.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/custom_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/custom_layer_factory.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/custom_layer_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/custom_layer_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_layer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_layer_factory.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_layer_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_layer_impl.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/debugging_extension.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/debugging_extension.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/defines.hpp @@ -1065,8 +1067,8 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/offscreen_texture.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/offscreen_texture.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/program.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_custom_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_custom_layer.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_layer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_layer.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_pass.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/render_pass.hpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/renderbuffer_resource.hpp diff --git a/bazel/core.bzl b/bazel/core.bzl index 16c5edf48..acee701ac 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -825,10 +825,10 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/command_encoder.hpp", "src/mbgl/gl/context.cpp", "src/mbgl/gl/context.hpp", - "src/mbgl/gl/custom_layer.cpp", - "src/mbgl/gl/custom_layer_factory.cpp", - "src/mbgl/gl/custom_layer_impl.cpp", - "src/mbgl/gl/custom_layer_impl.hpp", + "src/mbgl/style/layers/custom_layer.cpp", + "src/mbgl/layermanager/custom_layer_factory.cpp", + "src/mbgl/style/layers/custom_layer_impl.cpp", + "src/mbgl/style/layers/custom_layer_impl.hpp", "src/mbgl/gl/debugging_extension.cpp", "src/mbgl/gl/debugging_extension.hpp", "src/mbgl/gl/defines.hpp", @@ -844,8 +844,8 @@ MLN_OPENGL_SOURCE = [ "src/mbgl/gl/offscreen_texture.cpp", "src/mbgl/gl/offscreen_texture.hpp", "src/mbgl/gl/program.hpp", - "src/mbgl/gl/render_custom_layer.cpp", - "src/mbgl/gl/render_custom_layer.hpp", + "src/mbgl/renderer/layers/render_custom_layer.cpp", + "src/mbgl/renderer/layers/render_custom_layer.hpp", "src/mbgl/gl/render_pass.cpp", "src/mbgl/gl/render_pass.hpp", "src/mbgl/gl/renderbuffer_resource.hpp", @@ -876,8 +876,8 @@ MLN_OPENGL_SOURCE = [ MLN_OPENGL_HEADERS = [ "include/mbgl/gfx/backend.hpp", - "include/mbgl/gl/custom_layer.hpp", - "include/mbgl/gl/custom_layer_factory.hpp", + "include/mbgl/style/layers/custom_layer.hpp", + "include/mbgl/layermanager/custom_layer_factory.hpp", "include/mbgl/gl/renderable_resource.hpp", "include/mbgl/gl/renderer_backend.hpp", "include/mbgl/layermanager/location_indicator_layer_factory.hpp", @@ -889,6 +889,7 @@ MLN_DRAWABLES_SOURCE = [ "src/mbgl/gfx/drawable_builder.cpp", "src/mbgl/gfx/drawable_builder_impl.hpp", "src/mbgl/gfx/drawable_atlases_tweaker.cpp", + "src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp", "src/mbgl/gfx/image_drawable_data.hpp", "src/mbgl/gfx/line_drawable_data.hpp", "src/mbgl/gfx/symbol_drawable_data.hpp", @@ -940,6 +941,7 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/gfx/drawable_builder.hpp", "include/mbgl/gfx/drawable_tweaker.hpp", "include/mbgl/gfx/drawable_atlases_tweaker.hpp", + "include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp", "include/mbgl/gfx/uniform_block.hpp", "include/mbgl/gfx/uniform_buffer.hpp", "include/mbgl/gfx/vertex_attribute.hpp", diff --git a/include/mbgl/gfx/drawable.hpp b/include/mbgl/gfx/drawable.hpp index 7c2dcc11e..883382b20 100644 --- a/include/mbgl/gfx/drawable.hpp +++ b/include/mbgl/gfx/drawable.hpp @@ -129,6 +129,10 @@ public: bool getIs3D() const { return is3D; } void setIs3D(bool value) { is3D = value; } + /// Is custom + bool getIsCustom() const { return isCustom; } + void setIsCustom(bool value) { isCustom = value; } + /// The ID of the tile that this drawable represents, if any const std::optional& getTileID() const { return tileID; } void setTileID(const OverscaledTileID& value) { tileID = value; } @@ -175,6 +179,7 @@ protected: bool enableColor = true; bool enableStencil = false; bool is3D = false; + bool isCustom = false; std::string name; util::SimpleIdentity uniqueID; gfx::ShaderProgramBasePtr shader; diff --git a/include/mbgl/gfx/drawable_builder.hpp b/include/mbgl/gfx/drawable_builder.hpp index b4da32511..20e55c49b 100644 --- a/include/mbgl/gfx/drawable_builder.hpp +++ b/include/mbgl/gfx/drawable_builder.hpp @@ -32,7 +32,7 @@ public: virtual ~DrawableBuilder(); /// Get the drawable we're currently working on, if any - const UniqueDrawable& getCurrentDrawable(bool createIfNone); + UniqueDrawable& getCurrentDrawable(bool createIfNone); /// Close the current drawable, using a new one for any further work void flush(); diff --git a/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp b/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp new file mode 100644 index 000000000..df6799fb0 --- /dev/null +++ b/include/mbgl/gfx/drawable_custom_layer_host_tweaker.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include +#include + +#include +#include + +namespace mbgl { + +namespace gfx { + +class Drawable; + +/** + Tweaker that enables drawing a CustomLayer via their CustomLayerHost + */ +class DrawableCustomLayerHostTweaker : public gfx::DrawableTweaker { +public: + DrawableCustomLayerHostTweaker(std::shared_ptr host_) + : host(host_) {} + ~DrawableCustomLayerHostTweaker() override = default; + + void execute(Drawable&, const PaintParameters&) override; + +protected: + std::shared_ptr host; +}; + +} // namespace gfx +} // namespace mbgl diff --git a/include/mbgl/gfx/renderable.hpp b/include/mbgl/gfx/renderable.hpp index 0145614fd..62052fa25 100644 --- a/include/mbgl/gfx/renderable.hpp +++ b/include/mbgl/gfx/renderable.hpp @@ -16,6 +16,8 @@ public: virtual ~RenderableResource() = default; RenderableResource(const RenderableResource&) = delete; RenderableResource& operator=(const RenderableResource&) = delete; + + virtual void bind() = 0; }; class Renderable { diff --git a/include/mbgl/gl/custom_layer_factory.hpp b/include/mbgl/layermanager/custom_layer_factory.hpp similarity index 100% rename from include/mbgl/gl/custom_layer_factory.hpp rename to include/mbgl/layermanager/custom_layer_factory.hpp diff --git a/include/mbgl/gl/custom_layer.hpp b/include/mbgl/style/layers/custom_layer.hpp similarity index 100% rename from include/mbgl/gl/custom_layer.hpp rename to include/mbgl/style/layers/custom_layer.hpp diff --git a/platform/android/MapboxGLAndroidSDK/src/cpp/style/layers/custom_layer.hpp b/platform/android/MapboxGLAndroidSDK/src/cpp/style/layers/custom_layer.hpp index e3d5baa04..5540aec87 100644 --- a/platform/android/MapboxGLAndroidSDK/src/cpp/style/layers/custom_layer.hpp +++ b/platform/android/MapboxGLAndroidSDK/src/cpp/style/layers/custom_layer.hpp @@ -1,8 +1,8 @@ #pragma once #include -#include -#include +#include +#include #include "layer.hpp" namespace mbgl { diff --git a/platform/android/src/example_custom_layer.cpp b/platform/android/src/example_custom_layer.cpp index a5578f8b6..caa44c983 100644 --- a/platform/android/src/example_custom_layer.cpp +++ b/platform/android/src/example_custom_layer.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include // DEBUGGING diff --git a/platform/darwin/src/MLNOpenGLStyleLayer.mm b/platform/darwin/src/MLNOpenGLStyleLayer.mm index 5a531754e..dc8689795 100644 --- a/platform/darwin/src/MLNOpenGLStyleLayer.mm +++ b/platform/darwin/src/MLNOpenGLStyleLayer.mm @@ -6,7 +6,7 @@ #import "MLNStyleLayer_Private.h" #import "MLNGeometry_Private.h" -#include +#include #include class MLNOpenGLLayerHost; diff --git a/platform/darwin/src/MLNOpenGLStyleLayer_Private.h b/platform/darwin/src/MLNOpenGLStyleLayer_Private.h index 3778ae5d2..07f59d7bf 100644 --- a/platform/darwin/src/MLNOpenGLStyleLayer_Private.h +++ b/platform/darwin/src/MLNOpenGLStyleLayer_Private.h @@ -2,7 +2,7 @@ #include "MLNStyleLayer_Private.h" -#include +#include namespace mbgl { diff --git a/platform/default/src/mbgl/layermanager/layer_manager.cpp b/platform/default/src/mbgl/layermanager/layer_manager.cpp index 3e5767957..fed82abfb 100644 --- a/platform/default/src/mbgl/layermanager/layer_manager.cpp +++ b/platform/default/src/mbgl/layermanager/layer_manager.cpp @@ -2,9 +2,7 @@ #include #include -#ifdef MBGL_RENDER_BACKEND_OPENGL -#include -#endif +#include #include #include #include diff --git a/platform/ios/src/MLNMapView.mm b/platform/ios/src/MLNMapView.mm index 9161b2ecc..1271858e3 100644 --- a/platform/ios/src/MLNMapView.mm +++ b/platform/ios/src/MLNMapView.mm @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/mbgl/gfx/context.hpp b/src/mbgl/gfx/context.hpp index f2349fc1e..7d0fa6c66 100644 --- a/src/mbgl/gfx/context.hpp +++ b/src/mbgl/gfx/context.hpp @@ -113,6 +113,9 @@ public: virtual void clearStencilBuffer(int32_t) = 0; + /// Sets dirty state + virtual void setDirtyState() = 0; + #if MLN_DRAWABLE_RENDERER public: /// Create a new drawable builder @@ -137,6 +140,9 @@ public: /// Create a render target virtual RenderTargetPtr createRenderTarget(const Size size, const TextureChannelDataType type) = 0; + + /// Resets the context state to defaults + virtual void resetState(gfx::DepthMode depthMode, gfx::ColorMode colorMode) = 0; #endif }; diff --git a/src/mbgl/gfx/drawable_builder.cpp b/src/mbgl/gfx/drawable_builder.cpp index 80ee2bb44..109ae3c5e 100644 --- a/src/mbgl/gfx/drawable_builder.cpp +++ b/src/mbgl/gfx/drawable_builder.cpp @@ -30,7 +30,7 @@ void DrawableBuilder::setCullFaceMode(const gfx::CullFaceMode& value) { impl->cullFaceMode = value; } -const UniqueDrawable& DrawableBuilder::getCurrentDrawable(bool createIfNone) { +UniqueDrawable& DrawableBuilder::getCurrentDrawable(bool createIfNone) { if (!currentDrawable && createIfNone) { currentDrawable = createDrawable(); } diff --git a/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp b/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp new file mode 100644 index 000000000..8700642ce --- /dev/null +++ b/src/mbgl/gfx/drawable_custom_layer_host_tweaker.cpp @@ -0,0 +1,46 @@ +#include +#include +#include +#include + +#include +#include + +#include + +namespace mbgl { +namespace gfx { + +void DrawableCustomLayerHostTweaker::execute([[maybe_unused]] gfx::Drawable& drawable, + const PaintParameters& paintParameters) { + // custom drawing + auto& context = paintParameters.context; + const TransformState& state = paintParameters.state; + context.resetState(paintParameters.depthModeForSublayer(0, gfx::DepthMaskType::ReadOnly), + paintParameters.colorModeForRenderPass()); + + style::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 = util::rad2deg(-state.getBearing()); + parameters.pitch = state.getPitch(); + parameters.fieldOfView = state.getFieldOfView(); + mat4 projMatrix; + state.getProjMatrix(projMatrix); + parameters.projectionMatrix = projMatrix; + + host->render(parameters); + + // Reset the view back to our original one, just in case the CustomLayer + // changed the viewport or Framebuffer. + paintParameters.backend.getDefaultRenderable().getResource().bind(); + + context.setDirtyState(); +} + +} // namespace gfx +} // namespace mbgl diff --git a/src/mbgl/gl/context.cpp b/src/mbgl/gl/context.cpp index a3ba6b963..a97dd2a23 100644 --- a/src/mbgl/gl/context.cpp +++ b/src/mbgl/gl/context.cpp @@ -423,6 +423,17 @@ void Context::reset() { performCleanup(); } +#if MLN_DRAWABLE_RENDERER +void Context::resetState(gfx::DepthMode depthMode, gfx::ColorMode colorMode) { + // Reset GL state to a known state so the CustomLayer always has a clean slate. + bindVertexArray = value::BindVertexArray::Default; + setDepthMode(depthMode); + setStencilMode(gfx::StencilMode::disabled()); + setColorMode(colorMode); + setCullFaceMode(gfx::CullFaceMode::disabled()); +} +#endif + void Context::setDirtyState() { // Note: does not set viewport/scissorTest/bindFramebuffer to dirty // since they are handled separately in the view object. diff --git a/src/mbgl/gl/context.hpp b/src/mbgl/gl/context.hpp index 7a6a978b1..e821f2700 100644 --- a/src/mbgl/gl/context.hpp +++ b/src/mbgl/gl/context.hpp @@ -100,8 +100,6 @@ public: abandonedFramebuffers.empty(); } - void setDirtyState(); - extension::Debugging* getDebuggingExtension() const { return debugging.get(); } void setCleanupOnDestruction(bool cleanup) { cleanupOnDestruction = cleanup; } @@ -121,8 +119,12 @@ public: RenderTargetPtr createRenderTarget(const Size size, const gfx::TextureChannelDataType type) override; UniqueFramebuffer createFramebuffer(const gfx::Texture2D& color); + + void resetState(gfx::DepthMode depthMode, gfx::ColorMode colorMode) override; #endif + void setDirtyState() override; + private: RendererBackend& backend; bool cleanupOnDestruction = true; diff --git a/src/mbgl/gl/drawable_gl.cpp b/src/mbgl/gl/drawable_gl.cpp index 3beb37552..a203e7e72 100644 --- a/src/mbgl/gl/drawable_gl.cpp +++ b/src/mbgl/gl/drawable_gl.cpp @@ -22,6 +22,10 @@ DrawableGL::~DrawableGL() { } void DrawableGL::draw(PaintParameters& parameters) const { + if (isCustom) { + return; + } + auto& context = static_cast(parameters.context); if (shader) { diff --git a/src/mbgl/gl/layer_group_gl.cpp b/src/mbgl/gl/layer_group_gl.cpp index fdc3e180f..324f6d5a1 100644 --- a/src/mbgl/gl/layer_group_gl.cpp +++ b/src/mbgl/gl/layer_group_gl.cpp @@ -106,12 +106,7 @@ void LayerGroupGL::upload(gfx::UploadPass& uploadPass) { auto& drawableGL = static_cast(drawable); #if !defined(NDEBUG) - std::string label; - if (const auto& tileID = drawable.getTileID()) { - label = drawable.getName() + "/" + util::toString(*tileID); - } - const auto labelPtr = (label.empty() ? drawable.getName() : label).c_str(); - const auto debugGroup = uploadPass.createDebugGroup(labelPtr); + const auto debugGroup = uploadPass.createDebugGroup(drawable.getName().c_str()); #endif drawableGL.upload(uploadPass); diff --git a/src/mbgl/gl/custom_layer_factory.cpp b/src/mbgl/layermanager/custom_layer_factory.cpp similarity index 75% rename from src/mbgl/gl/custom_layer_factory.cpp rename to src/mbgl/layermanager/custom_layer_factory.cpp index f8d98b694..df57b3fe6 100644 --- a/src/mbgl/gl/custom_layer_factory.cpp +++ b/src/mbgl/layermanager/custom_layer_factory.cpp @@ -1,7 +1,7 @@ -#include -#include -#include -#include +#include +#include +#include +#include namespace mbgl { diff --git a/src/mbgl/gl/render_custom_layer.cpp b/src/mbgl/renderer/layers/render_custom_layer.cpp similarity index 59% rename from src/mbgl/gl/render_custom_layer.cpp rename to src/mbgl/renderer/layers/render_custom_layer.cpp index e90af6bd6..cd7c233c7 100644 --- a/src/mbgl/gl/render_custom_layer.cpp +++ b/src/mbgl/renderer/layers/render_custom_layer.cpp @@ -1,16 +1,31 @@ #include #include -#include -#include -#include -#include +#include +#include #include #include -#include #include #include #include +#if MLN_LEGACY_RENDERER +#include +#include +#include +#endif + +#if MLN_DRAWABLE_RENDERER +#include +#include +#include +#include + +#if !MLN_LEGACY_RENDERER +// TODO: platform agnostic error checks +#define MBGL_CHECK_ERROR(cmd) (cmd) +#endif +#endif + namespace mbgl { using namespace style; @@ -58,6 +73,7 @@ void RenderCustomLayer::markContextDestroyed() { void RenderCustomLayer::prepare(const LayerPrepareParameters&) {} +#if MLN_LEGACY_RENDERER void RenderCustomLayer::render(PaintParameters& paintParameters) { if (host != impl(baseImpl).host) { // If the context changed, deinitialize the previous one before initializing the new one. @@ -100,5 +116,57 @@ void RenderCustomLayer::render(PaintParameters& paintParameters) { paintParameters.backend.getDefaultRenderable().getResource().bind(); glContext.setDirtyState(); } +#endif + +#if MLN_DRAWABLE_RENDERER +void RenderCustomLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaders, + gfx::Context& context, + [[maybe_unused]] const TransformState& state, + [[maybe_unused]] const RenderTree& renderTree, + [[maybe_unused]] UniqueChangeRequestVec& changes) { + std::unique_lock guard(mutex); + + // create layer group + if (!layerGroup) { + if (auto layerGroup_ = context.createLayerGroup(layerIndex, /*initialCapacity=*/1, getID())) { + setLayerGroup(std::move(layerGroup_), changes); + } + } + + auto* localLayerGroup = static_cast(layerGroup.get()); + + // check if host changed and update + bool hostChanged = (host != impl(baseImpl).host); + if (hostChanged) { + // 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()); + } + + // create drawable + if (localLayerGroup->getDrawableCount() == 0 || hostChanged) { + localLayerGroup->clearDrawables(); + + // create tweaker + auto tweaker = std::make_shared(host); + + // create empty drawable using a builder + std::unique_ptr builder = context.createDrawableBuilder(getID()); + auto& drawable = builder->getCurrentDrawable(true); + drawable->setIsCustom(true); + drawable->setRenderPass(RenderPass::Translucent); + + // assign tweaker to drawable + drawable->addTweaker(tweaker); + + // add drawable to layer group + localLayerGroup->addDrawable(std::move(drawable)); + ++stats.drawablesAdded; + } +} +#endif } // namespace mbgl diff --git a/src/mbgl/gl/render_custom_layer.hpp b/src/mbgl/renderer/layers/render_custom_layer.hpp similarity index 66% rename from src/mbgl/gl/render_custom_layer.hpp rename to src/mbgl/renderer/layers/render_custom_layer.hpp index 2f5ae2820..0cd7b16b6 100644 --- a/src/mbgl/gl/render_custom_layer.hpp +++ b/src/mbgl/renderer/layers/render_custom_layer.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include namespace mbgl { @@ -10,6 +10,15 @@ public: explicit RenderCustomLayer(Immutable); ~RenderCustomLayer() override; +#if MLN_DRAWABLE_RENDERER + /// Generate any changes needed by the layer + void update(gfx::ShaderRegistry&, + gfx::Context&, + const TransformState&, + const RenderTree&, + UniqueChangeRequestVec&) override; +#endif + private: void transition(const TransitionParameters&) override {} void evaluate(const PropertyEvaluationParameters&) override; @@ -18,7 +27,9 @@ private: void markContextDestroyed() override; void prepare(const LayerPrepareParameters&) override; +#if MLN_LEGACY_RENDERER void render(PaintParameters&) override; +#endif bool contextDestroyed = false; std::shared_ptr host; diff --git a/src/mbgl/renderer/renderer.cpp b/src/mbgl/renderer/renderer.cpp index 2e7f9f5ec..8a82c522e 100644 --- a/src/mbgl/renderer/renderer.cpp +++ b/src/mbgl/renderer/renderer.cpp @@ -32,18 +32,7 @@ void Renderer::render(const std::shared_ptr& updateParameters) assert(updateParameters); if (auto renderTree = impl->orchestrator.createRenderTree(updateParameters)) { renderTree->prepare(); - -#if MLN_DRAWABLE_RENDERER - const auto& renderTreeParameters = renderTree->getParameters(); - const auto& state = renderTreeParameters.transformParams.state; - - if (impl->staticData && impl->staticData->shaders) { - auto& context = impl->backend.getContext(); - auto& shaders = *impl->staticData->shaders; - impl->orchestrator.updateLayers(shaders, context, state, updateParameters, *renderTree); - } -#endif - + impl->preRender(*renderTree, updateParameters); impl->render(*renderTree); } } diff --git a/src/mbgl/renderer/renderer_impl.cpp b/src/mbgl/renderer/renderer_impl.cpp index edda24a72..cb73e3a4d 100644 --- a/src/mbgl/renderer/renderer_impl.cpp +++ b/src/mbgl/renderer/renderer_impl.cpp @@ -62,14 +62,8 @@ void Renderer::Impl::setObserver(RendererObserver* observer_) { observer = observer_ ? observer_ : &nullObserver(); } -void Renderer::Impl::render(const RenderTree& renderTree) { - if (renderState == RenderState::Never) { - observer->onWillStartRenderingMap(); - } - - observer->onWillStartRenderingFrame(); - const auto& renderTreeParameters = renderTree.getParameters(); - +void Renderer::Impl::preRender(const RenderTree& renderTree, + [[maybe_unused]] const std::shared_ptr& updateParameters) { auto& context = backend.getContext(); // Blocks execution until the renderable is available. backend.getDefaultRenderable().wait(); @@ -89,7 +83,26 @@ void Renderer::Impl::render(const RenderTree& renderTree) { // Notify post-shader registration observer->onRegisterShaders(*staticData->shaders); } + +#if MLN_DRAWABLE_RENDERER + // update layers + const auto& renderTreeParameters = renderTree.getParameters(); staticData->has3D = renderTreeParameters.has3D; + if (staticData && staticData->shaders) { + orchestrator.updateLayers( + *staticData->shaders, context, renderTreeParameters.transformParams.state, updateParameters, renderTree); + } +#endif +} + +void Renderer::Impl::render(const RenderTree& renderTree) { + if (renderState == RenderState::Never) { + observer->onWillStartRenderingMap(); + } + + observer->onWillStartRenderingFrame(); + auto& context = backend.getContext(); + const auto& renderTreeParameters = renderTree.getParameters(); PaintParameters parameters{context, pixelRatio, diff --git a/src/mbgl/renderer/renderer_impl.hpp b/src/mbgl/renderer/renderer_impl.hpp index ca137d9b3..cffd861ab 100644 --- a/src/mbgl/renderer/renderer_impl.hpp +++ b/src/mbgl/renderer/renderer_impl.hpp @@ -26,6 +26,8 @@ private: void setObserver(RendererObserver*); + void preRender(const RenderTree&, const std::shared_ptr&); + void render(const RenderTree&); void reduceMemoryUse(); diff --git a/src/mbgl/gl/custom_layer.cpp b/src/mbgl/style/layers/custom_layer.cpp similarity index 91% rename from src/mbgl/gl/custom_layer.cpp rename to src/mbgl/style/layers/custom_layer.cpp index bb6740c37..61a2b40e7 100644 --- a/src/mbgl/gl/custom_layer.cpp +++ b/src/mbgl/style/layers/custom_layer.cpp @@ -1,6 +1,6 @@ -#include -#include -#include +#include +#include +#include #include namespace mbgl { diff --git a/src/mbgl/gl/custom_layer_impl.cpp b/src/mbgl/style/layers/custom_layer_impl.cpp similarity index 89% rename from src/mbgl/gl/custom_layer_impl.cpp rename to src/mbgl/style/layers/custom_layer_impl.cpp index 8268272ae..a5264e446 100644 --- a/src/mbgl/gl/custom_layer_impl.cpp +++ b/src/mbgl/style/layers/custom_layer_impl.cpp @@ -1,4 +1,4 @@ -#include +#include namespace mbgl { namespace style { diff --git a/src/mbgl/gl/custom_layer_impl.hpp b/src/mbgl/style/layers/custom_layer_impl.hpp similarity index 94% rename from src/mbgl/gl/custom_layer_impl.hpp rename to src/mbgl/style/layers/custom_layer_impl.hpp index d0ea5f382..370db229f 100644 --- a/src/mbgl/gl/custom_layer_impl.hpp +++ b/src/mbgl/style/layers/custom_layer_impl.hpp @@ -1,6 +1,6 @@ #pragma once -#include +#include #include #include diff --git a/src/mbgl/style/style_impl.cpp b/src/mbgl/style/style_impl.cpp index aff1d3b57..1b9b8e798 100644 --- a/src/mbgl/style/style_impl.cpp +++ b/src/mbgl/style/style_impl.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include diff --git a/src/mbgl/tile/geometry_tile.cpp b/src/mbgl/tile/geometry_tile.cpp index d5fd2220c..297792a31 100644 --- a/src/mbgl/tile/geometry_tile.cpp +++ b/src/mbgl/tile/geometry_tile.cpp @@ -2,8 +2,8 @@ #include #include -#include -#include +#include +#include #include #include #include diff --git a/test/api/custom_layer.test.cpp b/test/api/custom_layer.test.cpp index 63ac1954f..ab820ac67 100644 --- a/test/api/custom_layer.test.cpp +++ b/test/api/custom_layer.test.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include #include #include diff --git a/test/gl/context.test.cpp b/test/gl/context.test.cpp index 95991f7d7..c8bc88fd6 100644 --- a/test/gl/context.test.cpp +++ b/test/gl/context.test.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/test/style/style_layer.test.cpp b/test/style/style_layer.test.cpp index c6c5478ba..3ae368c32 100644 --- a/test/style/style_layer.test.cpp +++ b/test/style/style_layer.test.cpp @@ -1,5 +1,5 @@ -#include -#include +#include +#include #include #include #include