diff --git a/.github/workflows/macos-ci.yml b/.github/workflows/macos-ci.yml index a85a1f111..efdc64870 100644 --- a/.github/workflows/macos-ci.yml +++ b/.github/workflows/macos-ci.yml @@ -80,5 +80,3 @@ jobs: - name: Generate Xcode project for macOS run: bazel run //platform/macos:xcodeproj --@rules_xcodeproj//xcodeproj:extra_common_flags="--//:renderer=metal" - - \ No newline at end of file diff --git a/.github/workflows/node-ci.yml b/.github/workflows/node-ci.yml index 68650c07f..bfc874532 100644 --- a/.github/workflows/node-ci.yml +++ b/.github/workflows/node-ci.yml @@ -78,12 +78,10 @@ jobs: arch: x86_64 - runs-on: [self-hosted, linux, ARM64] arch: arm64 - # Disabled until Metal backend is complete - # A release for macOS can be made from the opengl-2 branch - # - runs-on: macos-12 - # arch: x86_64 - # - runs-on: macos-13-xlarge - # arch: arm64 + - runs-on: macos-14 + arch: arm64 + - runs-on: macos-14-large + arch: x86_64 - runs-on: windows-2022 arch: x86_64 continue-on-error: true @@ -209,7 +207,12 @@ jobs: -G Ninja \ -DCMAKE_BUILD_TYPE=${{ env.BUILDTYPE }} \ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \ - -DMLN_WITH_NODE=ON + -DMLN_WITH_NODE=ON \ + -DMLN_WITH_OPENGL=OFF \ + -DMLN_WITH_METAL=ON \ + -DMLN_LEGACY_RENDERER=OFF \ + -DMLN_DRAWABLE_RENDERER=ON \ + -DMLN_WITH_WERROR=OFF - name: Configure maplibre-native (Linux) if: runner.os == 'Linux' @@ -261,13 +264,17 @@ jobs: - name: Run render tests on macOS if: runner.os == 'macOS' - run: set -o pipefail && ./build/mbgl-render-test-runner --manifestPath metrics/macos-xcode11-release-style.json + # A few are failing + # https://github.com/maplibre/maplibre-native/issues/2741 + # Almost all are failing on Intel GitHub runners (but only on CI) + continue-on-error: true + run: ./build/mbgl-render-test-runner --manifestPath metrics/macos-xcode11-release-style.json - name: Upload render test artifacts (MacOS) if: runner.os == 'MacOS' uses: actions/upload-artifact@v4 with: - name: render-query-test-results + name: render-query-test-results_${{ runner.os }}_${{ matrix.arch }} path: metrics/macos-xcode11-release-style.html - name: Test (Linux) @@ -277,6 +284,7 @@ jobs: - name: Test (MacOS) if: runner.os == 'MacOS' + continue-on-error: true # flaky on CI working-directory: platform/node run: npm test diff --git a/CMakeLists.txt b/CMakeLists.txt index cc87d95c6..f36cb26dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1166,22 +1166,16 @@ if(MLN_WITH_OPENGL) ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_block_gl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/uniform_buffer_gl.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/gl/vertex_attribute_gl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_drawable_layer_factory.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp ) endif() endif() -if(MBGL_WITH_METAL) +if(MLN_WITH_METAL) message(STATUS "Configuring Metal renderer backend") target_compile_definitions( mbgl-core - PRIVATE - MBGL_RENDER_BACKEND_METAL=1 + PRIVATE MLN_RENDER_BACKEND_METAL=1 + PUBLIC "MLN_USE_UNORDERED_DENSE=$" ) list(APPEND @@ -1251,28 +1245,33 @@ if(MBGL_WITH_METAL) ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/vertex_attribute.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/mtl/vertex_buffer_resource.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/shader_program.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/background.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/background_pattern.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/circle.cpp - ${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/custom_symbol_icon.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 - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/heatmap.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/heatmap_texture.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/hillshade.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/hillshade_prepare.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/line.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/raster.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/symbol_icon.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/symbol_sdf.cpp - ${PROJECT_SOURCE_DIR}src/mbgl/shaders/mtl/symbol_text_and_icon.cpp - ] + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/background.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/background_pattern.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/circle.cpp + ${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/custom_symbol_icon.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 + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/heatmap.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/heatmap_texture.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/hillshade_prepare.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/line.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/raster.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_icon.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_sdf.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/mtl/symbol_text_and_icon.cpp ) + + find_library(METAL_FRAMEWORK Metal) + if (METAL_FRAMEWORK) + target_link_libraries(mbgl-core PRIVATE ${METAL_FRAMEWORK}) + endif() + endif() if(MLN_WITH_VULKAN) @@ -1352,16 +1351,17 @@ if(MLN_WITH_VULKAN) ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/raster.cpp ${PROJECT_SOURCE_DIR}/src/mbgl/shaders/vulkan/symbol.cpp ) +endif() - #TODO merge with MLN_DRAWABLE_RENDERER? These are added only for GL path +if(MLN_DRAWABLE_RENDERER) list(APPEND - SRC_FILES - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_drawable_layer_factory.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp - ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp + SRC_FILES + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/layermanager/custom_drawable_layer_factory.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/style/layers/custom_drawable_layer_impl.hpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.cpp + ${PROJECT_SOURCE_DIR}/src/mbgl/renderer/layers/render_custom_drawable_layer.hpp ) endif() @@ -1439,6 +1439,8 @@ include(${PROJECT_SOURCE_DIR}/vendor/tracy.cmake) include(${PROJECT_SOURCE_DIR}/vendor/unique_resource.cmake) include(${PROJECT_SOURCE_DIR}/vendor/vector-tile.cmake) include(${PROJECT_SOURCE_DIR}/vendor/wagyu.cmake) +include(${PROJECT_SOURCE_DIR}/vendor/metal-cpp.cmake) + add_subdirectory(${PROJECT_SOURCE_DIR}/vendor/unordered_dense) set_target_properties( @@ -1469,6 +1471,7 @@ target_link_libraries( mbgl-vendor-unique_resource mbgl-vendor-vector-tile mbgl-vendor-wagyu + $<$:mbgl-vendor-metal-cpp> PUBLIC Mapbox::Base Mapbox::Base::Extras::expected-lite @@ -1507,6 +1510,7 @@ export(TARGETS mbgl-vendor-unique_resource mbgl-vendor-vector-tile mbgl-vendor-wagyu + mbgl-vendor-metal-cpp unordered_dense FILE MapboxCoreTargets.cmake @@ -1553,6 +1557,8 @@ elseif(CMAKE_SYSTEM_NAME STREQUAL Android) include(${PROJECT_SOURCE_DIR}/platform/android/android.cmake) elseif(CMAKE_SYSTEM_NAME STREQUAL Linux) include(${PROJECT_SOURCE_DIR}/platform/linux/linux.cmake) +elseif(CMAKE_SYSTEM_NAME STREQUAL Darwin) + include(${PROJECT_SOURCE_DIR}/platform/macos/macos.cmake) elseif(WIN32) include(${PROJECT_SOURCE_DIR}/platform/windows/windows.cmake) else() @@ -1561,4 +1567,4 @@ endif() add_subdirectory(${PROJECT_SOURCE_DIR}/test) add_subdirectory(${PROJECT_SOURCE_DIR}/benchmark) -add_subdirectory(${PROJECT_SOURCE_DIR}/render-test) \ No newline at end of file +add_subdirectory(${PROJECT_SOURCE_DIR}/render-test) diff --git a/include/mbgl/mtl/context.hpp b/include/mbgl/mtl/context.hpp index ce95fc45f..da71c3b6d 100644 --- a/include/mbgl/mtl/context.hpp +++ b/include/mbgl/mtl/context.hpp @@ -127,7 +127,7 @@ public: virtual bool emplaceOrUpdateUniformBuffer(gfx::UniformBufferPtr&, const void* data, std::size_t size, - bool persistent); + bool persistent) override; /// Get an empty buffer to act as a placeholder const BufferResource& getEmptyBuffer(); diff --git a/platform/glfw/CMakeLists.txt b/platform/glfw/CMakeLists.txt index ea9546420..e8db2bc77 100644 --- a/platform/glfw/CMakeLists.txt +++ b/platform/glfw/CMakeLists.txt @@ -59,6 +59,26 @@ if(MLN_WITH_VULKAN) ) endif() +if(MLN_WITH_METAL) + target_sources( + mbgl-glfw + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_metal_backend.mm + ${PROJECT_SOURCE_DIR}/platform/glfw/metal_backend.mm + ${PROJECT_SOURCE_DIR}/platform/glfw/glfw_metal_backend.h + ${PROJECT_SOURCE_DIR}/platform/glfw/metal_backend.h + ) + target_compile_definitions( + mbgl-glfw + PRIVATE MLN_RENDER_BACKEND_METAL=1 + ) + target_link_libraries( + mbgl-glfw + PRIVATE + mbgl-vendor-metal-cpp + ) +endif() + target_include_directories( mbgl-glfw PRIVATE @@ -113,6 +133,8 @@ if(NOT WIN32 AND MLN_WITH_OPENGL) ) endif() + + set_property(TARGET mbgl-glfw PROPERTY FOLDER MapLibre) install(TARGETS mbgl-glfw RUNTIME DESTINATION bin) diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index ff9c6a426..636978491 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -218,7 +218,7 @@ GLFWView::GLFWView(bool fullscreen_, #ifdef __APPLE__ int fbW, fbH; glfwGetFramebufferSize(window, &fbW, &fbH); - backend->setSize({fbW, fbH}); + backend->setSize({static_cast(fbW), static_cast(fbH)}); #endif pixelRatio = static_cast(backend->getSize().width) / width; @@ -900,7 +900,7 @@ void GLFWView::onWindowResize(GLFWwindow *window, int width, int height) { #ifdef __APPLE__ int fbW, fbH; glfwGetFramebufferSize(window, &fbW, &fbH); - view->backend->setSize({fbW, fbH}); + view->backend->setSize({static_cast(fbW), static_cast(fbH)}); #endif } diff --git a/platform/glfw/metal_backend.mm b/platform/glfw/metal_backend.mm index 8b94f393c..fe2bc5880 100644 --- a/platform/glfw/metal_backend.mm +++ b/platform/glfw/metal_backend.mm @@ -22,7 +22,7 @@ public: void setBackendSize(mbgl::Size size_) { size = size_; - swapchain->setDrawableSize({size.width, size.height}); + swapchain->setDrawableSize({static_cast(size.width), static_cast(size.height)}); buffersInvalid = true; } diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake new file mode 100644 index 000000000..b47fc87cb --- /dev/null +++ b/platform/macos/macos.cmake @@ -0,0 +1,181 @@ +cmake_minimum_required(VERSION 3.19) +set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15") + +# Override default CMake NATIVE_ARCH_ACTUAL +# https://gitlab.kitware.com/cmake/cmake/-/issues/20893 +# https://stackoverflow.com/a/22689917/5531400 +if(CMAKE_GENERATOR STREQUAL Xcode) + set(CMAKE_OSX_ARCHITECTURES "$(ARCHS_STANDARD)") +endif() +set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES") + +set_target_properties(mbgl-core PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC YES) + +if(MLN_WITH_OPENGL) + find_package(OpenGL REQUIRED) + + target_compile_definitions( + mbgl-core + PUBLIC GL_SILENCE_DEPRECATION + ) + target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gl/headless_backend.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/src/gl_functions.cpp ${PROJECT_SOURCE_DIR}/platform/darwin/src/headless_backend_cgl.mm + ) + target_link_libraries( + mbgl-core + PRIVATE OpenGL::GL + ) +endif() + +if(MLN_WITH_METAL) + find_package(OpenGL REQUIRED) + + target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/mtl/headless_backend.cpp + ) +endif() + +target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/darwin/src/async_task.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/src/collator.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/http_file_source.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/image.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/local_glyph_rasterizer.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/logging_nslog.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/native_apple_interface.m + ${PROJECT_SOURCE_DIR}/platform/darwin/src/nsthread.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/number_format.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/run_loop.cpp + ${PROJECT_SOURCE_DIR}/platform/darwin/src/string_nsstring.mm + ${PROJECT_SOURCE_DIR}/platform/darwin/src/timer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_backend.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/gfx/headless_frontend.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/layermanager/layer_manager.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/map/map_snapshotter.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/platform/time.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/asset_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/mbtiles_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/database_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_manager.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/file_source_request.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_request.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/local_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/main_resource_loader.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_database.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/offline_download.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/online_file_source.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/storage/sqlite3.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/text/bidi.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/compression.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/filesystem.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/monotonic_timer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/png_writer.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/thread_local.cpp + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/util/utf.cpp +) + +target_compile_options(mbgl-core PRIVATE -fobjc-arc) + +# FIXME: Should not be needed, but now needed by node because of the headless frontend. +target_include_directories( + mbgl-core + PUBLIC ${PROJECT_SOURCE_DIR}/platform/default/include +) + +target_include_directories( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/darwin/include ${PROJECT_SOURCE_DIR}/platform/darwin/src ${PROJECT_SOURCE_DIR}/platform/macos/src +) + +include(${PROJECT_SOURCE_DIR}/vendor/icu.cmake) + +target_link_libraries( + mbgl-core + PRIVATE + "-framework AppKit" + "-framework CoreGraphics" + "-framework CoreLocation" + "-framework SystemConfiguration" + mbgl-vendor-icu + sqlite3 + z +) + +add_subdirectory(${PROJECT_SOURCE_DIR}/bin) +add_subdirectory(${PROJECT_SOURCE_DIR}/expression-test) +add_subdirectory(${PROJECT_SOURCE_DIR}/platform/glfw) +if(MLN_WITH_NODE) + add_subdirectory(${PROJECT_SOURCE_DIR}/platform/node) +endif() + +add_executable( + mbgl-test-runner + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/test/main.cpp +) + +target_include_directories( + mbgl-test-runner + PUBLIC ${PROJECT_SOURCE_DIR}/include ${PROJECT_SOURCE_DIR}/test/include +) + +target_compile_definitions( + mbgl-test-runner + PRIVATE WORK_DIRECTORY=${PROJECT_SOURCE_DIR} +) + +target_link_libraries( + mbgl-test-runner + PRIVATE mbgl-compiler-options -Wl,-force_load mbgl-test +) + +add_executable( + mbgl-benchmark-runner + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/benchmark/main.cpp +) + +target_include_directories( + mbgl-benchmark-runner + PUBLIC ${PROJECT_SOURCE_DIR}/benchmark/include +) + +target_link_libraries( + mbgl-benchmark-runner + PRIVATE mbgl-compiler-options -Wl,-force_load mbgl-benchmark +) + +add_executable( + mbgl-render-test-runner + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/render-test/main.cpp +) + +target_link_libraries( + mbgl-render-test-runner + PRIVATE mbgl-compiler-options mbgl-render-test +) + +set_property(TARGET mbgl-benchmark-runner PROPERTY FOLDER Executables) +set_property(TARGET mbgl-test-runner PROPERTY FOLDER Executables) +set_property(TARGET mbgl-render-test-runner PROPERTY FOLDER Executables) +set_target_properties(mbgl-benchmark-runner mbgl-test-runner mbgl-render-test-runner PROPERTIES XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] "YES") + +# Disable benchmarks in CI as they run in VM environment +if(NOT DEFINED ENV{CI}) + add_test(NAME mbgl-benchmark-runner COMMAND mbgl-benchmark-runner WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) +endif() +add_test( + NAME mbgl-test-runner + COMMAND + node + ${PROJECT_SOURCE_DIR}/test/storage/with-server.js + ${PROJECT_SOURCE_DIR}/test/storage/server.js + $ + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) \ No newline at end of file diff --git a/src/mbgl/mtl/texture2d.cpp b/src/mbgl/mtl/texture2d.cpp index 3901a5c80..816ed9a08 100644 --- a/src/mbgl/mtl/texture2d.cpp +++ b/src/mbgl/mtl/texture2d.cpp @@ -82,15 +82,16 @@ size_t Texture2D::numChannels() const noexcept { } MTL::PixelFormat Texture2D::getMetalPixelFormat() const noexcept { - // On iOS simulator, we need to use the combined depth/stencil format. If the depth and stencil + // On iOS simulator and x86-64, we need to use the combined depth/stencil format. If the depth and stencil // formats are both set on a render pipeline, they have to be identical or we'll get, e.g.: // validateWithDevice:4343: failed assertion `Render Pipeline Descriptor Validation // depthAttachmentPixelFormat (MTLPixelFormatDepth32Float) and // stencilAttachmentPixelFormat (MTLPixelFormatStencil8) must match. -#if TARGET_OS_SIMULATOR - if (channelType == gfx::TextureChannelDataType::Float && pixelFormat == gfx::TexturePixelType::Depth && - (usage & MTL::TextureUsageRenderTarget)) { +#if TARGET_OS_SIMULATOR || defined(__x86_64__) + if ((channelType == gfx::TextureChannelDataType::Float || + channelType == gfx::TextureChannelDataType::UnsignedByte) && + (pixelFormat == gfx::TexturePixelType::Depth || pixelFormat == gfx::TexturePixelType::Stencil)) { return MTL::PixelFormatDepth32Float_Stencil8; } #endif @@ -151,7 +152,7 @@ void Texture2D::createMetalTexture() noexcept { if (auto textureDescriptor = NS::RetainPtr( MTL::TextureDescriptor::texture2DDescriptor(format, size.width, size.height, /*mipmapped=*/false))) { textureDescriptor->setUsage(usage); -#if TARGET_OS_SIMULATOR +#if TARGET_OS_SIMULATOR || defined(__x86_64__) switch (format) { case MTL::PixelFormatDepth16Unorm: case MTL::PixelFormatDepth32Float: @@ -160,7 +161,7 @@ void Texture2D::createMetalTexture() noexcept { case MTL::PixelFormatDepth32Float_Stencil8: case MTL::PixelFormatX32_Stencil8: case MTL::PixelFormatX24_Stencil8: - // On iOS simulator, the default shared mode is invalid for depth and stencil textures. + // On iOS simulator and x86-64, the default shared mode is invalid for depth and stencil textures. // 'Texture Descriptor Validation MTLTextureDescriptor: Depth, Stencil, DepthStencil // textures cannot be allocated with MTLStorageModeShared on this device. textureDescriptor->setStorageMode(MTL::StorageMode::StorageModePrivate); diff --git a/src/mbgl/renderer/paint_parameters.cpp b/src/mbgl/renderer/paint_parameters.cpp index bff2dbec8..e4957ff65 100644 --- a/src/mbgl/renderer/paint_parameters.cpp +++ b/src/mbgl/renderer/paint_parameters.cpp @@ -192,7 +192,7 @@ void PaintParameters::renderTileClippingMasks(const RenderTiles& renderTiles) { } tileUBOs.emplace_back(shaders::ClipUBO{/*.matrix=*/util::cast(matrixForTile(tileID)), - /*.stencil_ref=*/stencilID, + /*.stencil_ref=*/static_cast(stencilID), /*.pad=*/0, 0, 0}); diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 94d11b670..2c0ba3f72 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -160,6 +160,13 @@ if(MLN_WITH_VULKAN) ) endif() +if(MLN_WITH_METAL) + target_compile_definitions( + mbgl-test + PRIVATE MLN_RENDER_BACKEND_METAL=1 + ) +endif() + if(WIN32 OR CMAKE_SYSTEM_NAME STREQUAL Android) message("Target platform does not support HTTP tests or dependencies not found.") diff --git a/vendor/metal-cpp.cmake b/vendor/metal-cpp.cmake new file mode 100644 index 000000000..a5a415afa --- /dev/null +++ b/vendor/metal-cpp.cmake @@ -0,0 +1,21 @@ +if(TARGET mbgl-vendor-metal-cpp) + return() +endif() + +add_library( + mbgl-vendor-metal-cpp INTERFACE +) + +target_include_directories( + mbgl-vendor-metal-cpp SYSTEM + INTERFACE ${CMAKE_CURRENT_LIST_DIR}/metal-cpp +) + +set_target_properties( + mbgl-vendor-metal-cpp + PROPERTIES + INTERFACE_MAPBOX_NAME "metal-cpp" + INTERFACE_MAPBOX_URL "https://developer.apple.com/metal/cpp/" + INTERFACE_MAPBOX_AUTHOR "Apple" + INTERFACE_MAPBOX_LICENSE ${CMAKE_CURRENT_LIST_DIR}/metal-cpp/LICENSE.txt +)