317 lines
7.7 KiB
C++
317 lines
7.7 KiB
C++
|
|
#include "Precompiled.h"
|
|
#include "RakiEngine/System/RakiDebug.h"
|
|
#include "RakiTests/System/SystemAllocator.h"
|
|
|
|
#ifdef RAKI_PLATFORM_CAFE
|
|
#include "RakiTests/_Cafe/Memory/SimpleHeap_Cafe.h"
|
|
#endif // RAKI_PLATFORM_CAFE
|
|
|
|
#ifdef RAKI_PLATFORM_SCARLETT
|
|
#include <apu.h>
|
|
#endif // RAKI_PLATFORM_SCARLETT
|
|
|
|
namespace raki
|
|
{
|
|
|
|
|
|
|
|
#define DEFAULT_FIFO_SIZE (256 * 1024)
|
|
#define RAKI_XMA2_NATIVE_BUFFER_ALIGNMENT 2048
|
|
|
|
|
|
#ifdef RAKI_PLATFORM_WII
|
|
|
|
static void * ms_arenaMemLo = NULL;
|
|
MEMHeapHandle ms_mem1Heap;
|
|
MEMHeapHandle ms_mem2Heap;
|
|
|
|
|
|
void SystemAllocator_Initialize()
|
|
{
|
|
ms_arenaMemLo = OSGetMEM1ArenaLo();
|
|
void * DemoFifoBuffer = (void*)OSRoundUp32B((u32)ms_arenaMemLo);
|
|
ms_arenaMemLo = (void*)OSRoundUp32B((u32)DemoFifoBuffer + DEFAULT_FIFO_SIZE);
|
|
OSSetMEM1ArenaLo(ms_arenaMemLo);
|
|
|
|
|
|
ms_arenaMemLo = OSGetMEM1ArenaLo();
|
|
void * arenaMemHi = OSGetMEM1ArenaHi();
|
|
ms_mem1Heap = MEMCreateExpHeap(ms_arenaMemLo, (u32)arenaMemHi - (u32) ms_arenaMemLo);
|
|
|
|
void * arenaMem2Lo = OSGetMEM2ArenaLo();
|
|
void * arenaMem2Hi = OSGetMEM2ArenaHi();
|
|
|
|
ms_mem2Heap = MEMCreateExpHeap(arenaMem2Lo, (u32)arenaMem2Hi - (u32) arenaMem2Lo);
|
|
}
|
|
|
|
|
|
#endif // RAKI_PLATFORM_WII
|
|
|
|
|
|
|
|
SystemAllocator::SystemAllocator()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
SystemAllocator::~SystemAllocator()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
void * SystemAllocator::malloc( u64 _size, Memory::Type /*_type*/ )
|
|
{
|
|
|
|
#if defined ( RAKI_PLATFORM_WII )
|
|
|
|
void * ptr = MEMAllocFromExpHeap( ms_mem1Heap, (u32) _size );
|
|
|
|
#elif defined ( RAKI_PLATFORM_CAFE )
|
|
|
|
void * ptr = SimpleHeap_Cafe::mallocAligned( _size, 4 );
|
|
|
|
#else
|
|
|
|
void * ptr = ::malloc( (size_t)_size );
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef RAKI_SYSTEMMEMORY_CHECKFORLEAKS
|
|
static u64 memCount = 0;
|
|
|
|
static u64 breakSize = (u64)-1;
|
|
static u64 breakCount = (u64)-1;
|
|
|
|
memCount++;
|
|
|
|
if ( _size == breakSize )
|
|
RAKI_OUTPUT("SystemAllocator::malloc gotcha breakSize");
|
|
|
|
if ( memCount == breakCount )
|
|
RAKI_OUTPUT("SystemAllocator::malloc gotcha breakCount");
|
|
|
|
//RAKI_OUTPUT( "SystemAllocator::malloc _size 0x%llx memCount 0x%llx returning 0x%x", _size, memCount, ptr );
|
|
|
|
if ( ptr )
|
|
m_allocated.insert( MemoryContainer::value_type( (u64)ptr, _size + ( memCount << 32 ) ) );
|
|
|
|
#endif // RAKI_SYSTEMMEMORY_CHECKFORLEAKS
|
|
|
|
return ptr;
|
|
}
|
|
|
|
void SystemAllocator::free( void * _ptr )
|
|
{
|
|
if ( _ptr )
|
|
{
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
MemoryContainer::iterator it = m_allocated.find( (u64) _ptr );
|
|
RAKI_ASSERT( it != m_allocated.end() );
|
|
m_allocated.erase( it );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
#if defined ( RAKI_PLATFORM_WII )
|
|
|
|
MEMFreeToExpHeap( ms_mem1Heap, _ptr );
|
|
|
|
#elif defined ( RAKI_PLATFORM_CAFE )
|
|
|
|
SimpleHeap_Cafe::free( _ptr );
|
|
|
|
#else // ( RAKI_PLATFORM_CAFE )
|
|
|
|
::free( _ptr );
|
|
|
|
#endif
|
|
|
|
}
|
|
}
|
|
|
|
|
|
void * SystemAllocator::mallocAligned( const u64 _size, const u64 _alignment, const Memory::Type mem_type)
|
|
{
|
|
#if defined ( RAKI_USING_XAUDIO2 )
|
|
void * ptr = _aligned_malloc( (size_t) _size, (size_t) _alignment );
|
|
#elif defined ( RAKI_PLATFORM_PS3 )
|
|
void * ptr = ::memalign( (size_t)_alignment, (size_t)_size );
|
|
#elif defined ( RAKI_PLATFORM_WII )
|
|
u32 round_length = OSRoundUp32B( (u32) _size );
|
|
void * ptr = MEMAllocFromExpHeapEx( ms_mem1Heap, round_length, (int)_alignment );
|
|
#elif defined ( RAKI_PLATFORM_CAFE )
|
|
void * ptr = SimpleHeap_Cafe::mallocAligned( _size, _alignment );
|
|
#elif defined ( RAKI_PLATFORM_ORBIS ) || defined ( RAKI_PLATFORM_PROSPERO )
|
|
void * ptr = ::malloc(_size);
|
|
#endif
|
|
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
if ( ptr )
|
|
m_allocatedAligned.insert( MemoryContainer::value_type( (u64)ptr, _size ) );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
return ptr;
|
|
}
|
|
|
|
void SystemAllocator::freeAligned( void * _ptr )
|
|
{
|
|
if ( _ptr )
|
|
{
|
|
#if defined ( RAKI_USING_XAUDIO2 )
|
|
_aligned_free( _ptr );
|
|
#elif defined ( RAKI_PLATFORM_PS3 )
|
|
::free( _ptr );
|
|
#elif defined ( RAKI_PLATFORM_WII )
|
|
MEMFreeToExpHeap( ms_mem1Heap, _ptr );
|
|
#elif defined ( RAKI_PLATFORM_CAFE )
|
|
SimpleHeap_Cafe::free( _ptr );
|
|
#elif defined ( RAKI_PLATFORM_ORBIS )
|
|
::free(_ptr);
|
|
#endif
|
|
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
MemoryContainer::iterator it = m_allocatedAligned.find( (u64) _ptr );
|
|
RAKI_ASSERT( it != m_allocatedAligned.end() );
|
|
m_allocatedAligned.erase( it );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#if defined ( RAKI_PLATFORM_WII )
|
|
|
|
void * SystemAllocator::mallocMem2Aligned32( const u64 _size, const Memory::Type )
|
|
{
|
|
u32 round_length = OSRoundUp32B( (u32) _size );
|
|
|
|
void * buffer = MEMAllocFromExpHeapEx( ms_mem2Heap, round_length, 32 );
|
|
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
if ( buffer )
|
|
m_allocatedAligned.insert( MemoryContainer::value_type( (u64)buffer, _size ) );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
return buffer;
|
|
}
|
|
|
|
void SystemAllocator::freeMem2Aligned32( void * _ptr )
|
|
{
|
|
if ( _ptr )
|
|
{
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
MemoryContainer::iterator it = m_allocatedAligned.find( (u64) _ptr );
|
|
RAKI_ASSERT( it != m_allocatedAligned.end() );
|
|
m_allocatedAligned.erase( it );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
MEMFreeToExpHeap( ms_mem2Heap, _ptr );
|
|
}
|
|
}
|
|
|
|
#elif defined ( RAKI_PLATFORM_CAFE )
|
|
|
|
void * SystemAllocator::mallocAligned64( const u64 _size, const Memory::Type _type )
|
|
{
|
|
void * buffer = SimpleHeap_Cafe::mallocAligned( _size, 64 );
|
|
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
if ( buffer )
|
|
m_allocatedAligned.insert( MemoryContainer::value_type( (u64)buffer, _size ) );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
return buffer;
|
|
}
|
|
|
|
|
|
void SystemAllocator::freeAligned64( void * _ptr )
|
|
{
|
|
if ( _ptr )
|
|
{
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
MemoryContainer::iterator it = m_allocatedAligned.find( (u64) _ptr );
|
|
RAKI_ASSERT( it != m_allocatedAligned.end() );
|
|
m_allocatedAligned.erase( it );
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
SimpleHeap_Cafe::free( _ptr );
|
|
}
|
|
}
|
|
|
|
|
|
#elif defined ( RAKI_PLATFORM_XB360 )
|
|
|
|
void * SystemAllocator::mallocPhysicalAligned( const u64 _size, const Memory::Type )
|
|
{
|
|
return XPhysicalAlloc( _size, MAXULONG_PTR, RAKI_XMA2_NATIVE_BUFFER_ALIGNMENT, PAGE_READWRITE );
|
|
}
|
|
|
|
void SystemAllocator::freePhysicalAligned( void * _ptr )
|
|
{
|
|
XPhysicalFree( _ptr );
|
|
}
|
|
|
|
#elif defined ( RAKI_PLATFORM_SCARLETT )
|
|
|
|
void * SystemAllocator::mallocPhysicalAligned( const u64 _size, const Memory::Type )
|
|
{
|
|
void *vptr = nullptr;
|
|
const HRESULT result = ApuAlloc(&vptr, nullptr, _size, RAKI_XMA2_NATIVE_BUFFER_ALIGNMENT);
|
|
RAKI_ASSERT(SUCCEEDED(result));
|
|
return vptr;
|
|
}
|
|
|
|
void SystemAllocator::freePhysicalAligned( void * _ptr )
|
|
{
|
|
ApuFree(_ptr);
|
|
}
|
|
|
|
#endif
|
|
|
|
u64 SystemAllocator::getUsedSize()
|
|
{
|
|
u64 size = 0;
|
|
|
|
#if defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
MemoryContainer::iterator it = m_allocated.begin();
|
|
|
|
while ( it != m_allocated.end() )
|
|
{
|
|
size += it->second;
|
|
|
|
int sizeToShow = (int)it->second;
|
|
RAKI_OUTPUT("SystemAllocator::getUsedSize has ptr 0x%llx size %d = 0x%x",
|
|
it->first, sizeToShow, sizeToShow );
|
|
|
|
++it;
|
|
}
|
|
#endif // defined ( RAKI_SYSTEMMEMORY_CHECKFORLEAKS )
|
|
|
|
return size;
|
|
}
|
|
|
|
|
|
void SystemAllocator::memcpy( void * _dest, const void * _src, const u64 _size )
|
|
{
|
|
::memcpy( _dest, _src, (size_t) _size );
|
|
}
|
|
|
|
|
|
void SystemAllocator::memZero( void * _dest, const u64 _size )
|
|
{
|
|
::memset( _dest, 0, (size_t) _size );
|
|
}
|
|
|
|
|
|
i64 SystemAllocator::memcmp( const void * _ptrA, const void * _ptrB, const u64 _size )
|
|
{
|
|
return ::memcmp( _ptrA, _ptrB, (size_t) _size );
|
|
}
|
|
|
|
|
|
|
|
} // namespace raki
|
|
|