From 64cfab5b46de082984c2568d8ef834e003ef9275 Mon Sep 17 00:00:00 2001 From: Andreas Schroeder Date: Tue, 29 Apr 2014 00:51:49 +0200 Subject: [PATCH 1/5] Mac OSX: fix includes & add missing functionality --- Utilities/GNU.cpp | 9 +++++++++ Utilities/GNU.h | 26 ++++++++++++++++++++++++++ rpcs3/CMakeLists.txt | 13 +++++++++++-- rpcs3/Emu/GS/GL/OpenGL.h | 7 +++++-- rpcs3/rpcs3.cpp | 2 ++ stblib/stb_truetype.h | 2 ++ 6 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 Utilities/GNU.cpp diff --git a/Utilities/GNU.cpp b/Utilities/GNU.cpp new file mode 100644 index 0000000000..fec72a632f --- /dev/null +++ b/Utilities/GNU.cpp @@ -0,0 +1,9 @@ +#include "GNU.h" + +#ifdef __APPLE__ +void * _aligned_malloc(size_t size, size_t alignment) { + void *buffer; + posix_memalign(&buffer, alignment, size); + return buffer; +} +#endif diff --git a/Utilities/GNU.h b/Utilities/GNU.h index 9d0ba8abb2..46fa6faf35 100644 --- a/Utilities/GNU.h +++ b/Utilities/GNU.h @@ -3,7 +3,10 @@ #if defined(__GNUG__) #include #include + +#ifndef __APPLE__ #include +#endif #define _fpclass(x) std::fpclassify(x) #define __forceinline __attribute__((always_inline)) @@ -16,8 +19,31 @@ #define _CRT_ALIGN(x) __attribute__((aligned(x))) #define InterlockedCompareExchange(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val) #define InterlockedCompareExchange64(ptr,new_val,old_val) __sync_val_compare_and_swap(ptr,old_val,new_val) + +#ifndef __APPLE__ #define _aligned_malloc(size,alignment) memalign(alignment,size) +#else +void * _aligned_malloc(size_t size, size_t alignment); +#define wxIsNaN(x) ((x) != (x)) +#endif + #define _aligned_free free + +#ifndef CLOCK_MONOTONIC +#define CLOCK_MONOTONIC 0 +#include +#include + +static int clock_gettime(int foo, struct timespec *ts) { + struct timeval tv; + + gettimeofday(&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; + return (0); +} +#endif /* !CLOCK_MONOTONIC */ + #define DWORD int32_t #endif diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 68ef012f69..b928cf46e2 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -42,9 +42,17 @@ find_package(OpenAL REQUIRED) include("${wxWidgets_USE_FILE}") if(CMAKE_SIZEOF_VOID_P EQUAL 8) - set(PLATFORM_ARCH "linux/x86_64") + if(LINUX) + set(PLATFORM_ARCH "linux/x86_64") + elseif(APPLE) + set(PLATFORM_ARCH "macosx/x86_64") + endif() else() - set(PLATFORM_ARCH "linux/x86") + if(LINUX) + set(PLATFORM_ARCH "linux/x86") + elseif(APPLE) + set(PLATFORM_ARCH "macosx/x86") + endif() endif() include_directories( @@ -72,6 +80,7 @@ GLOB_RECURSE RPCS3_SRC "${RPCS3_SRC_DIR}/rpcs3.cpp" "${RPCS3_SRC_DIR}/Ini.cpp" +"${RPCS3_SRC_DIR}/../Utilities/GNU.cpp" "${RPCS3_SRC_DIR}/Emu/*" "${RPCS3_SRC_DIR}/Gui/*" "${RPCS3_SRC_DIR}/Loader/*" diff --git a/rpcs3/Emu/GS/GL/OpenGL.h b/rpcs3/Emu/GS/GL/OpenGL.h index 2288c8ce02..fb8cbdfb16 100644 --- a/rpcs3/Emu/GS/GL/OpenGL.h +++ b/rpcs3/Emu/GS/GL/OpenGL.h @@ -2,8 +2,6 @@ #ifndef _WIN32 #include #endif -#include -#include "GL/glext.h" #ifdef _WIN32 typedef BOOL (WINAPI* PFNWGLSWAPINTERVALEXTPROC) (int interval); @@ -14,7 +12,12 @@ typedef BOOL (WINAPI* PFNWGLSWAPINTERVALEXTPROC) (int interval); #undef OPENGL_PROC #undef OPENGL_PROC2 +#elif __APPLE__ +#include +#include + #else +#include #include #include #endif diff --git a/rpcs3/rpcs3.cpp b/rpcs3/rpcs3.cpp index 3bf28ccc5e..28bed7caf8 100644 --- a/rpcs3/rpcs3.cpp +++ b/rpcs3/rpcs3.cpp @@ -73,8 +73,10 @@ void Rpcs3App::SendDbgCommand(DbgCommand id, CPUThread* thr) Rpcs3App::Rpcs3App() { #ifdef __UNIX__ + #ifndef __APPLE__ XInitThreads(); #endif + #endif } /* CPUThread& GetCPU(const u8 core) diff --git a/stblib/stb_truetype.h b/stblib/stb_truetype.h index 94f27df15e..e453f024e3 100644 --- a/stblib/stb_truetype.h +++ b/stblib/stb_truetype.h @@ -366,7 +366,9 @@ int main(int arg, char **argv) // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h #ifndef STBTT_malloc + #ifndef __APPLE__ #include + #endif #define STBTT_malloc(x,u) malloc(x) #define STBTT_free(x,u) free(x) #endif From e7f0efa56d358acdc3d7eb865a6774e61fa827a1 Mon Sep 17 00:00:00 2001 From: Andreas Schroeder Date: Tue, 29 Apr 2014 00:54:33 +0200 Subject: [PATCH 2/5] Mac OSX: use __thread for thread-local storage --- Utilities/SMutex.cpp | 2 ++ Utilities/Thread.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Utilities/SMutex.cpp b/Utilities/SMutex.cpp index 541d20b276..06820a7afa 100644 --- a/Utilities/SMutex.cpp +++ b/Utilities/SMutex.cpp @@ -8,6 +8,8 @@ __forceinline void SM_Sleep() #ifdef _WIN32 __declspec(thread) +#elif __APPLE__ +__thread #else thread_local #endif diff --git a/Utilities/Thread.cpp b/Utilities/Thread.cpp index 940e6b94e9..6ad547bfff 100644 --- a/Utilities/Thread.cpp +++ b/Utilities/Thread.cpp @@ -3,6 +3,8 @@ #ifdef _WIN32 __declspec(thread) +#elif __APPLE__ +__thread #else thread_local #endif From 22a90a0907b98d8cab49675d8a2425d81fd390f2 Mon Sep 17 00:00:00 2001 From: Andreas Schroeder Date: Tue, 29 Apr 2014 19:55:03 +0200 Subject: [PATCH 3/5] add info for Mac OSX --- README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bc4e796f27..9a453b09b7 100644 --- a/README.md +++ b/README.md @@ -22,10 +22,15 @@ __Windows__ __Linux__ * Debian & Ubuntu: `sudo apt-get install libopenal-dev libwxgtk3.0-dev build-essential` +__Mac OSX__ +* Install with Homebrew: `brew install glew wxwidgets` +* Remove '-framework QuickTime' from '_ldflags' in /usr/local/bin/wx-config + ### Building To initialize the repository don't forget to execute `git submodule update --init` to pull the wxWidgets source. * __Windows__: Install *Visual Studio 2013*. Then open the *.SLN* file, and press *Build* > *Rebuild Solution*. -* __Linux__: +* __Linux & Mac OSX__: `cd rpcs3 && cmake CMakeLists.txt && make && cd ../` Then run with `cd bin && ./rpcs3` + From ebe20a08251aa4dc48b0f9ef2c144681679f4dd2 Mon Sep 17 00:00:00 2001 From: Andreas Schroeder Date: Tue, 29 Apr 2014 22:10:42 +0200 Subject: [PATCH 4/5] move clock_gettime() into GNU.cpp --- Utilities/GNU.cpp | 13 ++++++++++++- Utilities/GNU.h | 19 +++++-------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/Utilities/GNU.cpp b/Utilities/GNU.cpp index fec72a632f..bb0a784fe7 100644 --- a/Utilities/GNU.cpp +++ b/Utilities/GNU.cpp @@ -1,3 +1,5 @@ +#include +#include #include "GNU.h" #ifdef __APPLE__ @@ -6,4 +8,13 @@ void * _aligned_malloc(size_t size, size_t alignment) { posix_memalign(&buffer, alignment, size); return buffer; } -#endif + +int clock_gettime(int foo, struct timespec *ts) { + struct timeval tv; + + gettimeofday(&tv, NULL); + ts->tv_sec = tv.tv_sec; + ts->tv_nsec = tv.tv_usec * 1000; + return(0); +} +#endif /* !__APPLE__ */ diff --git a/Utilities/GNU.h b/Utilities/GNU.h index 46fa6faf35..f5324c5cfe 100644 --- a/Utilities/GNU.h +++ b/Utilities/GNU.h @@ -24,26 +24,17 @@ #define _aligned_malloc(size,alignment) memalign(alignment,size) #else void * _aligned_malloc(size_t size, size_t alignment); +int clock_gettime(int foo, struct timespec *ts); #define wxIsNaN(x) ((x) != (x)) -#endif - -#define _aligned_free free #ifndef CLOCK_MONOTONIC #define CLOCK_MONOTONIC 0 -#include -#include - -static int clock_gettime(int foo, struct timespec *ts) { - struct timeval tv; - - gettimeofday(&tv, NULL); - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; - return (0); -} #endif /* !CLOCK_MONOTONIC */ +#endif /* !__APPLE__ */ + +#define _aligned_free free + #define DWORD int32_t #endif From 11ca1316077f8520508b39897a9e70b15214d2ed Mon Sep 17 00:00:00 2001 From: Andreas Schroeder Date: Wed, 30 Apr 2014 00:58:57 +0200 Subject: [PATCH 5/5] detect Mac OSX and Windows, fall back to Linux --- rpcs3/CMakeLists.txt | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index b928cf46e2..7ad4795be7 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -42,16 +42,20 @@ find_package(OpenAL REQUIRED) include("${wxWidgets_USE_FILE}") if(CMAKE_SIZEOF_VOID_P EQUAL 8) - if(LINUX) - set(PLATFORM_ARCH "linux/x86_64") - elseif(APPLE) + if(APPLE) set(PLATFORM_ARCH "macosx/x86_64") + elseif(WIN32) + set(PLATFORM_ARCH "Windows/x86_64") + else() + set(PLATFORM_ARCH "linux/x86_64") endif() else() - if(LINUX) - set(PLATFORM_ARCH "linux/x86") - elseif(APPLE) + if(APPLE) set(PLATFORM_ARCH "macosx/x86") + elseif(WIN32) + set(PLATFORM_ARCH "Windows/x86") + else() + set(PLATFORM_ARCH "linux/x86") endif() endif()