diff --git a/CMakeLists.txt b/CMakeLists.txt index d837dfb82..3d53022df 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1123,6 +1123,7 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/collision_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/style/layers/custom_drawable_layer.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/layermanager/custom_drawable_layer_factory.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/debug_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/fill_extrusion_layer_ubo.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/heatmap_layer_ubo.hpp @@ -1195,6 +1196,7 @@ if(MBGL_WITH_METAL) ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/common.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision_box.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/collision_circle.hpp + ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/debug.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill_extrusion.hpp ${PROJECT_SOURCE_DIR}/include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp @@ -1239,6 +1241,7 @@ if(MBGL_WITH_METAL) ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/collision_box.cpp ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/collision_circle.cpp ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/clipping_mask.cpp + ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/debug.cpp ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/fill.cpp ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/fill_extrusion.cpp ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp diff --git a/bazel/core.bzl b/bazel/core.bzl index 018afb979..6da4e34a7 100644 --- a/bazel/core.bzl +++ b/bazel/core.bzl @@ -974,6 +974,7 @@ MLN_DRAWABLES_HEADERS = [ "include/mbgl/shaders/background_layer_ubo.hpp", "include/mbgl/shaders/circle_layer_ubo.hpp", "include/mbgl/shaders/collision_layer_ubo.hpp", + "include/mbgl/shaders/debug_layer_ubo.hpp", "include/mbgl/shaders/fill_layer_ubo.hpp", "include/mbgl/shaders/fill_extrusion_layer_ubo.hpp", "include/mbgl/shaders/heatmap_layer_ubo.hpp", @@ -1042,6 +1043,7 @@ MLN_DRAWABLES_MTL_SOURCE = [ "src/mbgl/shaders/mtl/collision_box.cpp", "src/mbgl/shaders/mtl/collision_circle.cpp", "src/mbgl/shaders/mtl/clipping_mask.cpp", + "src/mbgl/shaders/mtl/debug.cpp", "src/mbgl/shaders/mtl/fill.cpp", "src/mbgl/shaders/mtl/fill_extrusion.cpp", "src/mbgl/shaders/mtl/fill_extrusion_pattern.cpp", @@ -1084,6 +1086,7 @@ MLN_DRAWABLES_MTL_HEADERS = [ "include/mbgl/shaders/mtl/collision_box.hpp", "include/mbgl/shaders/mtl/collision_circle.hpp", "include/mbgl/shaders/mtl/common.hpp", + "include/mbgl/shaders/mtl/debug.hpp", "include/mbgl/shaders/mtl/fill.hpp", "include/mbgl/shaders/mtl/fill_extrusion.hpp", "include/mbgl/shaders/mtl/fill_extrusion_pattern.hpp", diff --git a/include/mbgl/shaders/debug_layer_ubo.hpp b/include/mbgl/shaders/debug_layer_ubo.hpp new file mode 100644 index 000000000..d0f6adffa --- /dev/null +++ b/include/mbgl/shaders/debug_layer_ubo.hpp @@ -0,0 +1,17 @@ +#pragma once + +#include + +namespace mbgl { +namespace shaders { + +struct alignas(16) DebugUBO { + std::array matrix; + Color color; + float overlay_scale; + float pad1, pad2, pad3; +}; +static_assert(sizeof(DebugUBO) % 16 == 0); + +} // namespace shaders +} // namespace mbgl diff --git a/include/mbgl/shaders/mtl/debug.hpp b/include/mbgl/shaders/mtl/debug.hpp new file mode 100644 index 000000000..b59dc284f --- /dev/null +++ b/include/mbgl/shaders/mtl/debug.hpp @@ -0,0 +1,67 @@ +#pragma once + +#include +#include +#include +#include + +namespace mbgl { +namespace shaders { + +template <> +struct ShaderSource { + static constexpr auto name = "DebugShader"; + static constexpr auto vertexMainFunction = "vertexMain"; + static constexpr auto fragmentMainFunction = "fragmentMain"; + + static const std::array attributes; + static const std::array uniforms; + static const std::array textures; + + static constexpr auto source = R"( + +struct VertexStage { + short2 pos [[attribute(0)]]; +}; + +struct FragmentStage { + float4 position [[position, invariant]]; + float2 uv; +}; + +struct alignas(16) DebugUBO { + float4x4 matrix; + float4 color; + float overlay_scale; + float pad1, pad2, pad3; +}; + +FragmentStage vertex vertexMain(thread const VertexStage vertx [[stage_in]], + device const DebugUBO& debugUBO [[buffer(1)]]) { + + const float4 position = debugUBO.matrix * float4(float2(vertx.pos) * debugUBO.overlay_scale, 0, 1); + + // This vertex shader expects a EXTENT x EXTENT quad, + // The UV co-ordinates for the overlay texture can be calculated using that knowledge + float2 uv = float2(vertx.pos) / 8192.0; + + return { + .position = position, + .uv = uv + }; +} + +half4 fragment fragmentMain(FragmentStage in [[stage_in]], + device const DebugUBO& debugUBO [[buffer(1)]], + texture2d overlay [[texture(0)]], + sampler overlay_sampler [[sampler(0)]]) { + + float4 overlay_color = overlay.sample(overlay_sampler, in.uv); + float4 color = mix(debugUBO.color, overlay_color, overlay_color.a); + return half4(color); +} +)"; +}; + +} // namespace shaders +} // namespace mbgl diff --git a/src/mbgl/mtl/drawable.cpp b/src/mbgl/mtl/drawable.cpp index 23269c40c..4453823fc 100644 --- a/src/mbgl/mtl/drawable.cpp +++ b/src/mbgl/mtl/drawable.cpp @@ -63,6 +63,8 @@ MTL::PrimitiveType getPrimitiveType(const gfx::DrawModeType type) noexcept { return MTL::PrimitiveType::PrimitiveTypePoint; case gfx::DrawModeType::Lines: return MTL::PrimitiveType::PrimitiveTypeLine; + case gfx::DrawModeType::LineStrip: + return MTL::PrimitiveType::PrimitiveTypeLineStrip; case gfx::DrawModeType::Triangles: return MTL::PrimitiveType::PrimitiveTypeTriangle; } diff --git a/src/mbgl/mtl/renderer_backend.cpp b/src/mbgl/mtl/renderer_backend.cpp index 2b29e1592..aec036803 100644 --- a/src/mbgl/mtl/renderer_backend.cpp +++ b/src/mbgl/mtl/renderer_backend.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -128,6 +129,7 @@ void RendererBackend::initShaders(gfx::ShaderRegistry& shaders, const ProgramPar shaders::BuiltIn::ClippingMaskProgram, shaders::BuiltIn::CollisionBoxShader, shaders::BuiltIn::CollisionCircleShader, + shaders::BuiltIn::DebugShader, shaders::BuiltIn::FillShader, shaders::BuiltIn::FillOutlineShader, shaders::BuiltIn::FillOutlinePatternShader, diff --git a/src/mbgl/renderer/sources/render_tile_source.cpp b/src/mbgl/renderer/sources/render_tile_source.cpp index 47d628fe0..d0e1f18ea 100644 --- a/src/mbgl/renderer/sources/render_tile_source.cpp +++ b/src/mbgl/renderer/sources/render_tile_source.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -25,6 +26,7 @@ namespace mbgl { using namespace style; +using namespace shaders; void TileSourceRenderItem::upload(gfx::UploadPass& parameters) const { for (auto& tile : *renderTiles) { @@ -47,15 +49,6 @@ void TileSourceRenderItem::updateDebugDrawables(DebugLayerGroupMap& debugLayerGr return; } - // Debug UBO definition - struct alignas(16) DebugUBO { - std::array matrix; - Color color; - float overlay_scale; - float pad1, pad2, pad3; - }; - static_assert(sizeof(DebugUBO) % 16 == 0); - // initialize auto& context = parameters.context; const auto renderPass = RenderPass::None; diff --git a/src/mbgl/shaders/mtl/debug.cpp b/src/mbgl/shaders/mtl/debug.cpp new file mode 100644 index 000000000..28d9737b8 --- /dev/null +++ b/src/mbgl/shaders/mtl/debug.cpp @@ -0,0 +1,17 @@ +#include + +namespace mbgl { +namespace shaders { + +const std::array ShaderSource::attributes = { + AttributeInfo{0, gfx::AttributeDataType::Short2, 1, "a_pos"}, +}; +const std::array ShaderSource::uniforms = { + UniformBlockInfo{1, true, true, sizeof(DebugUBO), "DebugUBO"}, +}; +const std::array ShaderSource::textures = { + TextureInfo{0, "u_overlay"}, +}; + +} // namespace shaders +} // namespace mbgl