Add MoltenVK support
SDL_Vulkan_LoadLibrary is used for macOS to keep 10.9 compatibility
This commit is contained in:
parent
d5c848c4c2
commit
17d26338f8
2
.github/workflows/apple.yml
vendored
2
.github/workflows/apple.yml
vendored
@ -140,6 +140,8 @@ jobs:
|
|||||||
lipo -create ./macosx-x86_64/supertuxkart.app/Contents/MacOS/supertuxkart ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart -output ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart
|
lipo -create ./macosx-x86_64/supertuxkart.app/Contents/MacOS/supertuxkart ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart -output ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart
|
||||||
chmod 755 ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart
|
chmod 755 ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart
|
||||||
dylibbundler -od -b -x ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart -d ./macosx-arm64/supertuxkart.app/Contents/libs/ -p @executable_path/../libs/ -s dependencies-macosx/lib
|
dylibbundler -od -b -x ./macosx-arm64/supertuxkart.app/Contents/MacOS/supertuxkart -d ./macosx-arm64/supertuxkart.app/Contents/libs/ -p @executable_path/../libs/ -s dependencies-macosx/lib
|
||||||
|
# We use SDL_Vulkan_LoadLibrary for 10.9 compatibility, so otool -L supertuxkart has no libMoltenVK.dylib
|
||||||
|
cp ./dependencies-macosx/lib/libMoltenVK.dylib ./macosx-arm64/supertuxkart.app/Contents/libs/
|
||||||
cd ./macosx-arm64/supertuxkart.app/Contents/Resources/data
|
cd ./macosx-arm64/supertuxkart.app/Contents/Resources/data
|
||||||
wget https://github.com/supertuxkart/stk-assets-mobile/releases/download/git/stk-assets-full.zip
|
wget https://github.com/supertuxkart/stk-assets-mobile/releases/download/git/stk-assets-full.zip
|
||||||
unzip stk-assets-full.zip
|
unzip stk-assets-full.zip
|
||||||
|
@ -26,7 +26,7 @@ if(NINTENDO_SWITCH)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32)
|
||||||
option(USE_DIRECTX "Build DirectX 9 driver (requires DirectX SDK)" OFF)
|
option(USE_DIRECTX "Build DirectX 9 driver (requires DirectX SDK)" OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(SERVER_ONLY "Create a server only (i.e. no graphics or sound)" OFF)
|
option(SERVER_ONLY "Create a server only (i.e. no graphics or sound)" OFF)
|
||||||
@ -38,6 +38,11 @@ CMAKE_DEPENDENT_OPTION(USE_IPV6 "Allow create or connect to game server with IPv
|
|||||||
option(USE_SYSTEM_WIIUSE "Use system WiiUse instead of the built-in version, when available." OFF)
|
option(USE_SYSTEM_WIIUSE "Use system WiiUse instead of the built-in version, when available." OFF)
|
||||||
option(USE_SQLITE3 "Use sqlite to manage server stats and ban list." ON)
|
option(USE_SQLITE3 "Use sqlite to manage server stats and ban list." ON)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
CMAKE_DEPENDENT_OPTION(DLOPEN_MOLTENVK "Use dlopen to load MoltenVK for Apple." ON
|
||||||
|
"NOT IOS;NOT SERVER_ONLY" OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
CMAKE_DEPENDENT_OPTION(USE_CRYPTO_OPENSSL "Use OpenSSL instead of MbedTLS for cryptography in STK." ON
|
CMAKE_DEPENDENT_OPTION(USE_CRYPTO_OPENSSL "Use OpenSSL instead of MbedTLS for cryptography in STK." ON
|
||||||
"NOT USE_SWITCH;NOT WIN32" OFF)
|
"NOT USE_SWITCH;NOT WIN32" OFF)
|
||||||
CMAKE_DEPENDENT_OPTION(BUILD_RECORDER "Build opengl recorder" ON
|
CMAKE_DEPENDENT_OPTION(BUILD_RECORDER "Build opengl recorder" ON
|
||||||
@ -49,6 +54,10 @@ CMAKE_DEPENDENT_OPTION(USE_WIIUSE "Support for wiimote input devices" ON
|
|||||||
CMAKE_DEPENDENT_OPTION(USE_DNS_C "Build bundled dns resolver" OFF "NOT CYGWIN;NOT USE_SWITCH" ON)
|
CMAKE_DEPENDENT_OPTION(USE_DNS_C "Build bundled dns resolver" OFF "NOT CYGWIN;NOT USE_SWITCH" ON)
|
||||||
CMAKE_DEPENDENT_OPTION(USE_MOJOAL "Use bundled MojoAL instead of system OpenAL" OFF "NOT APPLE" ON)
|
CMAKE_DEPENDENT_OPTION(USE_MOJOAL "Use bundled MojoAL instead of system OpenAL" OFF "NOT APPLE" ON)
|
||||||
|
|
||||||
|
if (DLOPEN_MOLTENVK)
|
||||||
|
ADD_DEFINITIONS(-DDLOPEN_MOLTENVK)
|
||||||
|
endif()
|
||||||
|
|
||||||
if((UNIX AND NOT APPLE) OR NINTENDO_SWITCH)
|
if((UNIX AND NOT APPLE) OR NINTENDO_SWITCH)
|
||||||
include(FindPkgConfig)
|
include(FindPkgConfig)
|
||||||
endif()
|
endif()
|
||||||
@ -674,6 +683,10 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT SERVER_ONLY)
|
if(NOT SERVER_ONLY)
|
||||||
|
if (APPLE AND NOT DLOPEN_MOLTENVK)
|
||||||
|
find_library(MOLTENVK_LIBRARY NAMES MoltenVK libMoltenVK REQUIRED)
|
||||||
|
target_link_libraries(supertuxkart "-framework Metal -weak_framework IOSurface -framework QuartzCore ${MOLTENVK_LIBRARY}")
|
||||||
|
endif()
|
||||||
if (IOS)
|
if (IOS)
|
||||||
target_link_libraries(supertuxkart "-weak_framework CoreHaptics -framework QuartzCore -framework CoreGraphics -framework AVFoundation -framework AudioToolbox -framework Metal -framework GameController -framework OpenGLES -framework UIKit -framework CoreAudio -framework Foundation -framework GLKit")
|
target_link_libraries(supertuxkart "-weak_framework CoreHaptics -framework QuartzCore -framework CoreGraphics -framework AVFoundation -framework AudioToolbox -framework Metal -framework GameController -framework OpenGLES -framework UIKit -framework CoreAudio -framework Foundation -framework GLKit")
|
||||||
# tvOS doesn't have CoreMotion framwork
|
# tvOS doesn't have CoreMotion framwork
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
# You can also use -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=xxxxxxxxxx to specify team
|
# You can also use -DCMAKE_XCODE_ATTRIBUTE_DEVELOPMENT_TEAM=xxxxxxxxxx to specify team
|
||||||
|
|
||||||
# Increase every upload to App store
|
# Increase every upload to App store
|
||||||
SET(IOS_BUILD_VERSION 23)
|
SET(IOS_BUILD_VERSION 24)
|
||||||
|
|
||||||
# Get SDK path
|
# Get SDK path
|
||||||
execute_process(COMMAND xcodebuild -version -sdk iphoneos Path
|
execute_process(COMMAND xcodebuild -version -sdk iphoneos Path
|
||||||
@ -57,6 +57,8 @@ set(SDL2_LIBRARY ${PROJECT_SOURCE_DIR}/dependencies\${EFFECTIVE_PLATFORM_NAME}/l
|
|||||||
set(SDL2_INCLUDEDIR ${PROJECT_SOURCE_DIR}/dependencies-iphoneos/include/SDL2 CACHE STRING "")
|
set(SDL2_INCLUDEDIR ${PROJECT_SOURCE_DIR}/dependencies-iphoneos/include/SDL2 CACHE STRING "")
|
||||||
set(LIBSAMPLERATE_LIBRARY ${PROJECT_SOURCE_DIR}/dependencies\${EFFECTIVE_PLATFORM_NAME}/lib/libsamplerate.a CACHE STRING "")
|
set(LIBSAMPLERATE_LIBRARY ${PROJECT_SOURCE_DIR}/dependencies\${EFFECTIVE_PLATFORM_NAME}/lib/libsamplerate.a CACHE STRING "")
|
||||||
set(LIBSAMPLERATE_INCLUDEDIR ${PROJECT_SOURCE_DIR}/dependencies-iphoneos/include CACHE STRING "")
|
set(LIBSAMPLERATE_INCLUDEDIR ${PROJECT_SOURCE_DIR}/dependencies-iphoneos/include CACHE STRING "")
|
||||||
|
set(MOLTENVK_LIBRARY ${PROJECT_SOURCE_DIR}/dependencies\${EFFECTIVE_PLATFORM_NAME}/lib/libMoltenVK.a CACHE STRING "")
|
||||||
|
set(VULKAN_INCLUDEDIR ${PROJECT_SOURCE_DIR}/dependencies-iphoneos/include CACHE STRING "")
|
||||||
|
|
||||||
# For universal iOS and simulator
|
# For universal iOS and simulator
|
||||||
set(LIBRESOLV_LIBRARY -lresolv CACHE STRING "")
|
set(LIBRESOLV_LIBRARY -lresolv CACHE STRING "")
|
||||||
|
@ -7,15 +7,30 @@ else()
|
|||||||
include_directories("${SDL2_INCLUDEDIR}")
|
include_directories("${SDL2_INCLUDEDIR}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(APPLE AND NOT DLOPEN_MOLTENVK)
|
||||||
|
find_path(VULKAN_INCLUDEDIR NAMES vulkan/vulkan.h PATHS)
|
||||||
|
if (NOT VULKAN_INCLUDEDIR)
|
||||||
|
message(FATAL_ERROR "Vulkan not found.")
|
||||||
|
else()
|
||||||
|
include_directories("${VULKAN_INCLUDEDIR}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
if(UNIX OR MINGW)
|
if(UNIX OR MINGW)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++0x")
|
||||||
endif()
|
endif()
|
||||||
add_library(graphics_engine STATIC
|
|
||||||
|
set(GE_SOURCES
|
||||||
src/gl.c
|
src/gl.c
|
||||||
src/vulkan.c
|
|
||||||
src/ge_main.cpp
|
src/ge_main.cpp
|
||||||
src/ge_texture.cpp
|
src/ge_texture.cpp
|
||||||
src/ge_dx9_texture.cpp
|
src/ge_dx9_texture.cpp
|
||||||
src/ge_vulkan_driver.cpp
|
src/ge_vulkan_driver.cpp
|
||||||
src/ge_gl_texture.cpp
|
src/ge_gl_texture.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(NOT APPLE OR DLOPEN_MOLTENVK)
|
||||||
|
set(GE_SOURCES ${GE_SOURCES} src/vulkan.c)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(graphics_engine STATIC ${GE_SOURCES})
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_VULKAN_
|
#ifdef _IRR_COMPILE_WITH_VULKAN_
|
||||||
|
|
||||||
#include "glad/vulkan.h"
|
#include "vulkan_wrapper.h"
|
||||||
#include "SDL_video.h"
|
#include "SDL_video.h"
|
||||||
|
|
||||||
#include "../source/Irrlicht/CNullDriver.h"
|
#include "../source/Irrlicht/CNullDriver.h"
|
||||||
|
10
lib/graphics_engine/include/vulkan_wrapper.h
Normal file
10
lib/graphics_engine/include/vulkan_wrapper.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef HEADER_VULKAN_WRAPPER_HPP
|
||||||
|
#define HEADER_VULKAN_WRAPPER_HPP
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
|
#include <glad/vulkan.h>
|
||||||
|
#else
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "../source/Irrlicht/os.h"
|
#include "../source/Irrlicht/os.h"
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
struct GE_VK_UserPointer
|
struct GE_VK_UserPointer
|
||||||
{
|
{
|
||||||
VkInstance instance;
|
VkInstance instance;
|
||||||
@ -430,6 +431,7 @@ extern "C" PFN_vkVoidFunction loader(void* user_ptr, const char* name)
|
|||||||
return NULL;
|
return NULL;
|
||||||
return get_instance_proc_addr(instance, name);
|
return get_instance_proc_addr(instance, name);
|
||||||
} // loader
|
} // loader
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace GE
|
namespace GE
|
||||||
{
|
{
|
||||||
@ -446,6 +448,7 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
|||||||
|
|
||||||
createInstance(window);
|
createInstance(window);
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
GE_VK_UserPointer user_ptr = {};
|
GE_VK_UserPointer user_ptr = {};
|
||||||
user_ptr.instance = m_vk.instance;
|
user_ptr.instance = m_vk.instance;
|
||||||
if (gladLoadVulkanUserPtr(NULL,
|
if (gladLoadVulkanUserPtr(NULL,
|
||||||
@ -454,12 +457,15 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
|||||||
throw std::runtime_error("gladLoadVulkanUserPtr failed "
|
throw std::runtime_error("gladLoadVulkanUserPtr failed "
|
||||||
"with non-NULL instance");
|
"with non-NULL instance");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (SDL_Vulkan_CreateSurface(window, m_vk.instance, &m_vk.surface) == SDL_FALSE)
|
if (SDL_Vulkan_CreateSurface(window, m_vk.instance, &m_vk.surface) == SDL_FALSE)
|
||||||
throw std::runtime_error("SDL_Vulkan_CreateSurface failed");
|
throw std::runtime_error("SDL_Vulkan_CreateSurface failed");
|
||||||
m_device_extensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
|
m_device_extensions.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
|
||||||
findPhysicalDevice();
|
findPhysicalDevice();
|
||||||
createDevice();
|
createDevice();
|
||||||
|
|
||||||
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
user_ptr.device = m_vk.device;
|
user_ptr.device = m_vk.device;
|
||||||
if (gladLoadVulkanUserPtr(m_physical_device,
|
if (gladLoadVulkanUserPtr(m_physical_device,
|
||||||
(GLADuserptrloadfunc)loader, &user_ptr) == 0)
|
(GLADuserptrloadfunc)loader, &user_ptr) == 0)
|
||||||
@ -467,6 +473,7 @@ GEVulkanDriver::GEVulkanDriver(const SIrrlichtCreationParameters& params,
|
|||||||
throw std::runtime_error("gladLoadVulkanUserPtr failed with "
|
throw std::runtime_error("gladLoadVulkanUserPtr failed with "
|
||||||
"non-NULL instance and non-NULL m_physical_device");
|
"non-NULL instance and non-NULL m_physical_device");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
vkGetPhysicalDeviceProperties(m_physical_device, &m_properties);
|
vkGetPhysicalDeviceProperties(m_physical_device, &m_properties);
|
||||||
os::Printer::log("Vulkan version", getVulkanVersionString().c_str());
|
os::Printer::log("Vulkan version", getVulkanVersionString().c_str());
|
||||||
@ -485,10 +492,13 @@ GEVulkanDriver::~GEVulkanDriver()
|
|||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
void GEVulkanDriver::createInstance(SDL_Window* window)
|
void GEVulkanDriver::createInstance(SDL_Window* window)
|
||||||
{
|
{
|
||||||
|
#if !defined(__APPLE__) || defined(DLOPEN_MOLTENVK)
|
||||||
if (gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc)loader, NULL) == 0)
|
if (gladLoadVulkanUserPtr(NULL, (GLADuserptrloadfunc)loader, NULL) == 0)
|
||||||
{
|
{
|
||||||
throw std::runtime_error("gladLoadVulkanUserPtr failed 1st time");
|
throw std::runtime_error("gladLoadVulkanUserPtr failed 1st time");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
if (!SDL_Vulkan_GetInstanceExtensions(window, &count, NULL))
|
if (!SDL_Vulkan_GetInstanceExtensions(window, &count, NULL))
|
||||||
throw std::runtime_error("SDL_Vulkan_GetInstanceExtensions failed with NULL extensions");
|
throw std::runtime_error("SDL_Vulkan_GetInstanceExtensions failed with NULL extensions");
|
||||||
|
@ -531,6 +531,15 @@ include/vector2d.h
|
|||||||
include/vector3d.h
|
include/vector3d.h
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(DLOPEN_MOLTENVK)
|
||||||
|
set(IRRLICHT_SOURCES
|
||||||
|
${IRRLICHT_SOURCES}
|
||||||
|
source/Irrlicht/MoltenVK.mm
|
||||||
|
source/Irrlicht/MoltenVK.h)
|
||||||
|
set_source_files_properties(source/Irrlicht/MoltenVK.mm PROPERTIES COMPILE_FLAGS "-x objective-c++ -O3 -fno-rtti")
|
||||||
|
set_source_files_properties(source/Irrlicht/MoltenVK.mm PROPERTIES LANGUAGE C)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(IOS)
|
if(IOS)
|
||||||
set(IRRLICHT_SOURCES
|
set(IRRLICHT_SOURCES
|
||||||
${IRRLICHT_SOURCES}
|
${IRRLICHT_SOURCES}
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
|
|
||||||
#include "guiengine/engine.hpp"
|
#include "guiengine/engine.hpp"
|
||||||
#include "glad/gl.h"
|
#include "glad/gl.h"
|
||||||
|
#include "MoltenVK.h"
|
||||||
|
|
||||||
extern bool GLContextDebugBit;
|
extern bool GLContextDebugBit;
|
||||||
|
|
||||||
@ -71,6 +72,10 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters& param)
|
|||||||
setDebugName("CIrrDeviceSDL");
|
setDebugName("CIrrDeviceSDL");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
m_moltenvk = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
Operator = 0;
|
Operator = 0;
|
||||||
// Initialize SDL... Timer for sleep, video for the obvious, and
|
// Initialize SDL... Timer for sleep, video for the obvious, and
|
||||||
// noparachute prevents SDL from catching fatal errors.
|
// noparachute prevents SDL from catching fatal errors.
|
||||||
@ -194,6 +199,9 @@ CIrrDeviceSDL::~CIrrDeviceSDL()
|
|||||||
VideoDriver->drop();
|
VideoDriver->drop();
|
||||||
VideoDriver = NULL;
|
VideoDriver = NULL;
|
||||||
}
|
}
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
delete m_moltenvk;
|
||||||
|
#endif
|
||||||
if (Context)
|
if (Context)
|
||||||
SDL_GL_DeleteContext(Context);
|
SDL_GL_DeleteContext(Context);
|
||||||
if (Window)
|
if (Window)
|
||||||
@ -359,7 +367,17 @@ bool CIrrDeviceSDL::createWindow()
|
|||||||
CreationParams.DriverType == video::EDT_OGLES2)
|
CreationParams.DriverType == video::EDT_OGLES2)
|
||||||
flags |= SDL_WINDOW_OPENGL;
|
flags |= SDL_WINDOW_OPENGL;
|
||||||
else if (CreationParams.DriverType == video::EDT_VULKAN)
|
else if (CreationParams.DriverType == video::EDT_VULKAN)
|
||||||
|
{
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
m_moltenvk = new MoltenVK();
|
||||||
|
if (!m_moltenvk->loaded())
|
||||||
|
{
|
||||||
|
os::Printer::log("Current MacOSX version doesn't support Vulkan or MoltenVK failed to load", ELL_WARNING);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
flags |= SDL_WINDOW_VULKAN;
|
flags |= SDL_WINDOW_VULKAN;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef MOBILE_STK
|
#ifdef MOBILE_STK
|
||||||
flags |= SDL_WINDOW_BORDERLESS | SDL_WINDOW_MAXIMIZED;
|
flags |= SDL_WINDOW_BORDERLESS | SDL_WINDOW_MAXIMIZED;
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
{
|
{
|
||||||
|
class MoltenVK;
|
||||||
|
|
||||||
class CIrrDeviceSDL : public CIrrDeviceStub, video::IImagePresenter
|
class CIrrDeviceSDL : public CIrrDeviceStub, video::IImagePresenter
|
||||||
{
|
{
|
||||||
@ -323,6 +324,9 @@ namespace irr
|
|||||||
std::map<SDL_Scancode, irr::EKEY_CODE> ScanCodeMap;
|
std::map<SDL_Scancode, irr::EKEY_CODE> ScanCodeMap;
|
||||||
SDL_SysWMinfo Info;
|
SDL_SysWMinfo Info;
|
||||||
void tryCreateOpenGLContext(u32 flags);
|
void tryCreateOpenGLContext(u32 flags);
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
MoltenVK* m_moltenvk;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
} // end namespace irr
|
} // end namespace irr
|
||||||
|
23
lib/irrlicht/source/Irrlicht/MoltenVK.h
Normal file
23
lib/irrlicht/source/Irrlicht/MoltenVK.h
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#ifndef HEADER_MAC_VULKAN_HPP
|
||||||
|
#define HEADER_MAC_VULKAN_HPP
|
||||||
|
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
namespace irr
|
||||||
|
{
|
||||||
|
class MoltenVK
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
bool m_loaded;
|
||||||
|
public:
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
MoltenVK();
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
~MoltenVK();
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
bool loaded() const { return m_loaded; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
43
lib/irrlicht/source/Irrlicht/MoltenVK.mm
Normal file
43
lib/irrlicht/source/Irrlicht/MoltenVK.mm
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#include "MoltenVK.h"
|
||||||
|
#include "SDL_vulkan.h"
|
||||||
|
#import <AppKit/NSApplication.h>
|
||||||
|
|
||||||
|
#ifdef DLOPEN_MOLTENVK
|
||||||
|
|
||||||
|
namespace irr
|
||||||
|
{
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
MoltenVK::MoltenVK()
|
||||||
|
{
|
||||||
|
m_loaded = false;
|
||||||
|
// 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)
|
||||||
|
{
|
||||||
|
m_loaded = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} // MoltenVK
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
MoltenVK::~MoltenVK()
|
||||||
|
{
|
||||||
|
if (m_loaded)
|
||||||
|
SDL_Vulkan_UnloadLibrary();
|
||||||
|
} // ~MoltenVK
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user