redox/recipes/emulators/flycast/redox.patch
2026-05-09 07:06:50 +02:00

288 lines
9.6 KiB
Diff

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 87bc605..e878607 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -197,7 +197,7 @@ if(NINTENDO_SWITCH)
endif()
if(NOT LIBRETRO)
- if((WIN32 AND NOT MSVC) OR (UNIX AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|OpenBSD|NetBSD)"))
+ if((WIN32 AND NOT MSVC) OR (UNIX AND NOT APPLE AND NOT CMAKE_SYSTEM_NAME MATCHES "(FreeBSD|OpenBSD|NetBSD)" AND NOT REDOX))
add_subdirectory(core/deps/breakpad)
if(WIN32)
target_link_options(${PROJECT_NAME} PRIVATE "-Wl,--build-id")
@@ -355,7 +355,10 @@ if(NOT LIBRETRO)
if(NOT APPLE)
find_package(SDL2)
endif()
- if(NOT SDL2_FOUND)
+ if(REDOX)
+ target_link_libraries(${PROJECT_NAME} PRIVATE "$ENV{SDL_LIBS}")
+ set(SDL2_FOUND 1)
+ elseif(NOT SDL2_FOUND)
add_subdirectory(core/deps/SDL EXCLUDE_FROM_ALL)
set(SDL2_FOUND 1)
endif()
@@ -482,8 +485,10 @@ if(UNIX AND NOT APPLE AND NOT ANDROID)
target_link_libraries(${PROJECT_NAME} PRIVATE ${GLES3_LIBRARIES})
elseif(USE_OPENGL)
set(OpenGL_GL_PREFERENCE LEGACY)
- find_package(OpenGL REQUIRED)
- target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL)
+ if(NOT REDOX)
+ find_package(OpenGL REQUIRED)
+ target_link_libraries(${PROJECT_NAME} PRIVATE OpenGL::GL)
+ endif()
endif()
find_package(Threads REQUIRED)
@@ -533,7 +538,7 @@ target_sources(${PROJECT_NAME} PRIVATE
target_include_directories(${PROJECT_NAME} PRIVATE core/deps/nowide/include)
if(NOT MINIUPNP_FOUND)
- if(NINTENDO_SWITCH)
+ if(NINTENDO_SWITCH OR REDOX)
target_compile_definitions(${PROJECT_NAME} PRIVATE FEAT_NO_MINIUPNPC)
else()
option(UPNPC_BUILD_SHARED "Build shared library" OFF)
diff --git a/core/build.h b/core/build.h
index a8560f7..1d6a4dd 100755
--- a/core/build.h
+++ b/core/build.h
@@ -227,6 +227,9 @@
#endif
#endif
+#if defined(__redox__)
+#define TARGET_NO_EXCEPTIONS
+#endif
#if !defined(LIBRETRO) && !defined(TARGET_NO_EXCEPTIONS)
#define USE_GGPO
diff --git a/core/deps/libzip/lib/zip_name_locate.c b/core/deps/libzip/lib/zip_name_locate.c
index 308d843..f07fd20 100644
--- a/core/deps/libzip/lib/zip_name_locate.c
+++ b/core/deps/libzip/lib/zip_name_locate.c
@@ -32,6 +32,7 @@
*/
+#include <config.h>
#include <string.h>
#ifdef HAVE_STRINGS_H
#include <strings.h>
diff --git a/core/deps/nowide/include/nowide/convert.hpp b/core/deps/nowide/include/nowide/convert.hpp
index 9c234f7..24d807e 100644
--- a/core/deps/nowide/include/nowide/convert.hpp
+++ b/core/deps/nowide/include/nowide/convert.hpp
@@ -118,6 +118,7 @@ namespace nowide {
{
return nowide::conv::utf_to_utf<char>(s);
}
+#if !defined(__redox__)
///
/// Convert between UTF-8 and UTF-16 string, implemented only on Windows platform
///
@@ -145,7 +146,7 @@ namespace nowide {
{
return nowide::conv::utf_to_utf<wchar_t>(s);
}
-
+#endif
} // nowide
diff --git a/core/hw/sh4/modules/serial.cpp b/core/hw/sh4/modules/serial.cpp
index 1a7689e..b23bf1b 100644
--- a/core/hw/sh4/modules/serial.cpp
+++ b/core/hw/sh4/modules/serial.cpp
@@ -164,7 +164,7 @@ struct PTYPipe : public SerialPipe
void init()
{
-#if defined(__unix__) || defined(__APPLE__)
+#if (defined(__unix__) || defined(__APPLE__)) && !defined(__redox__)
if (config::SerialConsole && config::SerialPTY && tty == 1)
{
tty = open("/dev/ptmx", O_RDWR | O_NDELAY | O_NOCTTY | O_NONBLOCK);
diff --git a/core/khronos/GL4/gl3w.c b/core/khronos/GL4/gl3w.c
index 661dc1c..f8b6374 100644
--- a/core/khronos/GL4/gl3w.c
+++ b/core/khronos/GL4/gl3w.c
@@ -107,6 +107,26 @@ static GL3WglProc get_proc(const char *proc)
{
return (GL3WglProc)eglGetProcAddress(proc);
}
+#elif defined(__redox__)
+#include <SDL.h>
+
+static int open_libgl(void)
+{
+ if (SDL_GL_LoadLibrary(NULL) < 0)
+ return GL3W_ERROR_LIBRARY_OPEN;
+
+ return GL3W_OK;
+}
+
+static void close_libgl(void)
+{
+ SDL_GL_UnloadLibrary();
+}
+
+static GL3WglProc get_proc(const char *proc)
+{
+ return (GL3WglProc)SDL_GL_GetProcAddress(proc);
+}
#else
#include <dlfcn.h>
diff --git a/core/linux-dist/main.cpp b/core/linux-dist/main.cpp
index 365482a..2e16071 100644
--- a/core/linux-dist/main.cpp
+++ b/core/linux-dist/main.cpp
@@ -3,7 +3,7 @@
#endif
#include "types.h"
-#if defined(__unix__) || defined(__SWITCH__)
+#if defined(__unix__) || defined(__SWITCH__) || defined(__redox__)
#include "hw/sh4/dyna/blockmanager.h"
#include "log/LogManager.h"
#include "emulator.h"
diff --git a/core/linux/posix_vmem.cpp b/core/linux/posix_vmem.cpp
index a2ab3c7..d503eb7 100644
--- a/core/linux/posix_vmem.cpp
+++ b/core/linux/posix_vmem.cpp
@@ -120,7 +120,7 @@ static int allocate_shared_filemem(unsigned size) {
// Use Android's specific shmem stuff.
fd = ashmem_create_region("RAM", size);
#else
- #if !defined(__APPLE__)
+ #if !defined(__APPLE__) && !defined(__redox__)
fd = shm_open("/dcnzorz_mem", O_CREAT | O_EXCL | O_RDWR, S_IREAD | S_IWRITE);
shm_unlink("/dcnzorz_mem");
#endif
@@ -216,6 +216,7 @@ void vmem_platform_destroy()
void vmem_platform_reset_mem(void *ptr, unsigned size_bytes) {
// Mark them as non accessible.
mprotect(ptr, size_bytes, PROT_NONE);
+ #if !defined(__redox__)
// Tell the kernel to flush'em all (FIXME: perhaps unmap+mmap 'd be better?)
madvise(ptr, size_bytes, MADV_DONTNEED);
#if defined(MADV_REMOVE)
@@ -223,6 +224,7 @@ void vmem_platform_reset_mem(void *ptr, unsigned size_bytes) {
#elif defined(MADV_FREE)
madvise(ptr, size_bytes, MADV_FREE);
#endif
+ #endif
}
// Allocates a bunch of memory (page aligned and page-sized)
diff --git a/core/log/StringUtil.h b/core/log/StringUtil.h
index b14a9a6..cd942e7 100644
--- a/core/log/StringUtil.h
+++ b/core/log/StringUtil.h
@@ -24,7 +24,7 @@ int vasprintf(char **s, const char *fmt, va_list ap)
}
#endif
-#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__)
+#if !defined(_WIN32) && !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__) && !defined(__redox__)
static locale_t GetCLocale()
{
static locale_t c_locale = newlocale(LC_ALL_MASK, "C", nullptr);
@@ -69,11 +69,11 @@ bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list ar
writtenCount = vsnprintf(out, outsize, format, args);
#endif
#else
-#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__)
+#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__) && !defined(__redox__)
locale_t previousLocale = uselocale(GetCLocale());
#endif
writtenCount = vsnprintf(out, outsize, format, args);
-#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__)
+#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__) && !defined(__redox__)
uselocale(previousLocale);
#endif
#endif
@@ -101,7 +101,7 @@ std::string StringFromFormatV(const char* format, va_list args)
std::string temp = buf;
delete[] buf;
#else
-#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__)
+#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__) && !defined(__redox__)
locale_t previousLocale = uselocale(GetCLocale());
#endif
if (vasprintf(&buf, format, args) < 0)
@@ -110,7 +110,7 @@ std::string StringFromFormatV(const char* format, va_list args)
buf = nullptr;
}
-#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__)
+#if !defined(__ANDROID__) && !defined(__HAIKU__) && !defined(__OpenBSD__) && !defined(__SWITCH__) && !defined(__redox__)
uselocale(previousLocale);
#endif
diff --git a/core/network/dns.cpp b/core/network/dns.cpp
index af98bfc..423773c 100644
--- a/core/network/dns.cpp
+++ b/core/network/dns.cpp
@@ -148,7 +148,7 @@ char *read_name(char *reader, char *buffer, int *count)
return name;
}
-#if !defined(_WIN32) && !defined(__SWITCH__)
+#if !defined(_WIN32) && !defined(__SWITCH__) && !defined(__redox__)
#include <ifaddrs.h>
#include <net/if.h>
#endif
@@ -195,7 +195,7 @@ bool is_local_address(u32 addr)
}
closesocket(sd);
-#elif defined(__SWITCH__)
+#elif defined(__SWITCH__) || defined(__redox__)
// TODO
#else // !_WIN32 && !__SWITCH__
diff --git a/core/network/net_platform.h b/core/network/net_platform.h
index 9c6af69..fc6bd45 100644
--- a/core/network/net_platform.h
+++ b/core/network/net_platform.h
@@ -89,7 +89,7 @@ static inline void set_tcp_nodelay(sock_t fd)
#if defined(_WIN32)
struct protoent *tcp_proto = getprotobyname("TCP");
setsockopt(fd, tcp_proto->p_proto, TCP_NODELAY, (const char *)&optval, optlen);
-#elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__NetBSD__)
+#elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__redox__)
setsockopt(fd, SOL_TCP, TCP_NODELAY, (const void *)&optval, optlen);
#else
struct protoent *tcp_proto = getprotobyname("TCP");
diff --git a/core/rend/TexCache.cpp b/core/rend/TexCache.cpp
index 6654a39..dbc1577 100644
--- a/core/rend/TexCache.cpp
+++ b/core/rend/TexCache.cpp
@@ -783,7 +783,10 @@ void BaseTextureCacheData::Update()
height = original_h;
//lock the texture to detect changes in it
+// TODO: No SIGSEGV handler on redox
+#if !defined(__redox__)
protectVRam();
+#endif
UploadToGPU(upscaled_w, upscaled_h, (const u8 *)temp_tex_buffer, IsMipmapped(), mipmapped);
if (config::DumpTextures)
diff --git a/core/types.h b/core/types.h
index d2ea162..3fa816e 100644
--- a/core/types.h
+++ b/core/types.h
@@ -169,6 +169,7 @@ inline static void JITWriteProtect(bool enabled) {
//includes from c++rt
#include <vector>
#include <string>
+#include <strings.h>
#include <map>
#include <stdexcept>