Changes to the custom Metal layer to allow more flexible rendering (#4446)

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: louwers <649392+louwers@users.noreply.github.com>
Co-authored-by: Bart Louwers <bart@emeel.net>
This commit is contained in:
Steve Gifford
2026-08-11 15:23:35 -07:00
committed by GitHub
parent d9664ee187
commit 49f80e95f3
41 changed files with 281 additions and 128 deletions

View File

@@ -96,7 +96,4 @@ list(APPEND
${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/mtl/custom_layer_render_parameters.cpp
)
find_library(METAL_FRAMEWORK Metal)
if (METAL_FRAMEWORK)
target_link_libraries(mbgl-core PRIVATE ${METAL_FRAMEWORK})
endif()
target_link_libraries(mbgl-core PRIVATE "-framework Metal")

View File

@@ -25,6 +25,7 @@ public:
mtl::CommandEncoder& getCommandEncoder() { return commandEncoder; }
const mtl::CommandEncoder& getCommandEncoder() const { return commandEncoder; }
const MTLCommandBufferPtr& getCommandBuffer() const { return commandBuffer; }
const MTLRenderCommandEncoderPtr& getMetalEncoder() const { return encoder; }
const gfx::RenderPassDescriptor& getDescriptor() const { return descriptor; }
@@ -71,6 +72,7 @@ private:
private:
gfx::RenderPassDescriptor descriptor;
mtl::CommandEncoder& commandEncoder;
MTLCommandBufferPtr commandBuffer;
MTLRenderCommandEncoderPtr encoder;
MTLDepthStencilStatePtr currentDepthStencilState;
MTLRenderPipelineStatePtr currentPipelineState;

View File

@@ -1,5 +1,6 @@
#pragma once
#include <mbgl/gfx/context.hpp>
#include <mbgl/style/layers/custom_layer_init_parameters.hpp>
#include <mbgl/style/layers/custom_layer_render_parameters.hpp>
@@ -24,6 +25,11 @@ public:
*/
virtual void initialize(const CustomLayerInitParameters&) = 0;
/**
* Called right before the layers start rendering.
*/
virtual void preRender(const mbgl::gfx::Context&, const mbgl::style::CustomLayerRenderParameters&) {};
/**
* Render the layer. This method is called once per frame. The
* implementation should not make any assumptions about the GL/Metal state (other

View File

@@ -1,6 +1,7 @@
#pragma once
#include <mbgl/style/layers/custom_layer_render_parameters.hpp>
#include <mbgl/gfx/render_pass.hpp>
#include <mbgl/mtl/mtl_fwd.hpp>
#include <Foundation/Foundation.hpp>
@@ -20,9 +21,12 @@ namespace mtl {
* Metal subclass of CustomLayerRenderParameters
*/
struct CustomLayerRenderParameters : mbgl::style::CustomLayerRenderParameters {
const std::unique_ptr<mbgl::gfx::RenderPass> &renderPass;
mbgl::mtl::MTLRenderCommandEncoderPtr encoder;
mbgl::mtl::MTLCommandBufferPtr commandBuffer;
mbgl::mtl::MTLRenderPassDescriptorPtr renderPassDesc;
CustomLayerRenderParameters(const PaintParameters&);
CustomLayerRenderParameters(const PaintParameters &);
};
} // namespace mtl

View File

@@ -135,9 +135,18 @@
}
- (void)preDrawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context {
id<MTLCommandBuffer> commandBuffer = self.commandBuffer;
id<MTLBlitCommandEncoder> blitEncoder = [commandBuffer blitCommandEncoder];
[blitEncoder endEncoding];
}
- (void)drawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context {
// Use the supplied render command encoder to encode commands
id<MTLCommandBuffer> commandBuffer = self.commandBuffer;
id<MTLRenderCommandEncoder> renderEncoder = self.renderEncoder;
MTLRenderPassDescriptor *renderPassDesc = self.renderPassDesc;
if(renderEncoder != nil)
{
MLNBackendResource* resource = [mapView backendResource];

View File

@@ -83,6 +83,18 @@ MLN_EXPORT
#pragma clang diagnostic pop
#if MLN_RENDER_BACKEND_METAL
/// The Metal command buffer is used to generate render and other encoders..
///
/// This property is only valid when using the Metal-based rendering backend.
/// If the OpenGL backend is in use, this property will be `nil`.
@property (nonatomic, weak) id<MTLCommandBuffer> commandBuffer;
/// The Metal render pass descriptor Metal draw commands.
///
/// This property is only valid when using the Metal-based rendering backend.
/// If the OpenGL backend is in use, this property will be `nil`.
@property (nonatomic, weak) MTLRenderPassDescriptor *renderPassDesc;
/// The Metal render command encoder used for issuing Metal draw commands.
///
/// This property is only valid when using the Metal-based rendering backend.
@@ -124,6 +136,19 @@ MLN_EXPORT
/// - Parameter mapView: The map view from whose style the layer is about to be removed.
- (void)willMoveFromMapView:(MLNMapView *)mapView;
/// Called right before the layer needs to draw a new frame in a map view.
///
/// Override this method in a subclass to do any pre-drawing of the layer’s content. The default
/// implementation of this method does nothing.
///
/// This call exists to do things with the rendering context before MapLibre Native adds its
/// own rendering commands.
///
/// - Parameters:
/// - mapView: The map view to which the layer draws.
/// - context: A context structure with information defining the frame to draw.
- (void)preDrawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context;
/// Called each time the layer needs to draw a new frame in a map view.
///
/// Override this method in a subclass to draw the layer’s content. The default

View File

@@ -10,6 +10,7 @@
#import <MetalKit/MetalKit.h>
#endif
#include <mbgl/gfx/context.hpp>
#include <mbgl/math/wrap.hpp>
#include <mbgl/style/layers/custom_layer.hpp>
@@ -72,6 +73,9 @@ class MLNCustomLayerHost;
- (void)willMoveFromMapView:(MLNMapView *)mapView {
}
- (void)preDrawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context {
}
- (void)drawInMapView:(MLNMapView *)mapView withContext:(MLNStyleLayerDrawingContext)context {
}
@@ -99,10 +103,47 @@ public:
}
}
void preRender(const mbgl::gfx::Context &context,
const mbgl::style::CustomLayerRenderParameters &parameters) override {
if (!layer) return;
#if MLN_RENDER_BACKEND_METAL
auto renderPassDesc =
static_cast<const mbgl::style::mtl::CustomLayerRenderParameters &>(parameters)
.renderPassDesc.get();
MTL::CommandBuffer *cmdPtr =
static_cast<const mbgl::style::mtl::CustomLayerRenderParameters &>(parameters)
.commandBuffer.get();
id<MTLCommandBuffer> commandBuffer = (__bridge id<MTLCommandBuffer>)cmdPtr;
layer.commandBuffer = commandBuffer;
layer.renderPassDesc = (__bridge MTLRenderPassDescriptor *)renderPassDesc;
#endif
MLNStyleLayerDrawingContext drawingContext = {
.size = CGSizeMake(parameters.width, parameters.height),
.centerCoordinate = CLLocationCoordinate2DMake(parameters.latitude, parameters.longitude),
.zoomLevel = parameters.zoom,
.direction = mbgl::util::wrap(parameters.bearing, 0., 360.),
.pitch = static_cast<CGFloat>(parameters.pitch),
.fieldOfView = static_cast<CGFloat>(parameters.fieldOfView),
.projectionMatrix = MLNMatrix4Make(parameters.projectionMatrix),
.nearClippedProjectionMatrix = MLNMatrix4Make(parameters.nearClippedProjectionMatrix)};
if (layer.mapView) {
[layer preDrawInMapView:layer.mapView withContext:drawingContext];
}
}
void render(const mbgl::style::CustomLayerRenderParameters &parameters) override {
if (!layer) return;
#if MLN_RENDER_BACKEND_METAL
MTL::CommandBuffer *cmdPtr =
static_cast<const mbgl::style::mtl::CustomLayerRenderParameters &>(parameters)
.commandBuffer.get();
id<MTLCommandBuffer> commandBuffer = (__bridge id<MTLCommandBuffer>)cmdPtr;
layer.commandBuffer = commandBuffer;
MTL::RenderCommandEncoder *ptr =
static_cast<const mbgl::style::mtl::CustomLayerRenderParameters &>(parameters)
.encoder.get();

View File

@@ -17,7 +17,8 @@ RenderPass::RenderPass(CommandEncoder& commandEncoder_, const char* name, const
resource.bind();
if (const auto& buffer = resource.getCommandBuffer()) {
if (const auto& cmdBuff = resource.getCommandBuffer()) {
commandBuffer = cmdBuff;
if (auto rpd = resource.getRenderPassDescriptor()) {
if (descriptor.clearColor) {
if (auto copy = NS::TransferPtr(rpd->copy())) {
@@ -29,7 +30,7 @@ RenderPass::RenderPass(CommandEncoder& commandEncoder_, const char* name, const
}
}
}
encoder = NS::RetainPtr(buffer->renderCommandEncoder(rpd.get()));
encoder = NS::RetainPtr(cmdBuff->renderCommandEncoder(rpd.get()));
const auto& texture = rpd->colorAttachments()->object(0)->texture();
width = texture->width();
@@ -92,10 +93,10 @@ NS::String* toNSString(const char* str) {
}
} // namespace
void RenderPass::pushDebugGroup(const char* name) {
void RenderPass::pushDebugGroup(const char* theName) {
assert(encoder);
if (encoder) {
encoder->pushDebugGroup(toNSString(name));
encoder->pushDebugGroup(toNSString(theName));
}
}
@@ -106,10 +107,10 @@ void RenderPass::popDebugGroup() {
}
}
void RenderPass::addDebugSignpost(const char* name) {
void RenderPass::addDebugSignpost(const char* theName) {
assert(encoder);
if (encoder) {
encoder->insertDebugSignpost(toNSString(name));
encoder->insertDebugSignpost(toNSString(theName));
}
}

View File

@@ -80,6 +80,7 @@ void RenderPluginLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaderRegis
[[maybe_unused]] gfx::Context& context,
[[maybe_unused]] const TransformState& transformState,
[[maybe_unused]] const std::shared_ptr<UpdateParameters>& updateParameters,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
[[maybe_unused]] UniqueChangeRequestVec& changes) {
// create layer group

View File

@@ -21,6 +21,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec&) override;

View File

@@ -116,6 +116,7 @@ void RenderBackgroundLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& state,
const std::shared_ptr<UpdateParameters>& updateParameters,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
[[maybe_unused]] UniqueChangeRequestVec& changes) {
assert(updateParameters);

View File

@@ -24,21 +24,22 @@ public:
~RenderBackgroundLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
std::optional<Color> getSolidBackground() const override;
void prepare(const LayerPrepareParameters&) override;
void prepare(const LayerPrepareParameters &) override;
// Paint properties
style::BackgroundPaintProperties::Unevaluated unevaluated;

View File

@@ -165,6 +165,7 @@ void RenderCircleLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -15,26 +15,27 @@ public:
~RenderCircleLayer() final = default;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
bool queryIntersectsFeature(const GeometryCoordinates&,
const GeometryTileFeature&,
bool queryIntersectsFeature(const GeometryCoordinates &,
const GeometryTileFeature &,
float,
const TransformState&,
const TransformState &,
float,
const mat4&,
const FeatureState&) const override;
const mat4 &,
const FeatureState &) const override;
private:
// Paint properties

View File

@@ -197,6 +197,7 @@ void RenderColorReliefLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -23,26 +23,27 @@ public:
~RenderColorReliefLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
void prepare(const LayerPrepareParameters&) override;
bool queryIntersectsFeature(const GeometryCoordinates&,
const GeometryTileFeature&,
void prepare(const LayerPrepareParameters &) override;
bool queryIntersectsFeature(const GeometryCoordinates &,
const GeometryTileFeature &,
float,
const TransformState&,
const TransformState &,
float,
const mat4&,
const FeatureState&) const override;
const mat4 &,
const FeatureState &) const override;
void updateColorRamp();
// Paint properties

View File

@@ -56,6 +56,7 @@ void RenderCustomDrawableLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& state,
const std::shared_ptr<UpdateParameters>& updateParameters,
const PaintParameters&,
const RenderTree& renderTree,
UniqueChangeRequestVec& changes) {
// check if host changed and update

View File

@@ -11,19 +11,20 @@ public:
~RenderCustomDrawableLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override {}
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override {}
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
void prepare(const LayerPrepareParameters&) override;
void prepare(const LayerPrepareParameters &) override;
std::shared_ptr<style::CustomDrawableLayerHost> host;
};

View File

@@ -13,10 +13,15 @@
#include <mbgl/gfx/drawable_custom_layer_host_tweaker.hpp>
#include <mbgl/gfx/drawable_builder.hpp>
#if MLN_RENDER_BACKEND_VULKAN
#if MLN_RENDER_BACKEND_METAL
#include <mbgl/style/layers/mtl/custom_layer_render_parameters.hpp>
#include <mbgl/mtl/render_pass.hpp>
#elif MLN_RENDER_BACKEND_VULKAN
#include <mbgl/vulkan/context.hpp>
#include <mbgl/vulkan/renderer_backend.hpp>
#include <mbgl/style/layers/vulkan/custom_layer_init_parameters.hpp>
#include <mbgl/style/layers/vulkan/custom_layer_render_parameters.hpp>
#include <mbgl/vulkan/render_pass.hpp>
#endif
// TODO: platform agnostic error checks
@@ -48,6 +53,20 @@ void initializeHost(const std::shared_ptr<style::CustomLayerHost>& host, [[maybe
}
#endif
}
void callPreRender(const std::shared_ptr<style::CustomLayerHost>& host,
gfx::Context& context,
const PaintParameters& paintParameters) {
#if MLN_RENDER_BACKEND_METAL
style::mtl::CustomLayerRenderParameters parameters(paintParameters);
#elif MLN_RENDER_BACKEND_VULKAN
style::vulkan::CustomLayerRenderParameters parameters(paintParameters);
#else
style::CustomLayerRenderParameters parameters(paintParameters);
#endif
host->preRender(context, parameters);
}
} // namespace
RenderCustomLayer::RenderCustomLayer(Immutable<style::CustomLayer::Impl> _impl)
@@ -87,6 +106,7 @@ void RenderCustomLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaders,
gfx::Context& context,
[[maybe_unused]] const TransformState& state,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
[[maybe_unused]] UniqueChangeRequestVec& changes) {
// create layer group
@@ -114,6 +134,9 @@ void RenderCustomLayer::update([[maybe_unused]] gfx::ShaderRegistry& shaders,
needsInitialize = false;
}
// call the pre-render
MBGL_CHECK_ERROR(callPreRender(host, context, paintParameters));
// create drawable
if (localLayerGroup->getDrawableCount() == 0 || hostChanged) {
localLayerGroup->clearDrawables();

View File

@@ -11,20 +11,21 @@ public:
~RenderCustomLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override {}
void evaluate(const PropertyEvaluationParameters&) override;
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 prepare(const LayerPrepareParameters &) override;
bool contextDestroyed = false;
bool needsInitialize = true;

View File

@@ -105,6 +105,7 @@ void RenderFillExtrusionLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty() || passes == RenderPass::None) {

View File

@@ -13,27 +13,28 @@ public:
~RenderFillExtrusionLayer() override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
bool is3D() const override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
bool queryIntersectsFeature(const GeometryCoordinates&,
const GeometryTileFeature&,
bool queryIntersectsFeature(const GeometryCoordinates &,
const GeometryTileFeature &,
float,
const TransformState&,
const TransformState &,
float,
const mat4&,
const FeatureState&) const override;
const mat4 &,
const FeatureState &) const override;
// Paint properties
style::FillExtrusionPaintProperties::Unevaluated unevaluated;

View File

@@ -121,6 +121,7 @@ void RenderFillLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -29,26 +29,27 @@ public:
~RenderFillLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
bool queryIntersectsFeature(const GeometryCoordinates&,
const GeometryTileFeature&,
bool queryIntersectsFeature(const GeometryCoordinates &,
const GeometryTileFeature &,
float,
const TransformState&,
const TransformState &,
float,
const mat4&,
const FeatureState&) const override;
const mat4 &,
const FeatureState &) const override;
// Paint properties
style::FillPaintProperties::Unevaluated unevaluated;

View File

@@ -162,6 +162,7 @@ void RenderHeatmapLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& state,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -27,6 +27,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec&) override;

View File

@@ -155,6 +155,7 @@ void RenderHillshadeLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
[[maybe_unused]] const TransformState& state,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -25,6 +25,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec&) override;

View File

@@ -226,6 +226,7 @@ void RenderLineLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
[[maybe_unused]] const std::shared_ptr<UpdateParameters>& parameters,
[[maybe_unused]] const PaintParameters& paintParameters,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty()) {

View File

@@ -28,32 +28,33 @@ public:
~RenderLineLayer() override;
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
void prepare(const LayerPrepareParameters&) override;
void prepare(const LayerPrepareParameters &) override;
bool queryIntersectsFeature(const GeometryCoordinates&,
const GeometryTileFeature&,
bool queryIntersectsFeature(const GeometryCoordinates &,
const GeometryTileFeature &,
float,
const TransformState&,
const TransformState &,
float,
const mat4&,
const FeatureState&) const override;
const mat4 &,
const FeatureState &) const override;
// Paint properties
style::LinePaintProperties::Unevaluated unevaluated;
float getLineWidth(const GeometryTileFeature&, float, const FeatureState&) const;
float getLineWidth(const GeometryTileFeature &, float, const FeatureState &) const;
void updateColorRamp();
std::shared_ptr<PremultipliedImage> colorRamp;

View File

@@ -1041,6 +1041,7 @@ void RenderLocationIndicatorLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
const RenderTree&,
UniqueChangeRequestVec& changes) {
const auto drawPasses = RenderPass::Translucent;

View File

@@ -30,6 +30,7 @@ public:
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
#endif

View File

@@ -102,6 +102,7 @@ void RenderRasterLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& /*state*/,
const std::shared_ptr<UpdateParameters>&,
[[maybe_unused]] const PaintParameters& paintParameters,
[[maybe_unused]] const RenderTree& renderTree,
[[maybe_unused]] UniqueChangeRequestVec& changes) {
if ((!renderTiles || renderTiles->empty()) && !imageData) {

View File

@@ -20,6 +20,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec&) override;

View File

@@ -441,6 +441,7 @@ void RenderSymbolLayer::update(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& state,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec& changes) {
if (!renderTiles || renderTiles->empty() || passes == RenderPass::None) {

View File

@@ -65,17 +65,18 @@ public:
~RenderSymbolLayer() override;
static style::IconPaintProperties::PossiblyEvaluated iconPaintProperties(
const style::SymbolPaintProperties::PossiblyEvaluated&);
const style::SymbolPaintProperties::PossiblyEvaluated &);
static style::TextPaintProperties::PossiblyEvaluated textPaintProperties(
const style::SymbolPaintProperties::PossiblyEvaluated&);
const style::SymbolPaintProperties::PossiblyEvaluated &);
/// Generate any changes needed by the layer
void update(gfx::ShaderRegistry&,
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const RenderTree&,
UniqueChangeRequestVec&) override;
void update(gfx::ShaderRegistry &,
gfx::Context &,
const TransformState &,
const std::shared_ptr<UpdateParameters> &,
const PaintParameters &,
const RenderTree &,
UniqueChangeRequestVec &) override;
/// Remove all the drawables for tiles
std::size_t removeAllDrawables() override;
@@ -85,27 +86,27 @@ protected:
/// This event is run to indicate if the layer should render or not for the current frame.
/// @param willRender Indicates if this layer should render or not
/// @param changes The collection of current pending change requests
void markLayerRenderable(bool willRender, UniqueChangeRequestVec&) override;
void markLayerRenderable(bool willRender, UniqueChangeRequestVec &) override;
/// @brief Called when the layer index changes
/// This event is run when a layer is added or removed from the style.
/// @param newLayerIndex The new layer index for this layer
/// @param changes The collection of current pending change requests
void layerIndexChanged(int32_t newLayerIndex, UniqueChangeRequestVec&) override;
void layerIndexChanged(int32_t newLayerIndex, UniqueChangeRequestVec &) override;
/// Called when the style layer is removed
void layerRemoved(UniqueChangeRequestVec&) override;
void layerRemoved(UniqueChangeRequestVec &) override;
/// Remove all drawables for the tile from the layer group
std::size_t removeTile(RenderPass, const OverscaledTileID&) override;
std::size_t removeTile(RenderPass, const OverscaledTileID &) override;
private:
void transition(const TransitionParameters&) override;
void evaluate(const PropertyEvaluationParameters&) override;
void transition(const TransitionParameters &) override;
void evaluate(const PropertyEvaluationParameters &) override;
bool hasTransition() const override;
bool hasCrossfade() const override;
void prepare(const LayerPrepareParameters&) override;
void prepare(const LayerPrepareParameters &) override;
private:
// Paint properties

View File

@@ -160,6 +160,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters&,
const RenderTree&,
UniqueChangeRequestVec&) {}

View File

@@ -951,6 +951,7 @@ void RenderOrchestrator::updateLayers(gfx::ShaderRegistry& shaders,
gfx::Context& context,
const TransformState& state,
const std::shared_ptr<UpdateParameters>& updateParameters,
const PaintParameters& paintParameters,
const RenderTree& renderTree) {
MLN_TRACE_FUNC();
@@ -979,7 +980,7 @@ void RenderOrchestrator::updateLayers(gfx::ShaderRegistry& shaders,
}
#endif
try {
renderLayer.update(shaders, context, state, updateParameters, renderTree, changes);
renderLayer.update(shaders, context, state, updateParameters, paintParameters, renderTree, changes);
} catch (...) {
observer->onRenderError(std::current_exception());
}

View File

@@ -138,6 +138,7 @@ public:
gfx::Context&,
const TransformState&,
const std::shared_ptr<UpdateParameters>&,
const PaintParameters& paintParameters,
const RenderTree&);
void processChanges();

View File

@@ -253,8 +253,12 @@ void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr<
// - LAYER GROUP UPDATE ------------------------------------------------------------------------
// Updates all layer groups and process changes
if (staticData && staticData->shaders) {
orchestrator.updateLayers(
*staticData->shaders, context, renderTreeParameters.transformParams.state, updateParameters, renderTree);
orchestrator.updateLayers(*staticData->shaders,
context,
renderTreeParameters.transformParams.state,
updateParameters,
parameters,
renderTree);
}
orchestrator.processChanges();

View File

@@ -1,6 +1,8 @@
#include <mbgl/style/layers/mtl/custom_layer_render_parameters.hpp>
#include <mbgl/renderer/paint_parameters.hpp>
#include <mbgl/mtl/render_pass.hpp>
#include <mbgl/mtl/renderer_backend.hpp>
#include <mbgl/mtl/renderable_resource.hpp>
#include <Foundation/Foundation.hpp>
#include <Metal/Metal.hpp>
@@ -10,9 +12,18 @@ namespace style {
namespace mtl {
CustomLayerRenderParameters::CustomLayerRenderParameters(const mbgl::PaintParameters& paintParameters)
: mbgl::style::CustomLayerRenderParameters(paintParameters) {
const mbgl::mtl::RenderPass& renderPass = static_cast<mbgl::mtl::RenderPass&>(*paintParameters.renderPass);
encoder = renderPass.getMetalEncoder();
: mbgl::style::CustomLayerRenderParameters(paintParameters),
renderPass(paintParameters.renderPass) {
const mbgl::gfx::Renderable& renderable = paintParameters.backend.getDefaultRenderable();
const mbgl::mtl::RenderableResource& resource = renderable.getResource<mbgl::mtl::RenderableResource>();
renderPassDesc = renderable.getResource<mbgl::mtl::RenderableResource>().getRenderPassDescriptor();
if (const auto& buffer_ = resource.getCommandBuffer()) {
commandBuffer = buffer_;
}
if (paintParameters.renderPass) {
const mbgl::mtl::RenderPass& metalRenderPass = static_cast<mbgl::mtl::RenderPass&>(*paintParameters.renderPass);
encoder = metalRenderPass.getMetalEncoder();
}
}
} // namespace mtl