aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Giessen <charles@lunarg.com>2023-11-10 13:37:01 -0700
committerJuan Ramos <114601453+juan-lunarg@users.noreply.github.com>2023-11-16 18:28:56 -0700
commite363efd09388fc849ad11b20e9fc26676eadb97a (patch)
tree99b00a9151d4e2b0a71dca7ca62d8db7d9d99342
parent1ccfee8ee9c3e2b1456578de4ee70a91b2d424c2 (diff)
downloadusermoji-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.txt15
-rw-r--r--vulkaninfo/vulkaninfo.h130
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;