diff --git a/r5dev/engine/cmodel_bsp.cpp b/r5dev/engine/cmodel_bsp.cpp index 1a2b5a87..4f6cbc4e 100644 --- a/r5dev/engine/cmodel_bsp.cpp +++ b/r5dev/engine/cmodel_bsp.cpp @@ -338,13 +338,13 @@ void Mod_ProcessPakQueue() Mod_PreloadLevelPaks(s_svLevelName.c_str()); s_bLevelResourceInitialized = true; } - *(_DWORD*)v15 = g_pakLoadApi->LoadAsync(v17, g_pAlignedMemAlloc, 4, 0); + *(_DWORD*)v15 = g_pakLoadApi->LoadAsync(v17, AlignedMemAlloc(), 4, 0); if (strcmp(v17, "common_mp.rpak") == 0 || strcmp(v17, "common_sp.rpak") == 0 || strcmp(v17, "common_pve.rpak") == 0) - g_pakLoadApi->LoadAsync("common_sdk.rpak", g_pAlignedMemAlloc, 4, 0); + g_pakLoadApi->LoadAsync("common_sdk.rpak", AlignedMemAlloc(), 4, 0); #ifndef DEDICATED if (strcmp(v17, "ui_mp.rpak") == 0) - g_pakLoadApi->LoadAsync("ui_sdk.rpak", g_pAlignedMemAlloc, 4, 0); + g_pakLoadApi->LoadAsync("ui_sdk.rpak", AlignedMemAlloc(), 4, 0); #endif // !DEDICATED LABEL_37: @@ -429,7 +429,7 @@ void Mod_PreloadLevelPaks(const char* pszLevelName) continue; snprintf(szPathBuffer, sizeof(szPathBuffer), "%s.rpak", pSubKey->GetName()); - RPakHandle_t nPakId = g_pakLoadApi->LoadAsync(szPathBuffer, g_pAlignedMemAlloc, 4, 0); + RPakHandle_t nPakId = g_pakLoadApi->LoadAsync(szPathBuffer, AlignedMemAlloc(), 4, 0); if (nPakId == INVALID_PAK_HANDLE) Error(eDLL_T::ENGINE, NO_ERROR, "%s: unable to load pak '%s' results '%d'\n", __FUNCTION__, szPathBuffer, nPakId); diff --git a/r5dev/public/tier0/tslist.h b/r5dev/public/tier0/tslist.h index 776f9028..7342f90f 100644 --- a/r5dev/public/tier0/tslist.h +++ b/r5dev/public/tier0/tslist.h @@ -1,14 +1,29 @@ #ifndef TSLIST_H #define TSLIST_H +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- class CAlignedMemAlloc { public: - virtual void* Alloc(size_t nSize) = 0; - virtual void Free(void* pMem) = 0; + void* Alloc(size_t nSize, size_t nAlignment = 0); + void Free(void* pMem); + +private: + void* m_pAllocCallback; + void* m_pFreeCallback; }; -inline CAlignedMemAlloc* g_pAlignedMemAlloc; +extern CAlignedMemAlloc* g_pAlignedMemAlloc; + +//----------------------------------------------------------------------------- +// Singleton aligned memalloc +//----------------------------------------------------------------------------- +inline CAlignedMemAlloc* AlignedMemAlloc() +{ + return g_pAlignedMemAlloc; +} /////////////////////////////////////////////////////////////////////////////// class VTSListBase : public IDetour diff --git a/r5dev/rtech/rtech_game.h b/r5dev/rtech/rtech_game.h index db8f10d0..ecb3b7f8 100644 --- a/r5dev/rtech/rtech_game.h +++ b/r5dev/rtech/rtech_game.h @@ -39,7 +39,7 @@ inline CMemory p_CPakFile_OpenFileOffset; // Offset to inlined 'CPakFile::LoadPa class CPakFile { public: - static RPakHandle_t LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc = g_pAlignedMemAlloc, int nIdx = NULL, bool bUnk = false); + static RPakHandle_t LoadAsync(const char* szPakFileName, CAlignedMemAlloc* pMalloc = AlignedMemAlloc(), int nIdx = NULL, bool bUnk = false); static void UnloadPak(RPakHandle_t handle); }; diff --git a/r5dev/tier0/tslist.cpp b/r5dev/tier0/tslist.cpp index e69de29b..a29ef1ab 100644 --- a/r5dev/tier0/tslist.cpp +++ b/r5dev/tier0/tslist.cpp @@ -0,0 +1,28 @@ +//=============================================================================// +// +// Purpose: +// +//=============================================================================// +#include "tier0/tslist.h" + +//----------------------------------------------------------------------------- +// Purpose: alloc aligned memory +// Input : nSize - +// nPad - +// Output : pointer to allocated aligned memory +//----------------------------------------------------------------------------- +void* CAlignedMemAlloc::Alloc(size_t nSize, size_t nAlignment) +{ + return ((void* (*)(size_t, size_t))m_pAllocCallback)(nSize, nAlignment); +} + +//----------------------------------------------------------------------------- +// Purpose: free aligned memory +// Input : pMem - +//----------------------------------------------------------------------------- +void CAlignedMemAlloc::Free(void* pMem) +{ + ((void (*)(void*))m_pFreeCallback)(pMem); +} + +CAlignedMemAlloc* g_pAlignedMemAlloc; diff --git a/r5dev/vscript/languages/squirrel_re/vsquirrel.cpp b/r5dev/vscript/languages/squirrel_re/vsquirrel.cpp index c3db126c..b754c852 100644 --- a/r5dev/vscript/languages/squirrel_re/vsquirrel.cpp +++ b/r5dev/vscript/languages/squirrel_re/vsquirrel.cpp @@ -191,8 +191,8 @@ void CSquirrelVM::CompileModScripts() if (rson) { - RSON_Free(rson, g_pAlignedMemAlloc); - //g_pAlignedMemAlloc->Free(rson); // TODO: fix g_pAlignedMemAlloc and free this properly + RSON_Free(rson, AlignedMemAlloc()); + AlignedMemAlloc()->Free(rson); } } }