Cocoa: Add support for MoltenVK dynamic library

Tested with MoltenVK 0.18.0.

Related to #870.
This commit is contained in:
Camilla Löwy 2017-07-10 17:07:59 +02:00
parent d55c57b504
commit 8e899ccc29
6 changed files with 27 additions and 35 deletions

View File

@ -28,12 +28,12 @@ if (WIN32)
"$ENV{VK_SDK_PATH}/Bin32") "$ENV{VK_SDK_PATH}/Bin32")
endif() endif()
elseif (APPLE) elseif (APPLE)
set(CMAKE_FIND_FRAMEWORK NEVER)
find_library(VULKAN_LIBRARY MoltenVK) find_library(VULKAN_LIBRARY MoltenVK)
if (VULKAN_LIBRARY) set(CMAKE_FIND_FRAMEWORK ONLY)
set(VULKAN_STATIC_LIBRARY ${VULKAN_LIBRARY}) find_library(VULKAN_STATIC_LIBRARY MoltenVK)
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
"${VULKAN_LIBRARY}/Headers") "${VULKAN_LIBRARY}/Headers")
endif()
else() else()
find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS find_path(VULKAN_INCLUDE_DIR NAMES vulkan/vulkan.h HINTS
"$ENV{VULKAN_SDK}/include") "$ENV{VULKAN_SDK}/include")

View File

@ -108,8 +108,9 @@ located in the `deps/` directory.
- [Vulkan headers](https://www.khronos.org/registry/vulkan/) for Vulkan tests - [Vulkan headers](https://www.khronos.org/registry/vulkan/) for Vulkan tests
The Vulkan example additionally requires the Vulkan SDK to be installed, or it The Vulkan example additionally requires the Vulkan SDK to be installed, or it
will not be included in the build. On macOS you need to set the path to the will not be included in the build. On macOS you need to
MoltenVK SDK manually as it has no standard location. [provide the path](@ref vulkan_loader) to the MoltenVK SDK manually as it has no
standard installation location.
The documentation is generated with [Doxygen](http://doxygen.org/). If CMake The documentation is generated with [Doxygen](http://doxygen.org/). If CMake
does not find Doxygen, the documentation will not be generated when you build. does not find Doxygen, the documentation will not be generated when you build.

View File

@ -20,6 +20,11 @@ The GLFW library does not need the Vulkan SDK to enable support for Vulkan.
However, any Vulkan-specific test and example programs are built only if the However, any Vulkan-specific test and example programs are built only if the
CMake files find a Vulkan SDK. CMake files find a Vulkan SDK.
@macos Because MoltenVK is typically not installed system-wide, you will need to
point CMake to it using the `CMAKE_FRAMEWORK_PATH` variable when configuring the
GLFW source tree. Set this variable to the `MoltenVK/macOS` subdirectory of the
SDK, either on the command-line or in the CMake GUI.
For details on a specific function in this category, see the @ref vulkan. There For details on a specific function in this category, see the @ref vulkan. There
are also guides for the other areas of the GLFW API. are also guides for the other areas of the GLFW API.
@ -34,19 +39,18 @@ are also guides for the other areas of the GLFW API.
By default, GLFW will look for the Vulkan loader on demand at runtime via its By default, GLFW will look for the Vulkan loader on demand at runtime via its
standard name (`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other standard name (`vulkan-1.dll` on Windows, `libvulkan.so.1` on Linux and other
Unix-like systems). This means that GLFW does not need to be linked against the Unix-like systems and `libMoltenVK.dylib` on macOS). This means that GLFW does
loader. However, it also means that if you are using the static library form of not need to be linked against the loader. However, it also means that if you
the Vulkan loader GLFW will either fail to find it or (worse) use the wrong one. are using the static library form of the Vulkan loader GLFW will either fail to
find it or (worse) use the wrong one.
The @ref GLFW_VULKAN_STATIC CMake option makes GLFW link directly against the The @ref GLFW_VULKAN_STATIC CMake option makes GLFW link directly against the
static form. Not linking against the Vulkan loader will then be a compile-time static library form. Not linking against the Vulkan loader will then be
error. a compile-time error.
@macos MoltenVK only provides the static library form of the Vulkan loader, but @macos When using the static library form of MoltenVK (i.e. `MetalVK.framework`
GLFW is able to find it without @ref GLFW_VULKAN_STATIC as long as it is linked and not `libMoltenVK.dylib`) you must also link against its dependencies: the
into any of the binaries already loaded into the process. As it is a static `Cocoa`, `Metal` and `QuartzCore` system frameworks and the `libc++` library.
library, you must also link against its dependencies: the `Cocoa`, `Metal` and
`QuartzCore` frameworks and the `libc++` library.
@section vulkan_include Including the Vulkan and GLFW header files @section vulkan_include Including the Vulkan and GLFW header files

View File

@ -211,13 +211,7 @@ extern "C" {
#endif /* OpenGL and OpenGL ES headers */ #endif /* OpenGL and OpenGL ES headers */
#if defined(GLFW_INCLUDE_VULKAN) #if defined(GLFW_INCLUDE_VULKAN)
#if defined(__APPLE__)
#include <MoltenVK/vulkan/vulkan.h>
#else
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#endif
#endif /* Vulkan header */ #endif /* Vulkan header */
#if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL) #if defined(GLFW_DLL) && defined(_GLFW_BUILD_DLL)

View File

@ -52,8 +52,7 @@ GLFWbool _glfwInitVulkan(int mode)
#if defined(_GLFW_WIN32) #if defined(_GLFW_WIN32)
_glfw.vk.handle = _glfw_dlopen("vulkan-1.dll"); _glfw.vk.handle = _glfw_dlopen("vulkan-1.dll");
#elif defined(_GLFW_COCOA) #elif defined(_GLFW_COCOA)
// NULL maps to RTLD_DEFAULT, which searches all loaded binaries _glfw.vk.handle = _glfw_dlopen("libMoltenVK.dylib");
_glfw.vk.handle = _glfw_dlopen(NULL);
#else #else
_glfw.vk.handle = _glfw_dlopen("libvulkan.so.1"); _glfw.vk.handle = _glfw_dlopen("libvulkan.so.1");
#endif #endif
@ -69,16 +68,8 @@ GLFWbool _glfwInitVulkan(int mode)
_glfw_dlsym(_glfw.vk.handle, "vkGetInstanceProcAddr"); _glfw_dlsym(_glfw.vk.handle, "vkGetInstanceProcAddr");
if (!_glfw.vk.GetInstanceProcAddr) if (!_glfw.vk.GetInstanceProcAddr)
{ {
#if defined(_GLFW_COCOA)
if (mode == _GLFW_REQUIRE_LOADER)
{
_glfwInputError(GLFW_API_UNAVAILABLE,
"Vulkan: vkGetInstanceProcAddr not found in process");
}
#else
_glfwInputError(GLFW_API_UNAVAILABLE, _glfwInputError(GLFW_API_UNAVAILABLE,
"Vulkan: Loader does not export vkGetInstanceProcAddr"); "Vulkan: Loader does not export vkGetInstanceProcAddr");
#endif
_glfwTerminateVulkan(); _glfwTerminateVulkan();
return GLFW_FALSE; return GLFW_FALSE;

View File

@ -53,8 +53,10 @@ set(CONSOLE_BINARIES clipboard events msaa glfwinfo iconify monitors reopen
if (VULKAN_FOUND) if (VULKAN_FOUND)
add_executable(vulkan WIN32 vulkan.c ${ICON}) add_executable(vulkan WIN32 vulkan.c ${ICON})
target_include_directories(vulkan PRIVATE "${VULKAN_INCLUDE_DIR}") target_include_directories(vulkan PRIVATE "${VULKAN_INCLUDE_DIR}")
if (NOT GLFW_VULKAN_STATIC) if (GLFW_VULKAN_STATIC)
target_link_libraries(vulkan "${VULKAN_LIBRARY}" ${GLFW_VULKAN_DEPS}) target_link_libraries(vulkan "${VULKAN_STATIC_LIBRARY}" ${GLFW_VULKAN_DEPS})
else()
target_link_libraries(vulkan "${VULKAN_LIBRARY}")
endif() endif()
list(APPEND WINDOWS_BINARIES vulkan) list(APPEND WINDOWS_BINARIES vulkan)
endif() endif()