* Copyright 2017-2020 Mark Callow.
* SPDX-License-Identifier: Apache-2.0
*/
* @internal
* @file
* @~English
*
* @brief Retrieve Vulkan function pointers needed by libktx
*/
#define UNIX 0
#define MACOS 0
#define WINDOWS 0
#define IOS 0
#if defined(_WIN32)
#undef WINDOWS
#define WINDOWS 1
#endif
#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__bsdi__) || defined(__DragonFly__)
#undef UNIX
#define UNIX 1
#endif
#if defined(linux) || defined(__linux) || defined(__linux__)
#undef UNIX
#define UNIX 1
#endif
#if defined(__APPLE__) && defined(__x86_64__)
#undef MACOS
#define MACOS 1
#endif
#if defined(__APPLE__) && (defined(__arm64__) || defined (__arm__))
#undef IOS
#define IOS 1
#endif
#if (IOS + MACOS + UNIX + WINDOWS) > 1
#error "Multiple OS\'s defined"
#endif
#include "vk_funcs.h"
#if WINDOWS
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
#else
#include <dlfcn.h>
#include <stdlib.h>
#endif
#include "ktx.h"
#if WINDOWS
HMODULE ktxVulkanModuleHandle;
#define GetVulkanModuleHandle(flags) ktxGetVulkanModuleHandle()
#define LoadProcAddr GetProcAddress
#elif MACOS || UNIX || IOS
#define GetVulkanModuleHandle(flags) dlopen(NULL, flags)
#define LoadProcAddr dlsym
void* ktxVulkanModuleHandle;
#else
#error "Don\'t know how to load symbols on this OS."
#endif
#if WINDOWS
#define VULKANLIB "vulkan-1.dll"
static HMODULE
ktxGetVulkanModuleHandle()
{
HMODULE module = NULL;
GetModuleHandleExA(
0,
VULKANLIB,
&module
);
return module;
}
#endif
ktx_error_code_e
ktxLoadVulkanLibrary(void)
{
if (ktxVulkanModuleHandle)
return KTX_SUCCESS;
ktxVulkanModuleHandle = GetVulkanModuleHandle(RTLD_LAZY);
if (ktxVulkanModuleHandle == NULL) {
fprintf(stderr, "Vulkan lib not linked or loaded by application.\n");
#if defined(DEBUG)
abort();
#else
return KTX_LIBRARY_NOT_LINKED;
#endif
}
return KTX_SUCCESS;
}
PFN_vkVoidFunction
ktxLoadVulkanFunction(const char* pName) {
ktx_error_code_e rc = ktxLoadVulkanLibrary();
if (rc != KTX_SUCCESS) {
return NULL;
}
PFN_vkVoidFunction pfn
= (PFN_vkVoidFunction)LoadProcAddr(ktxVulkanModuleHandle, pName);
if (pfn == NULL) {
fprintf(stderr, "Couldn't load Vulkan command: %s\n", pName);
return NULL;
}
return pfn;
}