From 9e21ad7092268fcf5cdb2c6c5da349080b6a2043 Mon Sep 17 00:00:00 2001 From: Nico de Poel Date: Tue, 25 Jan 2022 19:20:32 +0100 Subject: [PATCH] Added fully native memory allocation functions that are passed directly to EOS without any P/Invoke in-between. This makes EOS work on PS4 & PS5 without causing thread semaphore crashes in Unity. --- Assets/Plugins/PS5.meta | 8 +++++++ Assets/Plugins/PS5/PS5Utils.prx | Bin 0 -> 77008 bytes Assets/Plugins/PS5/PS5Utils.prx.meta | 32 +++++++++++++++++++++++++++ Assets/Scripts/EOSNativeHelper.cs | 28 +++++++++++------------ Assets/Scripts/EpicVoiceChatTest.cs | 18 ++++++++++----- 5 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 Assets/Plugins/PS5.meta create mode 100644 Assets/Plugins/PS5/PS5Utils.prx create mode 100644 Assets/Plugins/PS5/PS5Utils.prx.meta diff --git a/Assets/Plugins/PS5.meta b/Assets/Plugins/PS5.meta new file mode 100644 index 0000000..5991894 --- /dev/null +++ b/Assets/Plugins/PS5.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0677463dddd99144083c9a34be65a720 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/PS5/PS5Utils.prx b/Assets/Plugins/PS5/PS5Utils.prx new file mode 100644 index 0000000000000000000000000000000000000000..831cccab3b4e47b4ce396f284bfd5e24b380c762 GIT binary patch literal 77008 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 literal 0 HcmV?d00001 diff --git a/Assets/Plugins/PS5/PS5Utils.prx.meta b/Assets/Plugins/PS5/PS5Utils.prx.meta new file mode 100644 index 0000000..b640be5 --- /dev/null +++ b/Assets/Plugins/PS5/PS5Utils.prx.meta @@ -0,0 +1,32 @@ +fileFormatVersion: 2 +guid: 43fd785f2224f2745a11794c21b7e30c +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 0 + settings: + DefaultValueInitialized: true + - first: + PS5: PS5 + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/EOSNativeHelper.cs b/Assets/Scripts/EOSNativeHelper.cs index 80c8fbb..7f8265d 100644 --- a/Assets/Scripts/EOSNativeHelper.cs +++ b/Assets/Scripts/EOSNativeHelper.cs @@ -3,6 +3,7 @@ using System.IO; using System.Runtime.InteropServices; using AOT; using Epic.OnlineServices; +using Epic.OnlineServices.Platform; public static class EOSNativeHelper { @@ -28,29 +29,24 @@ public static class EOSNativeHelper [DllImport("kernel32")] public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName); -#endif - [UnmanagedFunctionPointer(Config.LibraryCallingConvention)] - public delegate IntPtr AllocateMemoryFunc(IntPtr size, IntPtr alignment); +#else [MonoPInvokeCallback(typeof(AllocateMemoryFunc))] - public static IntPtr AllocateMemory(IntPtr size, IntPtr alignment) + public static IntPtr AllocateMemory(UIntPtr size, UIntPtr alignment) { - return Marshal.AllocHGlobal(size); + return Marshal.AllocHGlobal((IntPtr)size.ToUInt64()); //return HeapAlloc(GetProcessHeap(), 0, size); } - - [UnmanagedFunctionPointer(Config.LibraryCallingConvention)] - public delegate IntPtr ReallocateMemoryFunc(IntPtr pointer, IntPtr size, IntPtr alignment); [MonoPInvokeCallback(typeof(ReallocateMemoryFunc))] - public static IntPtr ReallocateMemory(IntPtr pointer, IntPtr size, IntPtr alignment) + public static IntPtr ReallocateMemory(IntPtr pointer, UIntPtr size, UIntPtr alignment) { // EOS will sometimes request a reallocation for a null pointer, so we need to specifically handle that if (pointer == IntPtr.Zero) - return Marshal.AllocHGlobal(size); + return Marshal.AllocHGlobal((IntPtr)size.ToUInt64()); - return Marshal.ReAllocHGlobal(pointer, size); + return Marshal.ReAllocHGlobal(pointer, (IntPtr)size.ToUInt64()); // if (pointer == IntPtr.Zero) // return HeapAlloc(GetProcessHeap(), 0, size); @@ -58,9 +54,6 @@ public static class EOSNativeHelper // return HeapReAlloc(GetProcessHeap(), 0, pointer, size); } - [UnmanagedFunctionPointer(Config.LibraryCallingConvention)] - public delegate void ReleaseMemoryFunc(IntPtr pointer); - [MonoPInvokeCallback(typeof(ReleaseMemoryFunc))] public static void ReleaseMemory(IntPtr pointer) { @@ -80,4 +73,11 @@ public static class EOSNativeHelper [DllImport("kernel32")] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool HeapFree(IntPtr hHeap, int dwFlags, IntPtr lpMem); + +#endif + +#if UNITY_PS4 || UNITY_PS5 + [DllImport("PS5Utils.prx")] + public static extern void GetMemoryFunctions(out IntPtr allocFunc, out IntPtr reallocFunc, out IntPtr releaseFunc); +#endif } diff --git a/Assets/Scripts/EpicVoiceChatTest.cs b/Assets/Scripts/EpicVoiceChatTest.cs index 3ac7c26..138c522 100644 --- a/Assets/Scripts/EpicVoiceChatTest.cs +++ b/Assets/Scripts/EpicVoiceChatTest.cs @@ -121,19 +121,27 @@ public class EpicVoiceChatTest : MonoBehaviour // This delay is just here to give us some time to connect the debugger yield return new WaitForSeconds(5f); #endif + +#if UNITY_PS4 || UNITY_PS5 + EOSNativeHelper.GetMemoryFunctions(out var allocFunc, out var reallocFunc, out var releaseFunc); +#endif var result = PlatformInterface.Initialize(new InitializeOptions { ProductName = "WW1Test", ProductVersion = "1.0.0.0", -#if UNITY_GAMECORE || UNITY_PS4 || UNITY_PS5 +#if UNITY_GAMECORE // EOS SDK on Game Core will not initialize without these memory management function pointers - AllocateMemoryFunction = Marshal.GetFunctionPointerForDelegate((EOSNativeHelper.AllocateMemoryFunc)EOSNativeHelper.AllocateMemory), - ReallocateMemoryFunction = Marshal.GetFunctionPointerForDelegate((EOSNativeHelper.ReallocateMemoryFunc)EOSNativeHelper.ReallocateMemory), - ReleaseMemoryFunction = Marshal.GetFunctionPointerForDelegate((EOSNativeHelper.ReleaseMemoryFunc)EOSNativeHelper.ReleaseMemory), + AllocateMemoryFunction = Marshal.GetFunctionPointerForDelegate((AllocateMemoryFunc)EOSNativeHelper.AllocateMemory), + ReallocateMemoryFunction = Marshal.GetFunctionPointerForDelegate((ReallocateMemoryFunc)EOSNativeHelper.ReallocateMemory), + ReleaseMemoryFunction = Marshal.GetFunctionPointerForDelegate((ReleaseMemoryFunc)EOSNativeHelper.ReleaseMemory), +#elif UNITY_PS4 || UNITY_PS5 + AllocateMemoryFunction = allocFunc, + ReallocateMemoryFunction = reallocFunc, + ReleaseMemoryFunction = releaseFunc, #endif }); - + if (result != Result.Success) { Debug.LogError("Failed to initialize EOS, result = " + result);