diff options
| author | Charles Giessen <charles@lunarg.com> | 2023-11-10 13:37:01 -0700 |
|---|---|---|
| committer | Juan Ramos <114601453+juan-lunarg@users.noreply.github.com> | 2023-11-16 18:28:56 -0700 |
| commit | e363efd09388fc849ad11b20e9fc26676eadb97a (patch) | |
| tree | 99b00a9151d4e2b0a71dca7ca62d8db7d9d99342 | |
| parent | 1ccfee8ee9c3e2b1456578de4ee70a91b2d424c2 (diff) | |
| download | usermoji-e363efd09388fc849ad11b20e9fc26676eadb97a.tar.xz | |
vulkaninfo: Make Apple load vulkan & functions
Makes vulkaninfo behave the same on all platforms by having vulkaninfo load
the Vulkan-Loader and all functions pointers at runtime on Apple platforms.
| -rw-r--r-- | vulkaninfo/CMakeLists.txt | 15 | ||||
| -rw-r--r-- | vulkaninfo/vulkaninfo.h | 130 |
2 files changed, 61 insertions, 84 deletions
diff --git a/vulkaninfo/CMakeLists.txt b/vulkaninfo/CMakeLists.txt index e0dbab51..47db418c 100644 --- a/vulkaninfo/CMakeLists.txt +++ b/vulkaninfo/CMakeLists.txt @@ -53,7 +53,7 @@ target_include_directories(vulkaninfo PRIVATE . ) -target_compile_definitions(vulkaninfo PRIVATE VK_ENABLE_BETA_EXTENSIONS) +target_compile_definitions(vulkaninfo PRIVATE VK_ENABLE_BETA_EXTENSIONS VK_NO_PROTOTYPES) if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD") option(BUILD_WSI_XCB_SUPPORT "Build XCB WSI support" ON) @@ -65,32 +65,32 @@ if (CMAKE_SYSTEM_NAME MATCHES "Linux|BSD") if(BUILD_WSI_XCB_SUPPORT) pkg_check_modules(XCB REQUIRED QUIET IMPORTED_TARGET xcb) - target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_XCB_KHR VK_NO_PROTOTYPES) + target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_XCB_KHR) target_link_libraries(vulkaninfo PRIVATE PkgConfig::XCB) endif() if(BUILD_WSI_XLIB_SUPPORT) pkg_check_modules(X11 REQUIRED QUIET IMPORTED_TARGET x11) - target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_XLIB_KHR VK_NO_PROTOTYPES) + target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_XLIB_KHR) target_link_libraries(vulkaninfo PRIVATE PkgConfig::X11) endif() if(BUILD_WSI_WAYLAND_SUPPORT) pkg_check_modules(WAYLAND_CLIENT REQUIRED IMPORTED_TARGET wayland-client) - target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_WAYLAND_KHR VK_NO_PROTOTYPES) + target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_WAYLAND_KHR) target_link_libraries(vulkaninfo PRIVATE PkgConfig::WAYLAND_CLIENT) endif() if(BUILD_WSI_DIRECTFB_SUPPORT) pkg_check_modules(DirectFB REQUIRED QUIET IMPORTED_TARGET directfb) - target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_DIRECTFB_EXT VK_NO_PROTOTYPES) + target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_DIRECTFB_EXT) target_link_libraries(vulkaninfo PRIVATE PkgConfig::DirectFB) endif() endif() if(APPLE) # We do this so vulkaninfo is linked to an individual library and NOT a framework. - target_link_libraries(vulkaninfo PRIVATE Vulkan::Loader "-framework AppKit -framework QuartzCore") + target_link_libraries(vulkaninfo PRIVATE "-framework AppKit -framework QuartzCore") target_include_directories(vulkaninfo PRIVATE macOS/vulkaninfo) target_sources(vulkaninfo PRIVATE @@ -105,11 +105,10 @@ target_link_libraries(vulkaninfo PRIVATE ) if(WIN32) - target_compile_definitions(vulkaninfo PRIVATE + target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_WIN32_KHR WIN32_LEAN_AND_MEAN _CRT_SECURE_NO_WARNINGS - VK_NO_PROTOTYPES ) elseif(APPLE) target_compile_definitions(vulkaninfo PRIVATE VK_USE_PLATFORM_METAL_EXT) diff --git a/vulkaninfo/vulkaninfo.h b/vulkaninfo/vulkaninfo.h index 13d3b1e9..f0d942e4 100644 --- a/vulkaninfo/vulkaninfo.h +++ b/vulkaninfo/vulkaninfo.h @@ -256,111 +256,89 @@ struct VkDll { #if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) library = dlopen("libvulkan.so", RTLD_NOW | RTLD_LOCAL); if (!library) library = dlopen("libvulkan.so.1", RTLD_NOW | RTLD_LOCAL); +#elif defined(__APPLE__) + library = dlopen("libvulkan.dylib", RTLD_NOW | RTLD_LOCAL); + if (!library) library = dlopen("libvulkan.dylib.1", RTLD_NOW | RTLD_LOCAL); + if (!library) library = dlopen("libMoltenVK.dylib", RTLD_NOW | RTLD_LOCAL); #elif defined(_WIN32) library = LoadLibrary(TEXT("vulkan-1.dll")); #endif -#if !defined(__APPLE__) - if (library == 0) return VK_ERROR_INITIALIZATION_FAILED; -#endif - return VK_SUCCESS; + return library != nullptr ? VK_SUCCESS : VK_ERROR_INITIALIZATION_FAILED; } void Close() { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) || defined(__APPLE__) dlclose(library); #elif defined(_WIN32) FreeLibrary(library); #endif -#if !defined(__APPLE__) - library = 0; -#endif } -#if defined(__APPLE__) -#define APPLE_FP(name) name -#else -#define APPLE_FP(nama) nullptr -#endif - // Function pointers, loaded from the dll - PFN_vkCreateInstance fp_vkCreateInstance = APPLE_FP(vkCreateInstance); - PFN_vkEnumerateInstanceExtensionProperties fp_vkEnumerateInstanceExtensionProperties = - APPLE_FP(vkEnumerateInstanceExtensionProperties); - PFN_vkEnumerateInstanceLayerProperties fp_vkEnumerateInstanceLayerProperties = APPLE_FP(vkEnumerateInstanceLayerProperties); - PFN_vkDestroyInstance fp_vkDestroyInstance = APPLE_FP(vkDestroyInstance); - PFN_vkEnumeratePhysicalDevices fp_vkEnumeratePhysicalDevices = APPLE_FP(vkEnumeratePhysicalDevices); - PFN_vkGetPhysicalDeviceFeatures fp_vkGetPhysicalDeviceFeatures = APPLE_FP(vkGetPhysicalDeviceFeatures); - PFN_vkGetPhysicalDeviceFormatProperties fp_vkGetPhysicalDeviceFormatProperties = APPLE_FP(vkGetPhysicalDeviceFormatProperties); - PFN_vkGetPhysicalDeviceImageFormatProperties fp_vkGetPhysicalDeviceImageFormatProperties = - APPLE_FP(vkGetPhysicalDeviceImageFormatProperties); - PFN_vkGetPhysicalDeviceProperties fp_vkGetPhysicalDeviceProperties = APPLE_FP(vkGetPhysicalDeviceProperties); - PFN_vkGetPhysicalDeviceQueueFamilyProperties fp_vkGetPhysicalDeviceQueueFamilyProperties = - APPLE_FP(vkGetPhysicalDeviceQueueFamilyProperties); - PFN_vkGetPhysicalDeviceMemoryProperties fp_vkGetPhysicalDeviceMemoryProperties = APPLE_FP(vkGetPhysicalDeviceMemoryProperties); - PFN_vkGetInstanceProcAddr fp_vkGetInstanceProcAddr = APPLE_FP(vkGetInstanceProcAddr); - PFN_vkGetDeviceProcAddr fp_vkGetDeviceProcAddr = APPLE_FP(vkGetDeviceProcAddr); - PFN_vkCreateDevice fp_vkCreateDevice = APPLE_FP(vkCreateDevice); - PFN_vkDestroyDevice fp_vkDestroyDevice = APPLE_FP(vkDestroyDevice); - PFN_vkEnumerateDeviceExtensionProperties fp_vkEnumerateDeviceExtensionProperties = - APPLE_FP(vkEnumerateDeviceExtensionProperties); - PFN_vkGetDeviceQueue fp_vkGetDeviceQueue = APPLE_FP(vkGetDeviceQueue); - PFN_vkCreateImage fp_vkCreateImage = APPLE_FP(vkCreateImage); - PFN_vkDestroyImage fp_vkDestroyImage = APPLE_FP(vkDestroyImage); - PFN_vkGetBufferMemoryRequirements fp_vkGetBufferMemoryRequirements = APPLE_FP(vkGetBufferMemoryRequirements); - PFN_vkGetImageMemoryRequirements fp_vkGetImageMemoryRequirements = APPLE_FP(vkGetImageMemoryRequirements); - PFN_vkGetImageSparseMemoryRequirements fp_vkGetImageSparseMemoryRequirements = APPLE_FP(vkGetImageSparseMemoryRequirements); - PFN_vkEnumerateInstanceVersion fp_vkEnumerateInstanceVersion = APPLE_FP(vkEnumerateInstanceVersion); - PFN_vkEnumeratePhysicalDeviceGroups fp_vkEnumeratePhysicalDeviceGroups = APPLE_FP(vkEnumeratePhysicalDeviceGroups); - PFN_vkGetPhysicalDeviceFeatures2 fp_vkGetPhysicalDeviceFeatures2 = APPLE_FP(vkGetPhysicalDeviceFeatures2); - PFN_vkGetPhysicalDeviceProperties2 fp_vkGetPhysicalDeviceProperties2 = APPLE_FP(vkGetPhysicalDeviceProperties2); - PFN_vkGetPhysicalDeviceFormatProperties2 fp_vkGetPhysicalDeviceFormatProperties2 = - APPLE_FP(vkGetPhysicalDeviceFormatProperties2); - PFN_vkGetPhysicalDeviceQueueFamilyProperties2 fp_vkGetPhysicalDeviceQueueFamilyProperties2 = - APPLE_FP(vkGetPhysicalDeviceQueueFamilyProperties2); - PFN_vkGetPhysicalDeviceMemoryProperties2 fp_vkGetPhysicalDeviceMemoryProperties2 = - APPLE_FP(vkGetPhysicalDeviceMemoryProperties2); - PFN_vkDestroySurfaceKHR fp_vkDestroySurfaceKHR = APPLE_FP(vkDestroySurfaceKHR); - + PFN_vkCreateInstance fp_vkCreateInstance{}; + PFN_vkEnumerateInstanceExtensionProperties fp_vkEnumerateInstanceExtensionProperties{}; + PFN_vkEnumerateInstanceLayerProperties fp_vkEnumerateInstanceLayerProperties{}; + PFN_vkDestroyInstance fp_vkDestroyInstance{}; + PFN_vkEnumeratePhysicalDevices fp_vkEnumeratePhysicalDevices{}; + PFN_vkGetPhysicalDeviceFeatures fp_vkGetPhysicalDeviceFeatures{}; + PFN_vkGetPhysicalDeviceFormatProperties fp_vkGetPhysicalDeviceFormatProperties{}; + PFN_vkGetPhysicalDeviceImageFormatProperties fp_vkGetPhysicalDeviceImageFormatProperties{}; + PFN_vkGetPhysicalDeviceProperties fp_vkGetPhysicalDeviceProperties{}; + PFN_vkGetPhysicalDeviceQueueFamilyProperties fp_vkGetPhysicalDeviceQueueFamilyProperties{}; + PFN_vkGetPhysicalDeviceMemoryProperties fp_vkGetPhysicalDeviceMemoryProperties{}; + PFN_vkGetInstanceProcAddr fp_vkGetInstanceProcAddr{}; + PFN_vkGetDeviceProcAddr fp_vkGetDeviceProcAddr{}; + PFN_vkCreateDevice fp_vkCreateDevice{}; + PFN_vkDestroyDevice fp_vkDestroyDevice{}; + PFN_vkEnumerateDeviceExtensionProperties fp_vkEnumerateDeviceExtensionProperties{}; + PFN_vkGetDeviceQueue fp_vkGetDeviceQueue{}; + PFN_vkCreateImage fp_vkCreateImage{}; + PFN_vkDestroyImage fp_vkDestroyImage{}; + PFN_vkGetBufferMemoryRequirements fp_vkGetBufferMemoryRequirements{}; + PFN_vkGetImageMemoryRequirements fp_vkGetImageMemoryRequirements{}; + PFN_vkGetImageSparseMemoryRequirements fp_vkGetImageSparseMemoryRequirements{}; + PFN_vkEnumerateInstanceVersion fp_vkEnumerateInstanceVersion{}; + PFN_vkEnumeratePhysicalDeviceGroups fp_vkEnumeratePhysicalDeviceGroups{}; + PFN_vkGetPhysicalDeviceFeatures2 fp_vkGetPhysicalDeviceFeatures2{}; + PFN_vkGetPhysicalDeviceProperties2 fp_vkGetPhysicalDeviceProperties2{}; + PFN_vkGetPhysicalDeviceFormatProperties2 fp_vkGetPhysicalDeviceFormatProperties2{}; + PFN_vkGetPhysicalDeviceQueueFamilyProperties2 fp_vkGetPhysicalDeviceQueueFamilyProperties2{}; + PFN_vkGetPhysicalDeviceMemoryProperties2 fp_vkGetPhysicalDeviceMemoryProperties2{}; + PFN_vkDestroySurfaceKHR fp_vkDestroySurfaceKHR{}; #ifdef VK_USE_PLATFORM_XLIB_KHR - PFN_vkCreateXlibSurfaceKHR fp_vkCreateXlibSurfaceKHR = APPLE_FP(vkCreateXlibSurfaceKHR); - PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR fp_vkGetPhysicalDeviceXlibPresentationSupportKHR = - APPLE_FP(vkGetPhysicalDeviceXlibPresentationSupportKHR); + PFN_vkCreateXlibSurfaceKHR fp_vkCreateXlibSurfaceKHR{}; + PFN_vkGetPhysicalDeviceXlibPresentationSupportKHR fp_vkGetPhysicalDeviceXlibPresentationSupportKHR{}; #endif // VK_USE_PLATFORM_XLIB_KHR #ifdef VK_USE_PLATFORM_XCB_KHR - PFN_vkCreateXcbSurfaceKHR fp_vkCreateXcbSurfaceKHR = APPLE_FP(vkCreateXcbSurfaceKHR); - PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR fp_vkGetPhysicalDeviceXcbPresentationSupportKHR = - APPLE_FP(vkGetPhysicalDeviceXcbPresentationSupportKHR); + PFN_vkCreateXcbSurfaceKHR fp_vkCreateXcbSurfaceKHR{}; + PFN_vkGetPhysicalDeviceXcbPresentationSupportKHR fp_vkGetPhysicalDeviceXcbPresentationSupportKHR{}; #endif // VK_USE_PLATFORM_XCB_KHR #ifdef VK_USE_PLATFORM_WAYLAND_KHR - PFN_vkCreateWaylandSurfaceKHR fp_vkCreateWaylandSurfaceKHR = APPLE_FP(vkCreateWaylandSurfaceKHR); - PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR fp_vkGetPhysicalDeviceWaylandPresentationSupportKHR = - APPLE_FP(vkGetPhysicalDeviceWaylandPresentationSupportKHR); + PFN_vkCreateWaylandSurfaceKHR fp_vkCreateWaylandSurfaceKHR{}; + PFN_vkGetPhysicalDeviceWaylandPresentationSupportKHR fp_vkGetPhysicalDeviceWaylandPresentationSupportKHR{}; #endif // VK_USE_PLATFORM_WAYLAND_KHR #ifdef VK_USE_PLATFORM_DIRECTFB_EXT - PFN_vkCreateDirectFBSurfaceEXT fp_vkCreateDirectFBSurfaceEXT = APPLE_FP(vkCreateDirectFBSurfaceEXT); - PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT fp_vkGetPhysicalDeviceDirectFBPresentationSupportEXT = - APPLE_FP(vkGetPhysicalDeviceDirectFBPresentationSupportEXT); + PFN_vkCreateDirectFBSurfaceEXT fp_vkCreateDirectFBSurfaceEXT{}; + PFN_vkGetPhysicalDeviceDirectFBPresentationSupportEXT fp_vkGetPhysicalDeviceDirectFBPresentationSupportEXT{}; #endif // VK_USE_PLATFORM_DIRECTFB_EXT #ifdef VK_USE_PLATFORM_ANDROID_KHR - PFN_vkCreateAndroidSurfaceKHR fp_vkCreateAndroidSurfaceKHR = APPLE_FP(vkCreateAndroidSurfaceKHR); + PFN_vkCreateAndroidSurfaceKHR fp_vkCreateAndroidSurfaceKHR{}; #endif // VK_USE_PLATFORM_ANDROID_KHR #ifdef VK_USE_PLATFORM_GGP - PFN_vkCreateStreamDescriptorSurfaceGGP fp_vkCreateStreamDescriptorSurfaceGGP = APPLE_FP(vkCreateStreamDescriptorSurfaceGGP); + PFN_vkCreateStreamDescriptorSurfaceGGP fp_vkCreateStreamDescriptorSurfaceGGP{}; #endif // VK_USE_PLATFORM_GGP #ifdef VK_USE_PLATFORM_WIN32_KHR - PFN_vkCreateWin32SurfaceKHR fp_vkCreateWin32SurfaceKHR = APPLE_FP(vkCreateWin32SurfaceKHR); - PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR fp_vkGetPhysicalDeviceWin32PresentationSupportKHR = - APPLE_FP(vkGetPhysicalDeviceWin32PresentationSupportKHR); + PFN_vkCreateWin32SurfaceKHR fp_vkCreateWin32SurfaceKHR{}; + PFN_vkGetPhysicalDeviceWin32PresentationSupportKHR fp_vkGetPhysicalDeviceWin32PresentationSupportKHR{}; #endif // VK_USE_PLATFORM_WIN32_KHR #ifdef VK_USE_PLATFORM_MACOS_MVK - PFN_vkCreateMacOSSurfaceMVK fp_vkCreateMacOSSurfaceMVK = APPLE_FP(vkCreateMacOSSurfaceMVK); + PFN_vkCreateMacOSSurfaceMVK fp_vkCreateMacOSSurfaceMVK{}; #endif // VK_USE_PLATFORM_MACOS_MVK #ifdef VK_USE_PLATFORM_METAL_EXT - PFN_vkCreateMetalSurfaceEXT fp_vkCreateMetalSurfaceEXT = APPLE_FP(vkCreateMetalSurfaceEXT); + PFN_vkCreateMetalSurfaceEXT fp_vkCreateMetalSurfaceEXT{}; #endif // VK_USE_PLATFORM_METAL_EXT #ifdef VK_USE_PLATFORM_SCREEN_QNX - PFN_vkCreateScreenSurfaceQNX fp_vkCreateScreenSurfaceQNX = APPLE_FP(vkCreateScreenSurfaceQNX); - PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX fp_vkGetPhysicalDeviceScreenPresentationSupportQNX = - APPLE_FP(vkGetPhysicalDeviceScreenPresentationSupportQNX); + PFN_vkCreateScreenSurfaceQNX fp_vkCreateScreenSurfaceQNX{}; + PFN_vkGetPhysicalDeviceScreenPresentationSupportQNX fp_vkGetPhysicalDeviceScreenPresentationSupportQNX{}; #endif // VK_USE_PLATFORM_SCREEN_QNX void InitializeDispatchPointers() { Load(fp_vkCreateInstance, "vkCreateInstance"); @@ -434,13 +412,13 @@ struct VkDll { private: template <typename T> void Load(T &func_dest, const char *func_name) { -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) || defined(__APPLE__) func_dest = reinterpret_cast<T>(dlsym(library, func_name)); #elif defined(_WIN32) func_dest = reinterpret_cast<T>(GetProcAddress(library, func_name)); #endif } -#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) +#if defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__QNX__) || defined(__APPLE__) void *library; #elif defined(_WIN32) HMODULE library; |
