#define AL_LOG_SECTION "vk_common" #include #include "vk_common.h" #if defined VK_FORCE_DYNAMIC_LOAD && !defined NAUNET_ON_WINDOWS #include #endif static VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL get_vk_proc_address(VkInstance inst, const char *name) { PFN_vkGetInstanceProcAddr vk_get_proc_addr; #ifdef VK_FORCE_DYNAMIC_LOAD #ifdef NAUNET_ON_WINDOWS const char *VKLib = "vulkan-1.dll"; HMODULE VKModule = LoadLibraryA(VKLib); if (!VKModule) { log_error("Failed to load %s (0x%lx).", VKLib, GetLastError()); return NULL; } vk_get_proc_addr = (void *)GetProcAddress(VKModule, "vkGetInstanceProcAddr"); #else const char *vk_lib = "libvulkan.so.1"; void *vk_module = dlopen(vk_lib, RTLD_LAZY | RTLD_GLOBAL | RTLD_NODELETE); if (!vk_module) { log_error("Failed to load %s.", vk_lib); return NULL; } vk_get_proc_addr = (PFN_vkGetInstanceProcAddr)dlsym(vk_module, "vkGetInstanceProcAddr"); dlclose(vk_module); #endif #else vk_get_proc_addr = vkGetInstanceProcAddr; #endif if (!vk_get_proc_addr) return NULL; return (PFN_vkVoidFunction)vk_get_proc_addr(inst, name); } VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL stl_get_vk_proc_address(VkInstance inst, const char *name) { // https://github.com/glfw/glfw/blob/e7ea71be039836da3a98cea55ae5569cb5eb885c/src/vulkan.c#L259 if (strcmp(name, "vkGetInstanceProcAddr") == 0) { return (PFN_vkVoidFunction)get_vk_proc_address; } return get_vk_proc_address(inst, name); } VkResult stl_vk_destroy_surface(VkInstance inst, VkSurfaceKHR surface) { PFN_vkDestroySurfaceKHR pVkDestroySurfaceKHR; #ifdef VK_FORCE_DYNAMIC_LOAD pVkDestroySurfaceKHR = (PFN_vkDestroySurfaceKHR)get_vk_proc_address(inst, "vkDestroySurfaceKHR"); if (!pVkDestroySurfaceKHR) { return VK_ERROR_EXTENSION_NOT_PRESENT; } #else pVkDestroySurfaceKHR = vkDestroySurfaceKHR; #endif pVkDestroySurfaceKHR(inst, surface, NULL); return VK_SUCCESS; }