From 08ae0dddbb35169bb3afad02198f707de81a3306 Mon Sep 17 00:00:00 2001 From: Gerasim Troeglazov <3dEyes@gmail.com> Date: Sat, 25 Jan 2025 14:21:51 +1000 Subject: Fix for Haiku diff --git a/CMakeLists.txt b/CMakeLists.txt index a355317..077294a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -100,7 +100,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Android") endif() # We only support Vulkan on Unix, macOS (by MoltenVK), Android and Windows. -if(ANDROID OR WIN32 OR (UNIX AND NOT ARM_NO_VULKAN)) +if(ANDROID OR WIN32 OR (UNIX AND NOT HAIKU AND NOT ARM_NO_VULKAN)) set(VULKAN ON) endif() @@ -192,7 +192,7 @@ if(USE_CCACHE) include(ccache) endif() -if(UNIX AND NOT (APPLE OR ANDROID) AND VULKAN) +if(UNIX AND NOT (APPLE OR ANDROID OR HAIKU) AND VULKAN) if(USING_X11_VULKAN) message("Using X11 for Vulkan") find_package(X11) @@ -956,7 +956,7 @@ if(USE_FFMPEG) endif() elseif(MACOSX) set(PLATFORM_ARCH "macosx/universal") - elseif(LINUX) + elseif(LINUX) if(ARMV7) set(PLATFORM_ARCH "linux/armv7") elseif(ARM64) @@ -974,6 +974,12 @@ if(USE_FFMPEG) elseif(X86) set(PLATFORM_ARCH "linux/x86") endif() + elseif(HAIKU) + if(X86_64) + set(PLATFORM_ARCH "haiku/x86_64") + elseif(X86) + set(PLATFORM_ARCH "haiku/x86") + endif() elseif(WIN32) if(X86_64) set(PLATFORM_ARCH "Windows/x86_64") @@ -1345,7 +1351,7 @@ elseif(IOS AND NOT LIBRETRO) set(nativeExtraLibs ${nativeExtraLibs} "-weak_framework GameController") endif() - if(NOT ICONV_LIBRARY) + if(NOT ICONV_LIBRARY OR HAIKU) set(nativeExtraLibs ${nativeExtraLibs} iconv) endif() @@ -1609,7 +1615,7 @@ add_library(native STATIC ext/jpge/jpge.h ) -if(LINUX AND NOT ANDROID) +if(LINUX AND NOT ANDROID AND NOT HAIKU) set(RT_LIB rt) endif() @@ -1627,6 +1633,8 @@ if(ANDROID) target_link_libraries(native log EGL OpenSLES) elseif(WIN32) target_link_libraries(native ws2_32 winmm) +elseif(HAIKU) + target_link_libraries(native network) elseif(${CMAKE_SYSTEM_NAME} MATCHES "^(DragonFly|FreeBSD|NetBSD)$") target_link_libraries(native execinfo) endif() @@ -2466,12 +2474,15 @@ if(FFmpeg_FOUND) endif() # Discord integration -if(USE_DISCORD AND NOT IOS AND NOT LIBRETRO) +if(USE_DISCORD AND NOT IOS AND NOT LIBRETRO AND NOT HAIKU) add_definitions(-DUSE_DISCORD=1) target_link_libraries(${CoreLibName} discord-rpc) endif() # miniUPnPc integration (MiniUPnPc supposed to works on any POSIX system, not sure if some of these are redundant/not needed tho) +if(HAIKU) + target_link_libraries(${CoreLibName} miniupnpc) +else() if(USE_MINIUPNPC) if(USE_SYSTEM_MINIUPNPC) find_package(MINIUPNPC REQUIRED) @@ -2551,6 +2562,7 @@ if(USE_MINIUPNPC) endif() endif() endif() +endif() setup_target_project(${CoreLibName} Core) @@ -2676,6 +2688,10 @@ set(WindowsFiles list(APPEND LinkCommon ${CoreLibName} ${CMAKE_THREAD_LIBS_INIT}) +if(HAIKU) + list(APPEND LinkCommon network) +endif() + if(WIN32) list(APPEND LinkCommon kernel32 user32 gdi32 shell32 comctl32 dsound xinput d3d9 winmm dinput8 ole32 winspool ksuser dwmapi mf uxtheme mfplat mfreadwrite mfuuid shlwapi) #setup_target_project(${TargetBin} Windows) diff --git a/Common/Swap.h b/Common/Swap.h index 3a5d8ac..f68142f 100644 --- a/Common/Swap.h +++ b/Common/Swap.h @@ -68,6 +68,8 @@ inline unsigned short bswap16(unsigned short x) { return _byteswap_ushort(x); } #elif defined(__DragonFly__) || defined(__FreeBSD__) || \ defined(__NetBSD__) || defined(__OpenBSD__) #include +#elif defined(__HAIKU__) +#include # ifdef __OpenBSD__ #define bswap16 swap16 #define bswap32 swap32 diff --git a/Common/Thread/ThreadUtil.cpp b/Common/Thread/ThreadUtil.cpp index 0e0badb..a380710 100644 --- a/Common/Thread/ThreadUtil.cpp +++ b/Common/Thread/ThreadUtil.cpp @@ -57,8 +57,10 @@ void RegisterAttachDetach(AttachDetachFunc attach, AttachDetachFunc detach) { #include #include #include +#ifndef __HAIKU__ #include #endif +#endif #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__) #include diff --git a/Core/Config.cpp b/Core/Config.cpp index 14a8c98..3683de8 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -360,7 +360,7 @@ static const ConfigSetting cpuSettings[] = { static int DefaultInternalResolution() { // Auto on Windows and Linux, 2x on large screens and iOS, 1x elsewhere. -#if defined(USING_WIN_UI) || defined(USING_QT_UI) +#if defined(USING_WIN_UI) || defined(USING_QT_UI) || defined(__HAIKU__) return 0; #elif PPSSPP_PLATFORM(IOS) return 2; @@ -624,7 +624,11 @@ static const ConfigSetting graphicsSettings[] = { ConfigSetting("InternalResolution", &g_Config.iInternalResolution, &DefaultInternalResolution, CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("AndroidHwScale", &g_Config.iAndroidHwScale, &DefaultAndroidHwScale, CfgFlag::DEFAULT), ConfigSetting("HighQualityDepth", &g_Config.bHighQualityDepth, true, CfgFlag::PER_GAME | CfgFlag::REPORT), +#ifdef __HAIKU__ + ConfigSetting("FrameSkip", &g_Config.iFrameSkip, 2, CfgFlag::PER_GAME | CfgFlag::REPORT), +#else ConfigSetting("FrameSkip", &g_Config.iFrameSkip, 0, CfgFlag::PER_GAME | CfgFlag::REPORT), +#endif ConfigSetting("FrameSkipType", &g_Config.iFrameSkipType, 0, CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("AutoFrameSkip", &g_Config.bAutoFrameSkip, IsVREnabled(), CfgFlag::PER_GAME | CfgFlag::REPORT), ConfigSetting("StereoRendering", &g_Config.bStereoRendering, false, CfgFlag::PER_GAME), @@ -638,10 +642,17 @@ static const ConfigSetting graphicsSettings[] = { #endif // Most low-performance (and many high performance) mobile GPUs do not support aniso anyway so defaulting to 4 is fine. +#ifdef __HAIKU__ + ConfigSetting("AnisotropyLevel", &g_Config.iAnisotropyLevel, 0, CfgFlag::PER_GAME), +#else ConfigSetting("AnisotropyLevel", &g_Config.iAnisotropyLevel, 4, CfgFlag::PER_GAME), +#endif ConfigSetting("MultiSampleLevel", &g_Config.iMultiSampleLevel, 0, CfgFlag::PER_GAME), // Number of samples is 1 << iMultiSampleLevel - +#ifdef __HAIKU__ + ConfigSetting("TextureBackoffCache", &g_Config.bTextureBackoffCache, true, CfgFlag::PER_GAME | CfgFlag::REPORT), +#else ConfigSetting("TextureBackoffCache", &g_Config.bTextureBackoffCache, false, CfgFlag::PER_GAME | CfgFlag::REPORT), +#endif ConfigSetting("VertexDecJit", &g_Config.bVertexDecoderJit, &DefaultCodeGen, CfgFlag::DONT_SAVE | CfgFlag::REPORT), #ifndef MOBILE_DEVICE diff --git a/Core/HLE/proAdhoc.cpp b/Core/HLE/proAdhoc.cpp index 759e3a9..f4bb38a 100644 --- a/Core/HLE/proAdhoc.cpp +++ b/Core/HLE/proAdhoc.cpp @@ -2086,7 +2086,7 @@ int setUDPConnReset(int udpsock, bool enabled) { return -1; } -#if !defined(TCP_KEEPIDLE) && !PPSSPP_PLATFORM(SWITCH) +#if !defined(TCP_KEEPIDLE) && !PPSSPP_PLATFORM(SWITCH) && !defined(__HAIKU__) #define TCP_KEEPIDLE TCP_KEEPALIVE //TCP_KEEPIDLE on Linux is equivalent to TCP_KEEPALIVE on macOS #endif // VS 2017 compatibility @@ -2106,12 +2106,14 @@ int setSockKeepAlive(int sock, bool keepalive, const int keepinvl, const int kee if (result == 0 && keepalive) { if (getsockopt(sock, SOL_SOCKET, SO_TYPE, (char*)&optval, (socklen_t*)&optlen) == 0 && optval == SOCK_STREAM) { optlen = sizeof(optval); +#ifndef __HAIKU__ optval = keepidle; //180 sec - setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&optval, optlen); + setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&optval, optlen); optval = keepinvl; //60 sec setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&optval, optlen); optval = keepcnt; //20 setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, (char*)&optval, optlen); +#endif } } #endif // !PPSSPP_PLATFORM(SWITCH) && !PPSSPP_PLATFORM(OPENBSD) diff --git a/Core/Instance.cpp b/Core/Instance.cpp index fcb350f..746ff83 100644 --- a/Core/Instance.cpp +++ b/Core/Instance.cpp @@ -81,7 +81,7 @@ static bool UpdateInstanceCounter(void (*callback)(volatile InstanceInfo *)) { UnmapViewOfFile(buf); return result; -#elif PPSSPP_PLATFORM(ANDROID) || defined(__LIBRETRO__) || PPSSPP_PLATFORM(SWITCH) +#elif PPSSPP_PLATFORM(ANDROID) || defined(__LIBRETRO__) || PPSSPP_PLATFORM(SWITCH) || defined(__HAIKU__) // TODO: replace shm_open & shm_unlink with ashmem or android-shmem return false; #else diff --git a/SDL/SDLMain.cpp b/SDL/SDLMain.cpp index c172f43..d537540 100644 --- a/SDL/SDLMain.cpp +++ b/SDL/SDLMain.cpp @@ -393,6 +393,9 @@ void System_LaunchUrl(LaunchUrlType urlType, const char *url) { ShellExecute(NULL, L"open", wurl.c_str(), NULL, NULL, SW_SHOWNORMAL); #elif defined(__APPLE__) OSXOpenURL(url); +#elif defined(__HAIKU__) + std::string command = std::string("open \"") + url + std::string("\""); + system(command.c_str()); #else std::string command = std::string("xdg-open ") + url; int err = system(command.c_str()); @@ -412,6 +415,9 @@ void System_LaunchUrl(LaunchUrlType urlType, const char *url) { #elif defined(__APPLE__) std::string mailToURL = std::string("mailto:") + url; OSXOpenURL(mailToURL.c_str()); +#elif defined(__HAIKU__) + std::string command = std::string("open mailto:") + url; + system(command.c_str()); #else std::string command = std::string("xdg-email ") + url; int err = system(command.c_str()); @@ -431,6 +437,8 @@ std::string System_GetProperty(SystemProperty prop) { return "SDL:Windows"; #elif __linux__ return "SDL:Linux"; +#elif __HAIKU__ + return "SDL:Haiku"; #elif __APPLE__ return "SDL:macOS"; #elif PPSSPP_PLATFORM(SWITCH) @@ -1145,6 +1153,16 @@ int main(int argc, char *argv[]) { TimeInit(); +#ifdef __HAIKU__ + char *binpath = realpath(argv[0], NULL); + if (binpath != NULL) { + char *appdir = strrchr(binpath, '/'); + *appdir = '\0'; + chdir(binpath); + free(binpath); + } +#endif + #ifdef HAVE_LIBNX socketInitializeDefault(); nxlinkStdio(); diff --git a/UI/NativeApp.cpp b/UI/NativeApp.cpp index 4c035ca..23ecbb0 100644 --- a/UI/NativeApp.cpp +++ b/UI/NativeApp.cpp @@ -486,6 +486,9 @@ void NativeInit(int argc, const char *argv[], const char *savegame_dir, const ch #elif PPSSPP_PLATFORM(SWITCH) g_Config.memStickDirectory = g_Config.internalDataDirectory / "config/ppsspp"; g_Config.flash0Directory = g_Config.internalDataDirectory / "assets/flash0"; +#elif defined(__HAIKU__) + g_Config.memStickDirectory = Path(getenv("HOME")) / "/config/settings/ppsspp/"; + g_Config.flash0Directory = File::GetExeDirectory() / "/assets/flash0/"; #elif !PPSSPP_PLATFORM(WINDOWS) std::string config; if (getenv("XDG_CONFIG_HOME") != NULL) diff --git a/cmake/Modules/FindFFmpeg.cmake b/cmake/Modules/FindFFmpeg.cmake index 648c0ba..cf5bd49 100644 --- a/cmake/Modules/FindFFmpeg.cmake +++ b/cmake/Modules/FindFFmpeg.cmake @@ -33,7 +33,6 @@ set(_FFmpeg_ALL_COMPONENTS avfilter avformat avutil - postproc swresample swscale ) @@ -42,7 +41,6 @@ set(_FFmpeg_DEPS_avcodec avutil) set(_FFmpeg_DEPS_avdevice avcodec avformat avutil) set(_FFmpeg_DEPS_avfilter avutil) set(_FFmpeg_DEPS_avformat avcodec avutil) -set(_FFmpeg_DEPS_postproc avutil) set(_FFmpeg_DEPS_swresample avutil) set(_FFmpeg_DEPS_swscale avutil) @@ -68,6 +66,8 @@ function(find_ffmpeg LIBNAME) ${FFMPEG_DIR}/include/lib${LIBNAME} ${FFMPEG_DIR}/include/ffmpeg ${FFMPEG_DIR}/include + ${FFMPEG_DIR}/headers/x86/${LIBNAME} + ${FFMPEG_DIR}/headers NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH ) @@ -75,6 +75,7 @@ function(find_ffmpeg LIBNAME) ${FFMPEG_DIR} ${FFMPEG_DIR}/lib ${FFMPEG_DIR}/lib${LIBNAME} + ${FFMPEG_DIR}/lib/x86/${LIBNAME} NO_DEFAULT_PATH NO_CMAKE_FIND_ROOT_PATH ) diff --git a/ext/CMakeLists.txt b/ext/CMakeLists.txt index b0aa7ad..f32cebc 100644 --- a/ext/CMakeLists.txt +++ b/ext/CMakeLists.txt @@ -36,7 +36,7 @@ add_subdirectory(rcheevos-build) if(NOT HTTPS_NOT_AVAILABLE) add_subdirectory(naett-build) endif() -if(USE_DISCORD AND NOT IOS AND NOT LIBRETRO) +if(USE_DISCORD AND NOT IOS AND NOT LIBRETRO AND NOT HAIKU) add_subdirectory(discord-rpc-build) endif() diff --git a/ext/armips/ext/filesystem/include/ghc/filesystem.hpp b/ext/armips/ext/filesystem/include/ghc/filesystem.hpp index 5cd76ae..0d0d5cb 100644 --- a/ext/armips/ext/filesystem/include/ghc/filesystem.hpp +++ b/ext/armips/ext/filesystem/include/ghc/filesystem.hpp @@ -51,6 +51,8 @@ #define GHC_OS_MACOS #elif defined(__linux__) #define GHC_OS_LINUX +#elif defined(__HAIKU__) +#define GHC_OS_HAIKU #if defined(__ANDROID__) #define GHC_OS_ANDROID #endif diff --git a/ext/cityhash/city.h b/ext/cityhash/city.h index 94499ce..1b80a5e 100644 --- a/ext/cityhash/city.h +++ b/ext/cityhash/city.h @@ -67,7 +67,11 @@ #include typedef uint8_t uint8; +#if defined(__HAIKU__) +#include +#else typedef uint32_t uint32; +#endif // Haiku typedef uint64_t uint64; typedef std::pair uint128; diff --git a/ext/xxhash.h b/ext/xxhash.h index aeecc38..34852f7 100644 --- a/ext/xxhash.h +++ b/ext/xxhash.h @@ -1544,6 +1544,11 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) # define XXH_ASSERT(c) ((void)0) #endif +#ifdef __HAIKU__ +#undef static_assert +#define static_assert _Static_assert +#endif + /* note: use after variable declarations */ #ifndef XXH_STATIC_ASSERT # if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* C11 */ diff --git a/ffmpeg/haiku-build.sh b/ffmpeg/haiku-build.sh new file mode 100755 index 0000000..b1934b6 --- /dev/null +++ b/ffmpeg/haiku-build.sh @@ -0,0 +1,106 @@ +#!/bin/sh + +rm -f config.h +echo "Building for Haiku" + +set -e + +ARCH=$(getarch) + +GENERAL=" + --disable-shared \ + --enable-static" + +MODULES="\ + --disable-avdevice \ + --disable-filters \ + --disable-programs \ + --disable-network \ + --disable-avfilter \ + --disable-postproc \ + --disable-encoders \ + --disable-doc \ + --disable-ffplay \ + --disable-ffprobe \ + --disable-ffserver \ + --disable-ffmpeg" + +VIDEO_DECODERS="\ + --enable-decoder=h264 \ + --enable-decoder=mpeg4 \ + --enable-decoder=h263 \ + --enable-decoder=h263p \ + --enable-decoder=mpeg2video \ + --enable-decoder=mjpeg \ + --enable-decoder=mjpegb" + +AUDIO_DECODERS="\ + --enable-decoder=aac \ + --enable-decoder=aac_latm \ + --enable-decoder=atrac3 \ + --enable-decoder=atrac3p \ + --enable-decoder=mp3 \ + --enable-decoder=pcm_s16le \ + --enable-decoder=pcm_s8" + +DEMUXERS="\ + --enable-demuxer=h264 \ + --enable-demuxer=h263 \ + --enable-demuxer=m4v \ + --enable-demuxer=mpegps \ + --enable-demuxer=mpegvideo \ + --enable-demuxer=avi \ + --enable-demuxer=mp3 \ + --enable-demuxer=aac \ + --enable-demuxer=pmp \ + --enable-demuxer=oma \ + --enable-demuxer=pcm_s16le \ + --enable-demuxer=pcm_s8 \ + --enable-demuxer=wav" + +VIDEO_ENCODERS="\ + --enable-encoder=ffv1 \ + --enable-encoder=huffyuv \ + --enable-encoder=mpeg4" + +AUDIO_ENCODERS="\ + --enable-encoder=pcm_s16le" + +MUXERS="\ + --enable-muxer=avi" + +PARSERS="\ + --enable-parser=h264 \ + --enable-parser=mpeg4video \ + --enable-parser=mpegvideo \ + --enable-parser=aac \ + --enable-parser=aac_latm \ + --enable-parser=mpegaudio" + +PROTOCOLS="\ + --enable-protocol=file" + +export LDFLAGS="-fPIC" + +./configure \ + --prefix=./haiku/${ARCH} \ + ${GENERAL} \ + --extra-cflags="-O3 -fPIC" \ + --extra-cxxflags="-O3 -fPIC" \ + --extra-ldflags="-fPIC -liconv" \ + --enable-zlib \ + --disable-yasm \ + --disable-inline-asm \ + --disable-everything \ + ${MODULES} \ + ${VIDEO_DECODERS} \ + ${AUDIO_DECODERS} \ + ${VIDEO_ENCODERS} \ + ${AUDIO_ENCODERS} \ + ${DEMUXERS} \ + ${MUXERS} \ + ${PARSERS} \ + ${PROTOCOLS} + +make clean +make install -- 2.45.2