1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
#include "MoltenVK.h"
#include "SDL_vulkan.h"
#include "vulkan_wrapper.h"
#include <dlfcn.h>
#import <AppKit/NSApplication.h>
#ifdef DLOPEN_MOLTENVK
PFN_vkGetMoltenVKConfigurationMVK vkGetMoltenVKConfigurationMVK = NULL;
PFN_vkSetMoltenVKConfigurationMVK vkSetMoltenVKConfigurationMVK = NULL;
PFN_vkGetPhysicalDeviceMetalFeaturesMVK vkGetPhysicalDeviceMetalFeaturesMVK = NULL;
namespace irr
{
// ----------------------------------------------------------------------------
MoltenVK::MoltenVK()
{
m_loaded = false;
m_handle = NULL;
// MacOSX 10.11 or later supports Metal (MoltenVK)
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10_Max)
return;
const char* paths[3] =
{
// STK release binary path after dylibbundler
"@executable_path/../libs/libMoltenVK.dylib",
// bin/supertuxkart.app/Contents/MacOS/supertuxkart
"@executable_path/../../../../../dependencies-macosx/lib/libMoltenVK.dylib",
"NULL"
};
for (int i = 0; i < 3; i++)
{
if (SDL_Vulkan_LoadLibrary(paths[i]) == 0)
{
// Following SDL/src/loadso/dlopen/SDL_sysloadso.c
m_handle = dlopen(paths[i], RTLD_NOW|RTLD_LOCAL);
if (!m_handle)
{
SDL_Vulkan_UnloadLibrary();
return;
}
vkGetMoltenVKConfigurationMVK = (PFN_vkGetMoltenVKConfigurationMVK)
dlsym(m_handle, "vkGetMoltenVKConfigurationMVK");
vkSetMoltenVKConfigurationMVK = (PFN_vkSetMoltenVKConfigurationMVK)
dlsym(m_handle, "vkSetMoltenVKConfigurationMVK");
vkGetPhysicalDeviceMetalFeaturesMVK = (PFN_vkGetPhysicalDeviceMetalFeaturesMVK)
dlsym(m_handle, "vkGetPhysicalDeviceMetalFeaturesMVK");
if (!vkGetMoltenVKConfigurationMVK ||
!vkSetMoltenVKConfigurationMVK ||
!vkGetPhysicalDeviceMetalFeaturesMVK)
{
SDL_Vulkan_UnloadLibrary();
return;
}
m_loaded = true;
break;
}
}
} // MoltenVK
// ----------------------------------------------------------------------------
MoltenVK::~MoltenVK()
{
if (m_loaded)
{
dlclose(m_handle);
SDL_Vulkan_UnloadLibrary();
}
} // ~MoltenVK
#endif
}
|