Enable using MoltenVK on macOS (#2846)

Co-authored-by: Adrian Cojocaru <adrian.cojocaru92@yahoo.com>
This commit is contained in:
Bart Louwers
2024-10-04 11:37:04 +02:00
committed by GitHub
parent 56f6c5f5cf
commit 8efc30a7cc
4 changed files with 44 additions and 7 deletions

View File

@@ -3,13 +3,14 @@
#include <mbgl/gfx/renderer_backend.hpp>
#include <mbgl/gfx/context.hpp>
#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 <vulkan/vulkan.hpp>
#define VMA_VULKAN_VERSION 1000000

View File

@@ -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<uint32_t>(fbW), static_cast<uint32_t>(fbH)});

View File

@@ -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

View File

@@ -102,11 +102,21 @@ std::vector<const char*> RendererBackend::getLayers() {
}
std::vector<const char*> RendererBackend::getInstanceExtensions() {
return {};
return {
#ifdef __APPLE__
"VK_KHR_portability_enumeration"
#endif
};
}
std::vector<const char*> RendererBackend::getDeviceExtensions() {
return getDefaultRenderable().getResource<SurfaceRenderableResource>().getDeviceExtensions();
auto extensions = getDefaultRenderable().getResource<SurfaceRenderableResource>().getDeviceExtensions();
#ifdef __APPLE__
extensions.push_back("VK_KHR_portability_subset");
#endif
return extensions;
}
std::vector<const char*> 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);