summaryrefslogtreecommitdiff
path: root/src/CustomMemory.cpp
diff options
context:
space:
mode:
authorJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
committerJason Maskell <[email protected]>2016-05-09 10:39:54 +0200
commit79b3462799c28af8ba586349bd671b1b56e72353 (patch)
tree3b06e36c390254c0dc7f3733a0d32af213d87293 /src/CustomMemory.cpp
downloadwaveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.tar.xz
waveworks_archive-79b3462799c28af8ba586349bd671b1b56e72353.zip
Initial commit with PS4 and XBone stuff trimmed.
Diffstat (limited to 'src/CustomMemory.cpp')
-rw-r--r--src/CustomMemory.cpp120
1 files changed, 120 insertions, 0 deletions
diff --git a/src/CustomMemory.cpp b/src/CustomMemory.cpp
new file mode 100644
index 0000000..d511da1
--- /dev/null
+++ b/src/CustomMemory.cpp
@@ -0,0 +1,120 @@
+#include "Internal.h"
+#include <cstdlib>
+
+#if defined(TARGET_PLATFORM_LINUX)
+#include <malloc.h>
+#endif
+
+#if (defined(TARGET_PLATFORM_MACOSX) || defined(TARGET_PLATFORM_ANDROID))
+#define _THROW0()
+#endif
+
+#if defined(TARGET_PLATFORM_NIXLIKE)
+#if defined(TARGET_PLATFORM_MACOSX)
+namespace
+{
+ void* default_aligned_malloc(size_t size, size_t alignment)
+ {
+ void* aPtr;
+ if (posix_memalign (&aPtr, alignment, size))
+ {
+ aPtr = NULL;
+ }
+ return aPtr;
+ }
+}
+#else
+namespace
+{
+ void* default_aligned_malloc(size_t size, size_t alignment)
+ {
+ return memalign(alignment, size);
+ }
+}
+#endif
+GFSDK_WAVEWORKS_ALIGNED_MALLOC NVSDK_aligned_malloc = default_aligned_malloc;
+GFSDK_WAVEWORKS_ALIGNED_FREE NVSDK_aligned_free = free;
+#else
+GFSDK_WAVEWORKS_ALIGNED_MALLOC NVSDK_aligned_malloc = _aligned_malloc;
+GFSDK_WAVEWORKS_ALIGNED_FREE NVSDK_aligned_free = _aligned_free;
+#endif
+
+#if defined(TARGET_PLATFORM_PS4)
+namespace
+{
+ void* malloc_wrapper(size_t size)
+ {
+ return NVSDK_aligned_malloc(size, 8);
+ }
+
+ void free_wrapper(void* ptr)
+ {
+ NVSDK_aligned_free(ptr);
+ }
+}
+
+GFSDK_WAVEWORKS_MALLOC NVSDK_malloc = malloc_wrapper; // never changes
+GFSDK_WAVEWORKS_FREE NVSDK_free = free_wrapper; // never changes
+GFSDK_WAVEWORKS_ALIGNED_MALLOC NVSDK_garlic_malloc = default_aligned_malloc;
+GFSDK_WAVEWORKS_ALIGNED_FREE NVSDK_garlic_free = free;
+#define DELETE_THROWSPEC() _THROW0()
+#else
+GFSDK_WAVEWORKS_MALLOC NVSDK_malloc = malloc;
+GFSDK_WAVEWORKS_FREE NVSDK_free = free;
+#define DELETE_THROWSPEC() _THROW0()
+#endif
+
+void* internalMalloc( size_t size )
+{
+ void* p = NVSDK_malloc( size );
+ if( !p )
+ diagnostic_message( TEXT("WaveWorks: MEMORY ALLOCATION ERROR. Check memory allocation callback pointer\n") );
+ return p;
+}
+
+void internalFree( void* p )
+{
+ NVSDK_free( p );
+}
+
+
+void* __CRTDECL operator new(size_t size)
+{
+ return internalMalloc( size );
+}
+void __CRTDECL operator delete(void *p) DELETE_THROWSPEC()
+{
+ internalFree( p );
+}
+
+void * __CRTDECL operator new[](size_t size)
+{
+ return internalMalloc( size );
+}
+
+void __CRTDECL operator delete[](void *p) DELETE_THROWSPEC()
+{
+ internalFree( p );
+}
+
+void resetMemoryManagementCallbacksToDefaults()
+{
+#if defined(TARGET_PLATFORM_PS4)
+ NVSDK_aligned_malloc = default_aligned_malloc;
+ NVSDK_aligned_free = free;
+ NVSDK_garlic_malloc = default_aligned_malloc;
+ NVSDK_garlic_free = free;
+#elif defined(TARGET_PLATFORM_NIXLIKE)
+ NVSDK_malloc = malloc;
+ NVSDK_free = free;
+ NVSDK_aligned_malloc = default_aligned_malloc;
+ NVSDK_aligned_free = free;
+#else
+ NVSDK_malloc = malloc;
+ NVSDK_free = free;
+ NVSDK_aligned_malloc = _aligned_malloc;
+ NVSDK_aligned_free = _aligned_free;
+#endif
+}
+
+