diff --git a/.github/workflows/ios.yml b/.github/workflows/ios.yml index 6c0e2eeea0e7..bb84386cc839 100644 --- a/.github/workflows/ios.yml +++ b/.github/workflows/ios.yml @@ -56,7 +56,6 @@ jobs: -DLIBOMP_OMPT_SUPPORT=OFF \ -DLIBOMP_USE_HWLOC=OFF \ - MOLTENVK_VERSION: 'v1.2.8' NCNN_CMAKE_OPTIONS: | -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake \ -DDEPLOYMENT_TARGET=$IOS_DEPLOYMENT_TARGET \ @@ -144,26 +143,18 @@ jobs: sudo cp $GITHUB_WORKSPACE/openmp-install/ios-simulator/include/* $DEVELOPER_DIR/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include sudo cp $GITHUB_WORKSPACE/openmp-install/ios-simulator/lib/libomp.a $DEVELOPER_DIR/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/lib - - name: moltenvk - run: | - wget -q https://github.com/KhronosGroup/MoltenVK/releases/download/${{ env.MOLTENVK_VERSION }}/MoltenVK-all.tar - tar -xf MoltenVK-all.tar - - name: arm64 run: | mkdir build-arm64 && cd build-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=OS64 -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/ios-arm64/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=OS64 -DARCHS="arm64" .. cmake --build . -j 4 - name: simulator-x86_64 run: | mkdir build-simulator-x86_64 && cd build-simulator-x86_64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATOR64 -DARCHS="x86_64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/ios-arm64_x86_64-simulator/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATOR64 -DARCHS="x86_64" .. cmake --build . -j 4 - name: simulator-arm64 run: | mkdir build-simulator-arm64 && cd build-simulator-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATORARM64 -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/ios-arm64_x86_64-simulator/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATORARM64 -DARCHS="arm64" .. cmake --build . -j 4 diff --git a/.github/workflows/mac-catalyst.yml b/.github/workflows/mac-catalyst.yml index cc7ed4ef32aa..9cd820a9868c 100644 --- a/.github/workflows/mac-catalyst.yml +++ b/.github/workflows/mac-catalyst.yml @@ -56,7 +56,6 @@ jobs: -DLIBOMP_OMPT_SUPPORT=OFF \ -DLIBOMP_USE_HWLOC=OFF \ - MOLTENVK_VERSION: 'v1.2.8' NCNN_CMAKE_OPTIONS: | -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake \ -DDEPLOYMENT_TARGET=$MAC_CATALYST_DEPLOYMENT_TARGET \ @@ -128,20 +127,13 @@ jobs: sudo cp $GITHUB_WORKSPACE/openmp-install/mac-catalyst/include/* $DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include sudo cp $GITHUB_WORKSPACE/openmp-install/mac-catalyst/lib/libomp.a $DEVELOPER_DIR/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/lib - - name: moltenvk - run: | - wget -q https://github.com/KhronosGroup/MoltenVK/releases/download/${{ env.MOLTENVK_VERSION }}/MoltenVK-all.tar - tar -xf MoltenVK-all.tar - - name: x86_64 run: | mkdir build-x86_64 && cd build-x86_64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_CATALYST -DARCHS="x86_64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/ios-arm64_x86_64-maccatalyst/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_CATALYST -DARCHS="x86_64" .. cmake --build . -j 4 - name: arm64 run: | mkdir build-arm64 && cd build-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_CATALYST_ARM64 -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/ios-arm64_x86_64-maccatalyst/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_CATALYST_ARM64 -DARCHS="arm64" .. cmake --build . -j 4 diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index be67c7fadfa5..d209ec166403 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -64,7 +64,6 @@ jobs: -DLIBOMP_OMPT_SUPPORT=OFF \ -DLIBOMP_USE_HWLOC=OFF \ - MOLTENVK_VERSION: 'v1.2.8' NCNN_CMAKE_OPTIONS: | -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake \ -DDEPLOYMENT_TARGET=$MAC_DEPLOYMENT_TARGET \ @@ -158,43 +157,34 @@ jobs: cd swiftshader mkdir -p build; cd build cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_INSTALL_PREFIX=install -DSWIFTSHADER_BUILD_EGL=FALSE -DSWIFTSHADER_BUILD_GLESv2=FALSE -DSWIFTSHADER_BUILD_GLES_CM=FALSE -DSWIFTSHADER_BUILD_VULKAN=TRUE -DSWIFTSHADER_BUILD_PVR=FALSE -DSWIFTSHADER_BUILD_TESTS=FALSE -DSWIFTSHADER_ENABLE_ASTC=FALSE -DSWIFTSHADER_WARNINGS_AS_ERRORS=FALSE -DREACTOR_BACKEND=Subzero -DREACTOR_DEFAULT_OPT_LEVEL=Default -DCMAKE_BUILD_TYPE=Release .. - cmake --build . -j 3 + cmake --build . -j 4 mkdir $GITHUB_WORKSPACE/swiftshader-install cp Darwin/* $GITHUB_WORKSPACE/swiftshader-install - - name: moltenvk - run: | - wget -q https://github.com/KhronosGroup/MoltenVK/releases/download/${{ env.MOLTENVK_VERSION }}/MoltenVK-all.tar - tar -xf MoltenVK-all.tar - - name: arm64 run: | mkdir build-arm64 && cd build-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_ARM64 -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/macos-arm64_x86_64/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_ARM64 -DARCHS="arm64" .. cmake --build . -j 4 - name: x86_64 run: | mkdir build-x86_64 && cd build-x86_64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC -DARCHS="x86_64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/swiftshader-install/libvulkan.dylib \ - -DNCNN_BUILD_TESTS=ON .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC -DARCHS="x86_64" -DNCNN_BUILD_TESTS=ON .. cmake --build . -j 4 - name: arm64-shared run: | mkdir build-arm64-shared && cd build-arm64-shared - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_ARM64 -DARCHS="arm64" -DNCNN_SHARED_LIB=ON \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/dynamic/MoltenVK.xcframework/macos-arm64_x86_64/MoltenVK.framework/MoltenVK .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC_ARM64 -DARCHS="arm64" -DNCNN_SHARED_LIB=ON .. cmake --build . -j 4 - name: x86_64-shared run: | mkdir build-x86_64-shared && cd build-x86_64-shared - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC -DARCHS="x86_64" -DNCNN_SHARED_LIB=ON \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/dynamic/MoltenVK.xcframework/macos-arm64_x86_64/MoltenVK.framework/MoltenVK .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=MAC -DARCHS="x86_64" -DNCNN_SHARED_LIB=ON .. cmake --build . -j 4 - name: x86_64-test run: | printf "[Processor]\nThreadCount=1\n" > build-x86_64/tests/SwiftShader.ini + export VK_ICD_FILENAMES="$GITHUB_WORKSPACE/swiftshader-install/vk_swiftshader_icd.json" cd build-x86_64 && ctest --output-on-failure -j 4 diff --git a/.github/workflows/release-python.yml b/.github/workflows/release-python.yml index 5eb705e38309..e19eacd65b0c 100644 --- a/.github/workflows/release-python.yml +++ b/.github/workflows/release-python.yml @@ -220,9 +220,9 @@ jobs: - name: vulkansdk for macos if: matrix.os == 'macos-15-intel' run: | - wget https://sdk.lunarg.com/sdk/download/1.3.290.0/mac/vulkansdk-macos-1.3.290.0.dmg?Human=true -O vulkansdk-macos-1.3.290.0.dmg - hdiutil attach vulkansdk-macos-1.3.290.0.dmg - sudo /Volumes/vulkansdk-macos-1.3.290.0/InstallVulkan.app/Contents/MacOS/InstallVulkan --root $GITHUB_WORKSPACE/vulkansdk-macos-1.3.290.0 --accept-licenses --default-answer --confirm-command install + wget https://sdk.lunarg.com/sdk/download/1.4.335.1/mac/vulkansdk-macos-1.4.335.1.zip?Human=true -O vulkansdk-macos-1.4.335.1.zip + unzip vulkansdk-macos-1.4.335.1.zip + sudo vulkansdk-macOS-1.4.335.1.app/Contents/MacOS/vulkansdk-macOS-1.4.335.1 --root $GITHUB_WORKSPACE/vulkansdk-macos-1.4.335.1 --accept-licenses --default-answer --confirm-command install - name: Build wheels for macos x86_64 if: matrix.os == 'macos-15-intel' && matrix.arch == 'x86_64' @@ -238,7 +238,7 @@ jobs: OpenMP_C_FLAGS="-Xclang -fopenmp" OpenMP_CXX_FLAGS="-Xclang -fopenmp" OpenMP_C_LIB_NAMES="libomp" OpenMP_CXX_LIB_NAMES="libomp" OpenMP_libomp_LIBRARY="libomp.a" - Vulkan_LIBRARY=$GITHUB_WORKSPACE/vulkansdk-macos-1.3.290.0/macOS/lib/libMoltenVK.dylib + Vulkan_LIBRARY=$GITHUB_WORKSPACE/vulkansdk-macos-1.4.335.1/macOS/lib/libMoltenVK.dylib MACOSX_DEPLOYMENT_TARGET=$MAC_DEPLOYMENT_TARGET with: output-dir: wheelhouse @@ -257,7 +257,7 @@ jobs: OpenMP_C_FLAGS="-Xclang -fopenmp" OpenMP_CXX_FLAGS="-Xclang -fopenmp" OpenMP_C_LIB_NAMES="libomp" OpenMP_CXX_LIB_NAMES="libomp" OpenMP_libomp_LIBRARY="libomp.a" - Vulkan_LIBRARY=$GITHUB_WORKSPACE/vulkansdk-macos-1.3.290.0/macOS/lib/libMoltenVK.dylib + Vulkan_LIBRARY=$GITHUB_WORKSPACE/vulkansdk-macos-1.4.335.1/macOS/lib/libMoltenVK.dylib MACOSX_DEPLOYMENT_TARGET=$MAC_DEPLOYMENT_TARGET with: output-dir: wheelhouse diff --git a/.github/workflows/tvos.yml b/.github/workflows/tvos.yml index c2a94bb7ee49..5d22cb3cc73e 100644 --- a/.github/workflows/tvos.yml +++ b/.github/workflows/tvos.yml @@ -56,7 +56,6 @@ jobs: -DLIBOMP_OMPT_SUPPORT=OFF \ -DLIBOMP_USE_HWLOC=OFF \ - MOLTENVK_VERSION: 'v1.2.8' NCNN_CMAKE_OPTIONS: | -DCMAKE_TOOLCHAIN_FILE=../toolchains/ios.toolchain.cmake \ -DDEPLOYMENT_TARGET=$TVOS_DEPLOYMENT_TARGET \ @@ -155,32 +154,23 @@ jobs: sudo cp $GITHUB_WORKSPACE/openmp-install/tvos-simulator/include/* $DEVELOPER_DIR/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/include sudo cp $GITHUB_WORKSPACE/openmp-install/tvos-simulator/lib/libomp.a $DEVELOPER_DIR/Platforms/AppleTVSimulator.platform/Developer/SDKs/AppleTVSimulator.sdk/usr/lib - - name: moltenvk - run: | - wget -q https://github.com/KhronosGroup/MoltenVK/releases/download/${{ env.MOLTENVK_VERSION }}/MoltenVK-all.tar - tar -xf MoltenVK-all.tar - - name: arm64 run: | mkdir build-arm64 && cd build-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=TVOS -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/tvos-arm64_arm64e/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=TVOS -DARCHS="arm64" .. cmake --build . -j 4 - name: arm64e run: | mkdir build-arm64e && cd build-arm64e - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=TVOS -DARCHS="arm64e" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/tvos-arm64_arm64e/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=TVOS -DARCHS="arm64e" .. cmake --build . -j 4 - name: simulator-x86_64 run: | mkdir build-simulator-x86_64 && cd build-simulator-x86_64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATOR_TVOS -DARCHS="x86_64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/tvos-arm64_x86_64-simulator/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATOR_TVOS -DARCHS="x86_64" .. cmake --build . -j 4 - name: simulator-arm64 run: | mkdir build-simulator-arm64 && cd build-simulator-arm64 - cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATORARM64_TVOS -DARCHS="arm64" \ - -DVulkan_LIBRARY=$GITHUB_WORKSPACE/MoltenVK/MoltenVK/static/MoltenVK.xcframework/tvos-arm64_x86_64-simulator/libMoltenVK.a .. + cmake ${{ env.NCNN_CMAKE_OPTIONS }} -DPLATFORM=SIMULATORARM64_TVOS -DARCHS="arm64" .. cmake --build . -j 4 diff --git a/.github/workflows/visionos.yml b/.github/workflows/visionos.yml index b84f58358389..843a1fe0eaa4 100644 --- a/.github/workflows/visionos.yml +++ b/.github/workflows/visionos.yml @@ -63,9 +63,12 @@ jobs: -DOpenMP_C_FLAGS="-Xclang -fopenmp" -DOpenMP_CXX_FLAGS="-Xclang -fopenmp" \ -DOpenMP_C_LIB_NAMES="libomp" -DOpenMP_CXX_LIB_NAMES="libomp" \ -DOpenMP_libomp_LIBRARY="libomp.a" \ + -DNCNN_VULKAN=ON \ steps: - uses: actions/checkout@v6 + with: + submodules: true - name: cache-openmp id: cache-openmp diff --git a/docs/developer-guide/vulkan-driver-loader.md b/docs/developer-guide/vulkan-driver-loader.md index bd0085b4e7a5..5f51736774a4 100644 --- a/docs/developer-guide/vulkan-driver-loader.md +++ b/docs/developer-guide/vulkan-driver-loader.md @@ -68,7 +68,9 @@ vulkan-1.dll libvulkan.so #### macOS iOS and other APPLE platforms -Requires static meltvk driver linking and should always succeed +libvulkan.dylib + +If static moltenvk driver linked, should always succeed If failed, it will try to find graphics driver object and load it @@ -101,6 +103,11 @@ for 32bit applications - /vendor/lib/hw/vulkan.adreno.so - /vendor/lib/egl/libGLES_mali.so +#### macOS iOS and other APPLE platforms +`dlopen()` search for +- libMoltenVK.dylib +- libvulkan_kosmickrisp.dylib + ## Load from driver_path for advanced developer diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0f62652f3730..d833e6c55289 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -273,14 +273,43 @@ endif() if(NCNN_VULKAN) if(NCNN_SIMPLEVK) if(APPLE) - # simplevk always use static vulkan linkage on apple platform - if(NOT DEFINED Vulkan_LIBRARY) - message(WARNING "Vulkan_LIBRARY shall be defined for simplevk static linkage on APPLE platforms") + # simplevk use static vulkan linkage on apple platform as fallback + if(DEFINED Vulkan_LIBRARY) + message(STATUS "simplevk static vulkan linkage as fallback enabled on APPLE platforms") + target_link_libraries(ncnn PUBLIC ${Vulkan_LIBRARY}) + + # https://github.com/KhronosGroup/MoltenVK/blob/main/Docs/MoltenVK_Runtime_UserGuide.md#optionally-link-to-required-system-libraries + if(NOT NCNN_SHARED_LIB) + find_library(Metal NAMES Metal) + find_library(Foundation NAMES Foundation) + find_library(QuartzCore NAMES QuartzCore) + find_library(CoreGraphics NAMES CoreGraphics) + find_library(IOSurface NAMES IOSurface) + list(APPEND vulkan_dependent_LINK_LIBRARIES ${Metal} ${Foundation} ${QuartzCore} ${CoreGraphics} ${IOSurface}) + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + if(NOT IOS) + find_library(AppKit NAMES AppKit) + list(APPEND vulkan_dependent_LINK_LIBRARIES ${AppKit}) + endif() + find_library(IOKit NAMES IOKit) + list(APPEND vulkan_dependent_LINK_LIBRARIES ${IOKit}) + endif() + if(IOS OR CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS") + find_library(UIKit NAMES UIKit) + list(APPEND vulkan_dependent_LINK_LIBRARIES ${UIKit}) + endif() + target_link_libraries(ncnn PRIVATE ${vulkan_dependent_LINK_LIBRARIES}) + endif() + + else() + message(WARNING "Vulkan_LIBRARY shall be defined for simplevk static linkage as fallback on APPLE platforms") + + # link simplevk stub + set(SIMPLEVK_TBD "${CMAKE_CURRENT_SOURCE_DIR}/simplevk.tbd") + target_link_libraries(ncnn PRIVATE "-Wl,-weak_library,${SIMPLEVK_TBD}") endif() - target_link_libraries(ncnn PUBLIC ${Vulkan_LIBRARY}) - else() - target_link_libraries(ncnn PRIVATE ${CMAKE_DL_LIBS}) endif() + target_link_libraries(ncnn PRIVATE ${CMAKE_DL_LIBS}) else() find_package(Vulkan QUIET) if(NOT Vulkan_FOUND) @@ -306,30 +335,6 @@ if(NCNN_VULKAN) target_link_libraries(ncnn PUBLIC Vulkan::Vulkan) endif() - # Support mac platform static library compilation - # https://github.com/KhronosGroup/MoltenVK/blob/main/Docs/MoltenVK_Runtime_UserGuide.md#optionally-link-to-required-system-libraries - if(NOT NCNN_SHARED_LIB AND APPLE) - find_library(Metal NAMES Metal) - find_library(Foundation NAMES Foundation) - find_library(QuartzCore NAMES QuartzCore) - find_library(CoreGraphics NAMES CoreGraphics) - find_library(IOSurface NAMES IOSurface) - list(APPEND vulkan_dependent_LINK_LIBRARIES ${Metal} ${Foundation} ${QuartzCore} ${CoreGraphics} ${IOSurface}) - if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") - if(NOT IOS) - find_library(AppKit NAMES AppKit) - list(APPEND vulkan_dependent_LINK_LIBRARIES ${AppKit}) - endif() - find_library(IOKit NAMES IOKit) - list(APPEND vulkan_dependent_LINK_LIBRARIES ${IOKit}) - endif() - if(IOS OR CMAKE_SYSTEM_NAME STREQUAL "iOS" OR CMAKE_SYSTEM_NAME STREQUAL "tvOS") - find_library(UIKit NAMES UIKit) - list(APPEND vulkan_dependent_LINK_LIBRARIES ${UIKit}) - endif() - target_link_libraries(ncnn PRIVATE ${vulkan_dependent_LINK_LIBRARIES}) - endif() - # link in-house glslang target_include_directories(ncnn PRIVATE $) target_link_libraries(ncnn PRIVATE glslang SPIRV) diff --git a/src/simplevk.cpp b/src/simplevk.cpp index b1155b8ba835..70a01829be8b 100644 --- a/src/simplevk.cpp +++ b/src/simplevk.cpp @@ -27,10 +27,8 @@ #endif #if __APPLE__ - -// always use static vulkan linkage on apple platform -extern "C" VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* pName); - +// static vulkan linkage on apple platform as fallback +extern "C" VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL vkGetInstanceProcAddr(VkInstance instance, const char* pName) __attribute__((weak_import)); #endif namespace ncnn { @@ -43,28 +41,78 @@ PFN_vkEnumerateInstanceExtensionProperties vkEnumerateInstanceExtensionPropertie PFN_vkCreateInstance vkCreateInstance = 0; PFN_vkEnumerateInstanceLayerProperties vkEnumerateInstanceLayerProperties = 0; -#if __APPLE__ - -int load_vulkan_driver(const char* /*driver_path*/) +static std::string get_driver_path_from_icd(const char* icd_path) { - unload_vulkan_driver(); + FILE* fp = fopen(icd_path, "rb"); + if (!fp) + return std::string(); - vkGetInstanceProcAddr = ::vkGetInstanceProcAddr; - vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); - vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(NULL, "vkCreateInstance"); - vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceLayerProperties"); - return 0; + std::string driver_path; + + char line[256]; + while (!feof(fp)) + { + char* s = fgets(line, 256, fp); + if (!s) + break; + + // "library_path": "path to driver library", + char path[256]; + int nscan = sscanf(line, " \"library_path\" : \"%255[^\"]\"", path); + if (nscan == 1) + { + if (path[0] == '.' || (path[0] != '/' && !strchr(path, ':') && (strchr(path, '/') || strchr(path, '\\')))) + { + // relative to the icd file path + std::string icd_dir = icd_path; + size_t dirpos = icd_dir.find_last_of("/\\"); + if (dirpos != std::string::npos) + { + icd_dir = icd_dir.substr(0, dirpos + 1); + } + else + { + icd_dir = "./"; + } + + driver_path = icd_dir + path; + } + else + { + // filename or absolute path + driver_path = path; + } + + break; + } + } + + fclose(fp); + + return driver_path; } -void unload_vulkan_driver() +static std::string get_driver_path_from_icd_env() { - vkGetInstanceProcAddr = 0; - vkEnumerateInstanceExtensionProperties = 0; - vkCreateInstance = 0; - vkEnumerateInstanceLayerProperties = 0; + const char* icd_path = getenv("VK_ICD_FILENAMES"); + if (!icd_path) + { + icd_path = getenv("VK_DRIVER_FILES"); + if (!icd_path) + return std::string(); + } + + return get_driver_path_from_icd(icd_path); } -#else // __APPLE__ +static std::string get_driver_path_from_ncnn_env() +{ + const char* driver_path = getenv("NCNN_VULKAN_DRIVER"); + if (!driver_path) + return std::string(); + + return std::string(driver_path); +} #if defined _WIN32 static HMODULE g_libvulkan = 0; @@ -134,75 +182,6 @@ static hwvulkan_device_t* g_hvkdi = 0; #endif #endif -static std::string get_driver_path_from_icd(const char* icd_path) -{ - FILE* fp = fopen(icd_path, "rb"); - if (!fp) - return std::string(); - - std::string driver_path; - - char line[256]; - while (!feof(fp)) - { - char* s = fgets(line, 256, fp); - if (!s) - break; - - // "library_path": "path to driver library", - char path[256]; - int nscan = sscanf(line, " \"library_path\" : \"%255[^\"]\"", path); - if (nscan == 1) - { - if (path[0] == '.' || (path[0] != '/' && !strchr(path, ':') && (strchr(path, '/') || strchr(path, '\\')))) - { - // relative to the icd file path - std::string icd_dir = icd_path; - size_t dirpos = icd_dir.find_last_of("/\\"); - if (dirpos != std::string::npos) - { - icd_dir = icd_dir.substr(0, dirpos + 1); - } - else - { - icd_dir = "./"; - } - - driver_path = icd_dir + path; - } - else - { - // filename or absolute path - driver_path = path; - } - - break; - } - } - - fclose(fp); - - return driver_path; -} - -static std::string get_driver_path_from_icd_env() -{ - const char* icd_path = getenv("VK_ICD_FILENAMES"); - if (!icd_path) - return std::string(); - - return get_driver_path_from_icd(icd_path); -} - -static std::string get_driver_path_from_ncnn_env() -{ - const char* driver_path = getenv("NCNN_VULKAN_DRIVER"); - if (!driver_path) - return std::string(); - - return std::string(driver_path); -} - #if defined _WIN32 static std::string search_file(const std::string& dirpath, const std::string& needle) { @@ -305,12 +284,14 @@ static int load_vulkan_linux(const char* driver_path) #endif void* libvulkan = dlopen(libpath, RTLD_LOCAL | RTLD_NOW); -#if !__APPLE__ if (!libvulkan) { +#if __APPLE__ + libvulkan = dlopen("libvulkan.1.dylib", RTLD_LOCAL | RTLD_NOW); +#else libvulkan = dlopen("libvulkan.so.1", RTLD_LOCAL | RTLD_NOW); - } #endif + } if (!libvulkan) { NCNN_LOGE("dlopen failed %s", dlerror()); @@ -356,6 +337,23 @@ static int load_vulkan_linux(const char* driver_path) return 0; } +#if __APPLE__ +static int load_vulkan_apple_moltenvk() +{ + if (::vkGetInstanceProcAddr == NULL) + { + NCNN_LOGE("no static linked moltenvk"); + return -1; + } + + vkGetInstanceProcAddr = ::vkGetInstanceProcAddr; + vkEnumerateInstanceExtensionProperties = (PFN_vkEnumerateInstanceExtensionProperties)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceExtensionProperties"); + vkCreateInstance = (PFN_vkCreateInstance)vkGetInstanceProcAddr(NULL, "vkCreateInstance"); + vkEnumerateInstanceLayerProperties = (PFN_vkEnumerateInstanceLayerProperties)vkGetInstanceProcAddr(NULL, "vkEnumerateInstanceLayerProperties"); + return 0; +} +#endif // __APPLE__ + #if defined __ANDROID__ static int load_vulkan_android(const char* driver_path) { @@ -539,6 +537,11 @@ int load_vulkan_driver(const char* driver_path) "/vendor/lib/egl/libGLES_mali.so" #endif }; +#elif __APPLE__ + const char* well_known_path[] = { + "libMoltenVK.dylib", + "libvulkan_kosmickrisp.dylib" + }; #else const char* well_known_path[] = { "libGLX_nvidia.so.0", @@ -569,6 +572,13 @@ int load_vulkan_driver(const char* driver_path) break; } } +#if __APPLE__ + if (ret != 0) + { + // sixth try, load from static linked moltenvk + ret = load_vulkan_apple_moltenvk(); + } +#endif // __APPLE__ return ret; } @@ -606,8 +616,6 @@ void unload_vulkan_driver() #endif // _WIN32 } -#endif // __APPLE__ - } // namespace ncnn #endif // NCNN_SIMPLEVK diff --git a/src/simplevk.tbd b/src/simplevk.tbd new file mode 100644 index 000000000000..6ef26d02c9e2 --- /dev/null +++ b/src/simplevk.tbd @@ -0,0 +1,16 @@ +--- !tapi-tbd +tbd-version: 4 +targets: [ x86_64-macos, arm64-macos, arm64e-macos, + arm64-ios, arm64e-ios, x86_64-ios-simulator, arm64-ios-simulator, + x86_64-maccatalyst, arm64-maccatalyst, arm64e-maccatalyst, + arm64-tvos, arm64e-tvos, x86_64-tvos-simulator, arm64-tvos-simulator, + arm64-xros, x86_64-xros-simulator, arm64-xros-simulator ] +install-name: '@rpath/libvulkan.dylib' +exports: + - targets: [ x86_64-macos, arm64-macos, arm64e-macos, + arm64-ios, arm64e-ios, x86_64-ios-simulator, arm64-ios-simulator, + x86_64-maccatalyst, arm64-maccatalyst, arm64e-maccatalyst, + arm64-tvos, arm64e-tvos, x86_64-tvos-simulator, arm64-tvos-simulator, + arm64-xros, x86_64-xros-simulator, arm64-xros-simulator ] + symbols: [ _vkGetInstanceProcAddr ] +...