123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- /*******************************************************************************
- The content of this file includes portions of the AUDIOKINETIC Wwise Technology
- released in source code form as part of the SDK installer package.
- Commercial License Usage
- Licensees holding valid commercial licenses to the AUDIOKINETIC Wwise Technology
- may use this file in accordance with the end user license agreement provided
- with the software or, alternatively, in accordance with the terms contained in a
- written agreement between you and Audiokinetic Inc.
- Apache License Usage
- Alternatively, this file may be used under the Apache License, Version 2.0 (the
- "Apache License"); you may not use this file except in compliance with the
- Apache License. You may obtain a copy of the Apache License at
- http://www.apache.org/licenses/LICENSE-2.0.
- Unless required by applicable law or agreed to in writing, software distributed
- under the Apache License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
- OR CONDITIONS OF ANY KIND, either express or implied. See the Apache License for
- the specific language governing permissions and limitations under the License.
- Copyright (c) 2023 Audiokinetic Inc.
- *******************************************************************************/
- /// \file
- /// Audiokinetic's definitions and factory of overridable Memory Manager module.
- #pragma once
- #include <AK/SoundEngine/Common/AkTypes.h>
- #include <AK/SoundEngine/Common/AkMemoryMgr.h>
- /// \name Audiokinetic Memory Manager's implementation-specific definitions.
- //@{
- typedef void ( AKSOUNDENGINE_CALL *AkMemInitForThread ) (
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemTermForThread ) (
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemTrimForThread ) (
- );
- typedef void* ( AKSOUNDENGINE_CALL *AkMemMalloc ) (
- AkMemPoolId poolId,
- size_t uSize
- );
- typedef void* ( AKSOUNDENGINE_CALL *AkMemMalign ) (
- AkMemPoolId poolId,
- size_t uSize,
- AkUInt32 uAlignment
- );
- typedef void* ( AKSOUNDENGINE_CALL *AkMemRealloc ) (
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize
- );
- typedef void* ( AKSOUNDENGINE_CALL *AkMemReallocAligned ) (
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize,
- AkUInt32 uAlignment
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemFree ) (
- AkMemPoolId poolId,
- void* pAddress
- );
- typedef size_t ( AKSOUNDENGINE_CALL *AkMemTotalReservedMemorySize ) (
- );
- typedef size_t ( AKSOUNDENGINE_CALL *AkMemSizeOfMemory ) (
- AkMemPoolId poolId,
- void* pAddress
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemDebugMalloc ) (
- AkMemPoolId poolId,
- size_t uSize,
- void* pAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemDebugMalign ) (
- AkMemPoolId poolId,
- size_t uSize,
- AkUInt32 uAlignment,
- void* pAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemDebugRealloc ) (
- AkMemPoolId poolId,
- void* pOldAddress,
- size_t uSize,
- void* pNewAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemDebugReallocAligned ) (
- AkMemPoolId poolId,
- void* pOldAddress,
- size_t uSize,
- AkUInt32 uAlignment,
- void* pNewAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- typedef void ( AKSOUNDENGINE_CALL *AkMemDebugFree ) (
- AkMemPoolId poolId,
- void* pAddress
- );
- typedef void* ( *AkMemAllocVM ) (
- size_t size,
- size_t* extra
- );
- typedef void ( *AkMemFreeVM ) (
- void* address,
- size_t size,
- size_t extra,
- size_t release
- );
- /// Initialization settings for the default implementation of the Memory Manager. For more details, see \ref memorymanager_init.
- /// \sa AK::MemoryMgr
- struct AkMemSettings
- {
- /// @name High-level memory allocation hooks. When not NULL, redirect allocations normally forwarded to rpmalloc.
- //@{
- AkMemInitForThread pfInitForThread; ///< (Optional) Thread-specific allocator initialization hook.
- AkMemTermForThread pfTermForThread; ///< (Optional) Thread-specific allocator termination hook.
- AkMemTrimForThread pfTrimForThread; ///< (Optional) Thread-specific allocator "trimming" hook. Used to relinquish memory resources when threads enter a period of inactivity.
- AkMemMalloc pfMalloc; ///< (Optional) Memory allocation hook.
- AkMemMalign pfMalign; ///< (Optional) Memory allocation hook.
- AkMemRealloc pfRealloc; ///< (Optional) Memory allocation hook.
- AkMemReallocAligned pfReallocAligned; ///< (Optional) Memory allocation hook.
- AkMemFree pfFree; ///< (Optional) Memory allocation hook.
- AkMemTotalReservedMemorySize pfTotalReservedMemorySize; ///< (Optional) Memory allocation statistics hook.
- AkMemSizeOfMemory pfSizeOfMemory; ///< (Optional) Memory allocation statistics hook.
- //@}
- /// @name Configuration.
- //@{
- AkUInt64 uMemAllocationSizeLimit; ///< When non-zero, limits the total amount of virtual and device memory allocated by AK::MemoryMgr.
- bool bEnableSeparateDeviceHeap; ///< Enable use of device memory heap for all allocations (on applicable platforms).
- AK::TempAlloc::InitSettings tempAllocSettings[AK::TempAlloc::Type_NUM]; ///< Configuration of behavior for the temporary-memory pools.
- //@}
- /// @name Page allocation hooks, used by rpmalloc. Default to AKPLATFORM::AllocVM et al.
- //@{
- AkMemAllocVM pfAllocVM; ///< Virtual page allocation hook.
- AkMemFreeVM pfFreeVM; ///< Virtual page allocation hook.
- AkMemAllocVM pfAllocDevice; ///< Device page allocation hook.
- AkMemFreeVM pfFreeDevice; ///< Device page allocation hook.
- AkUInt32 uVMPageSize; ///< Virtual memory page size. Defaults to 0 which means auto-detect.
- AkUInt32 uDevicePageSize; ///< Device memory page size. Defaults to 0 which means auto-detect.
- AkUInt32 uMaxThreadLocalHeapAllocSize; ///< All memory allocations of sizes larger than this value will go to a global heap shared across all threads. Defaults to 0 which means all allocations go to a global heap.
- //@}
- /// @name Memory allocation debugging.
- //@{
- AkMemDebugMalloc pfDebugMalloc; ///< (Optional) Memory allocation debugging hook. Used for tracking calls to pfMalloc.
- AkMemDebugMalign pfDebugMalign; ///< (Optional) Memory allocation debugging hook. Used for tracking calls to pfMalign.
- AkMemDebugRealloc pfDebugRealloc; ///< (Optional) Memory allocation debugging hook. Used for tracking calls to pfRealloc.
- AkMemDebugReallocAligned pfDebugReallocAligned; ///< (Optional) Memory allocation debugging hook. Used for tracking calls to pfReallocAligned.
- AkMemDebugFree pfDebugFree; ///< (Optional) Memory allocation debugging hook. Used for tracking calls to pfFree.
- AkUInt32 uMemoryDebugLevel; ///< Default 0 disabled. 1 debug enabled. 2 stomp allocator enabled. 3 stomp allocator and debug enabled. User implementations may use multiple non-zero values to offer different features.
- //@}
- };
- //@}
- namespace AK
- {
- namespace MemoryMgr
- {
- /// Initialize the default implementation of the Memory Manager.
- /// \sa AK::MemoryMgr
- AK_EXTERNAPIFUNC( AKRESULT, Init ) (
- AkMemSettings * in_pSettings ///< Memory manager initialization settings.
- );
- /// Obtain the default initialization settings for the default implementation of the Memory Manager.
- AK_EXTERNAPIFUNC( void, GetDefaultSettings ) (
- AkMemSettings & out_pMemSettings ///< Memory manager default initialization settings.
- );
- }
- }
- #if defined AK_WIN || defined AK_LINUX || defined AK_SONY || defined AK_XBOX || defined AK_APPLE || defined AK_EMSCRIPTEN
- #define AK_CRT_ALLOCATOR_SUPPORTED
- #endif
- #ifdef AK_CRT_ALLOCATOR_SUPPORTED
- namespace AK
- {
- namespace MemoryMgr
- {
- /// @name C runtime allocator functions for the default implementation of the Memory Manager.
- //@{
- AK_EXTERNAPIFUNC( void, AkCrtAllocatorInitForThread )();
- AK_EXTERNAPIFUNC( void, AkCrtAllocatorTermForThread )();
- AK_EXTERNAPIFUNC( void, AkCrtAllocatorTrimForThread )();
- AK_EXTERNAPIFUNC( void*, AkCrtAllocatorMalloc )(
- AkMemPoolId poolId,
- size_t uSize
- );
- AK_EXTERNAPIFUNC( void*, AkCrtAllocatorMalign )(
- AkMemPoolId poolId,
- size_t uSize,
- AkUInt32 uAlignment
- );
- AK_EXTERNAPIFUNC( void*, AkCrtAllocatorRealloc )(
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize
- );
- AK_EXTERNAPIFUNC( void*, AkCrtAllocatorReallocAligned )(
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize,
- AkUInt32 uAlignment
- );
- AK_EXTERNAPIFUNC( void, AkCrtAllocatorFree )(
- AkMemPoolId poolId,
- void* pAddress
- );
- AK_EXTERNAPIFUNC( size_t, AkCrtAllocatorTotalReservedMemorySize )();
- AK_EXTERNAPIFUNC( size_t, AkCrtAllocatorSizeOfMemory )(
- AkMemPoolId poolID,
- void* pAddress
- );
- //@}
- }
- }
- #endif // AK_CRT_ALLOCATOR_SUPPORTED
- #if !defined AK_EMSCRIPTEN
- #define AK_STOMP_ALLOCATOR_SUPPORTED
- #endif
- #ifdef AK_STOMP_ALLOCATOR_SUPPORTED
- namespace AK
- {
- namespace MemoryMgr
- {
- /// @name Stomp allocator functions for the default implementation of the Memory Manager.
- //@{
- AK_EXTERNAPIFUNC( void, AkStompAllocatorInitForThread )();
- AK_EXTERNAPIFUNC( void, AkStompAllocatorTermForThread )();
- AK_EXTERNAPIFUNC( void, AkStompAllocatorTrimForThread )();
- AK_EXTERNAPIFUNC( void*, AkStompAllocatorMalloc )(
- AkMemPoolId poolId,
- size_t uSize
- );
- AK_EXTERNAPIFUNC( void*, AkStompAllocatorMalign )(
- AkMemPoolId poolId,
- size_t uSize,
- AkUInt32 uAlignment
- );
- AK_EXTERNAPIFUNC( void*, AkStompAllocatorRealloc )(
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize
- );
- AK_EXTERNAPIFUNC( void*, AkStompAllocatorReallocAligned )(
- AkMemPoolId poolId,
- void* pAddress,
- size_t uSize,
- AkUInt32 uAlignment
- );
- AK_EXTERNAPIFUNC( void, AkStompAllocatorFree )(
- AkMemPoolId poolId,
- void* pAddress
- );
- AK_EXTERNAPIFUNC( size_t, AkStompAllocatorTotalReservedMemorySize )();
- AK_EXTERNAPIFUNC( size_t, AkStompAllocatorSizeOfMemory )(
- AkMemPoolId poolID,
- void* pAddress
- );
- //@}
- }
- }
- #endif // AK_STOMP_ALLOCATOR_SUPPORTED
- namespace AK
- {
- namespace MemoryMgr
- {
- /// @name Debug tool hooks for the default implementation of the Memory Manager.
- //@{
- AK_EXTERNAPIFUNC( AKRESULT, AkMemDebugToolInit )();
- AK_EXTERNAPIFUNC( void, AkMemDebugToolTerm )();
- AK_EXTERNAPIFUNC( void, AkMemDebugToolMalloc ) (
- AkMemPoolId poolId,
- size_t uSize,
- void* pAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- AK_EXTERNAPIFUNC( void, AkMemDebugToolMalign ) (
- AkMemPoolId poolId,
- size_t uSize,
- AkUInt32 uAlignment,
- void* pAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- AK_EXTERNAPIFUNC( void, AkMemDebugToolRealloc ) (
- AkMemPoolId poolId,
- void* pOldAddress,
- size_t uSize,
- void* pNewAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- AK_EXTERNAPIFUNC( void, AkMemDebugToolReallocAligned ) (
- AkMemPoolId poolId,
- void* pOldAddress,
- size_t uSize,
- AkUInt32 uAlignment,
- void* pNewAddress,
- char const* pszFile,
- AkUInt32 uLine
- );
- AK_EXTERNAPIFUNC( void, AkMemDebugToolFree ) (
- AkMemPoolId poolId,
- void* pAddress
- );
- //@}
- }
- }
|