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 #include #ifdef HAVE_STRINGS_H #include 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(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(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 + +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 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 #include #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 #include +#include #include #include