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:
@@ -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")
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 ¶meters) 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 ¶meters) 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();
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -21,6 +21,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters&,
|
||||
const RenderTree&,
|
||||
UniqueChangeRequestVec&) override;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -27,6 +27,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters&,
|
||||
const RenderTree&,
|
||||
UniqueChangeRequestVec&) override;
|
||||
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -25,6 +25,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters&,
|
||||
const RenderTree&,
|
||||
UniqueChangeRequestVec&) override;
|
||||
|
||||
|
||||
@@ -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()) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -30,6 +30,7 @@ public:
|
||||
gfx::Context &,
|
||||
const TransformState &,
|
||||
const std::shared_ptr<UpdateParameters> &,
|
||||
const PaintParameters &,
|
||||
const RenderTree &,
|
||||
UniqueChangeRequestVec &) override;
|
||||
#endif
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -20,6 +20,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters&,
|
||||
const RenderTree&,
|
||||
UniqueChangeRequestVec&) override;
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -160,6 +160,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters&,
|
||||
const RenderTree&,
|
||||
UniqueChangeRequestVec&) {}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -138,6 +138,7 @@ public:
|
||||
gfx::Context&,
|
||||
const TransformState&,
|
||||
const std::shared_ptr<UpdateParameters>&,
|
||||
const PaintParameters& paintParameters,
|
||||
const RenderTree&);
|
||||
|
||||
void processChanges();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user