From 8efc30a7ccead96713b44d7644481bf7ef93bc9c Mon Sep 17 00:00:00 2001 From: Bart Louwers Date: Fri, 4 Oct 2024 11:37:04 +0200 Subject: [PATCH] Enable using MoltenVK on macOS (#2846) Co-authored-by: Adrian Cojocaru --- include/mbgl/vulkan/renderer_backend.hpp | 3 ++- platform/glfw/glfw_view.cpp | 2 +- platform/macos/macos.cmake | 22 +++++++++++++++++++++- src/mbgl/vulkan/renderer_backend.cpp | 24 ++++++++++++++++++++---- 4 files changed, 44 insertions(+), 7 deletions(-) diff --git a/include/mbgl/vulkan/renderer_backend.hpp b/include/mbgl/vulkan/renderer_backend.hpp index f17d5c864..7cf05a272 100644 --- a/include/mbgl/vulkan/renderer_backend.hpp +++ b/include/mbgl/vulkan/renderer_backend.hpp @@ -3,13 +3,14 @@ #include #include +#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 + #ifdef _WIN32 #define VK_USE_PLATFORM_WIN32_KHR #elif defined(__ANDROID__) #define VK_USE_PLATFORM_ANDROID_KHR #endif -#define VULKAN_HPP_DISPATCH_LOADER_DYNAMIC 1 #include #define VMA_VULKAN_VERSION 1000000 diff --git a/platform/glfw/glfw_view.cpp b/platform/glfw/glfw_view.cpp index ecb571d2b..36a0e01fa 100644 --- a/platform/glfw/glfw_view.cpp +++ b/platform/glfw/glfw_view.cpp @@ -215,7 +215,7 @@ GLFWView::GLFWView(bool fullscreen_, bool capFrameRate = !benchmark; // disable VSync in benchmark mode backend = GLFWBackend::Create(window, capFrameRate); -#ifdef __APPLE__ +#if defined(__APPLE__) && !defined(MLN_RENDER_BACKEND_VULKAN) int fbW, fbH; glfwGetFramebufferSize(window, &fbW, &fbH); backend->setSize({static_cast(fbW), static_cast(fbH)}); diff --git a/platform/macos/macos.cmake b/platform/macos/macos.cmake index b47fc87cb..7d928d4f4 100644 --- a/platform/macos/macos.cmake +++ b/platform/macos/macos.cmake @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.19) -set(CMAKE_OSX_DEPLOYMENT_TARGET "10.15") +set(CMAKE_OSX_DEPLOYMENT_TARGET "14.3") # Override default CMake NATIVE_ARCH_ACTUAL # https://gitlab.kitware.com/cmake/cmake/-/issues/20893 @@ -40,6 +40,26 @@ if(MLN_WITH_METAL) ) endif() +if(MLN_WITH_VULKAN) + find_package(Vulkan REQUIRED) + + target_sources( + mbgl-core + PRIVATE + ${PROJECT_SOURCE_DIR}/platform/default/src/mbgl/vulkan/headless_backend.cpp + ) + + if(Vulkan_FOUND) + get_filename_component(Vulkan_LIBRARY_DIR ${Vulkan_LIBRARY} DIRECTORY) + set(CMAKE_INSTALL_RPATH ${Vulkan_LIBRARY_DIR}) + else() + set(CMAKE_INSTALL_RPATH "/usr/local/lib/") + message(STATUS "Vulkan SDK not found! Using default homebrew install path") + endif() + + set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) +endif() + target_sources( mbgl-core PRIVATE diff --git a/src/mbgl/vulkan/renderer_backend.cpp b/src/mbgl/vulkan/renderer_backend.cpp index 1dbed858d..0f0a04556 100644 --- a/src/mbgl/vulkan/renderer_backend.cpp +++ b/src/mbgl/vulkan/renderer_backend.cpp @@ -102,11 +102,21 @@ std::vector RendererBackend::getLayers() { } std::vector RendererBackend::getInstanceExtensions() { - return {}; + return { +#ifdef __APPLE__ + "VK_KHR_portability_enumeration" +#endif + }; } std::vector RendererBackend::getDeviceExtensions() { - return getDefaultRenderable().getResource().getDeviceExtensions(); + auto extensions = getDefaultRenderable().getResource().getDeviceExtensions(); + +#ifdef __APPLE__ + extensions.push_back("VK_KHR_portability_subset"); +#endif + + return extensions; } std::vector RendererBackend::getDebugExtensions() { @@ -323,8 +333,14 @@ void RendererBackend::initInstance() { // Vulkan 1.1 on Android is supported on 71% of devices (compared to 1.3 with 6%) as of April 23 2024 // https://vulkan.gpuinfo.org/ +#ifdef __APPLE__ + vk::InstanceCreateFlags instanceFlags = vk::InstanceCreateFlagBits::eEnumeratePortabilityKHR; +#else + vk::InstanceCreateFlags instanceFlags = {}; +#endif + vk::ApplicationInfo appInfo("maplibre-native", 1, "maplibre-native", 1, VK_API_VERSION_1_0); - vk::InstanceCreateInfo createInfo(vk::InstanceCreateFlags(), &appInfo); + vk::InstanceCreateInfo createInfo(instanceFlags, &appInfo); const auto& layers = getLayers(); @@ -501,7 +517,7 @@ void RendererBackend::initDevice() { // TODO // - WideLines disabled on Android (20.77% device coverage https://vulkan.gpuinfo.org/listfeaturescore10.php) // - Rework this to a dynamic toggle based on MLN_TRIANGULATE_FILL_OUTLINES/MLN_ENABLE_POLYLINE_DRAWABLES -#if !defined(__ANDROID__) && !defined(__apple__) +#if !defined(__ANDROID__) && !defined(__APPLE__) if (supportedDeviceFeatures.wideLines) { physicalDeviceFeatures.setWideLines(true);