Files
haikuports/games-emulation/ppsspp/patches/ppsspp-1.18.1.patchset
Gerasim Troeglazov 832d86af6c ppsspp: bump version
2025-01-25 23:09:18 +10:00

502 lines
16 KiB
Plaintext

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 <sys/endian.h>
+#elif defined(__HAIKU__)
+#include <endian.h>
# 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 <pthread.h>
#include <sys/types.h>
#include <unistd.h>
+#ifndef __HAIKU__
#include <sys/syscall.h>
#endif
+#endif
#if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#include <pthread_np.h>
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 <utility>
typedef uint8_t uint8;
+#if defined(__HAIKU__)
+#include <SupportDefs.h>
+#else
typedef uint32_t uint32;
+#endif // Haiku
typedef uint64_t uint64;
typedef std::pair<uint64, uint64> 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