Cemu/src/Cafe/OS/libs/gx2/GX2_Memory.cpp
2023-04-13 14:13:54 +02:00

77 lines
2.4 KiB
C++

#include "Cafe/OS/common/OSCommon.h"
#include "Cafe/HW/Latte/ISA/RegDefines.h"
#include "GX2.h"
#include "GX2_Resource.h"
#include "Cafe/HW/Latte/Core/Latte.h"
#include "Cafe/HW/Latte/Core/LatteDraw.h"
// default GX2 allocator (not the same as the GX2R allocator, but GX2R uses this allocator by default)
MPTR gx2Mem_defaultAlloc = MPTR_NULL;
MPTR gx2Mem_defaultFree = MPTR_NULL;
void gx2Memory_GX2SetDefaultAllocator(MPTR defaultAllocFunc, MPTR defaulFreeFunc)
{
gx2Mem_defaultAlloc = defaultAllocFunc;
gx2Mem_defaultFree = defaulFreeFunc;
}
void _GX2DefaultAlloc_Alloc(PPCInterpreter_t* hCPU)
{
// parameters:
// r3 uint32 userParam
// r4 uint32 size
// r5 sint32 alignment
hCPU->gpr[3] = hCPU->gpr[4];
hCPU->gpr[4] = hCPU->gpr[5];
hCPU->instructionPointer = gCoreinitData->MEMAllocFromDefaultHeapEx.GetMPTR();
}
void _GX2DefaultAlloc_Free(PPCInterpreter_t* hCPU)
{
hCPU->gpr[3] = hCPU->gpr[4];
hCPU->instructionPointer = gCoreinitData->MEMFreeToDefaultHeap.GetMPTR();
}
void gx2Export_GX2SetDefaultAllocator(PPCInterpreter_t* hCPU)
{
cemuLog_log(LogType::GX2, "GX2SetDefaultAllocator(0x{:08x}, 0x{:08x})", hCPU->gpr[3], hCPU->gpr[4]);
gx2Mem_defaultAlloc = hCPU->gpr[3];
gx2Mem_defaultFree = hCPU->gpr[4];
osLib_returnFromFunction(hCPU, 0);
}
void _GX2DefaultAllocR_Alloc(PPCInterpreter_t* hCPU)
{
cemuLog_log(LogType::GX2, "GX2DefaultAllocate(0x{:08x}, 0x{:08x}, 0x{:08x})", hCPU->gpr[3], hCPU->gpr[4], hCPU->gpr[5]);
// parameters:
// r3 uint32 userParam
// r4 uint32 size
// r5 sint32 alignment
hCPU->instructionPointer = gx2Mem_defaultAlloc;
}
void _GX2DefaultAllocR_Free(PPCInterpreter_t* hCPU)
{
cemuLog_log(LogType::GX2, "GX2DefaultFree(0x{:08x}, 0x{:08x})", hCPU->gpr[3], hCPU->gpr[4]);
// parameters:
// r3 uint32 userParam
// r4 void* mem
hCPU->instructionPointer = gx2Mem_defaultFree;
}
namespace GX2
{
void GX2MEMAllocatorsInit()
{
// set default allocators (can be overwritten by GX2SetDefaultAllocator)
gx2Mem_defaultAlloc = PPCInterpreter_makeCallableExportDepr(_GX2DefaultAlloc_Alloc);
gx2Mem_defaultFree = PPCInterpreter_makeCallableExportDepr(_GX2DefaultAlloc_Free);
// set resource default allocator
GX2::GX2RSetAllocator(PPCInterpreter_makeCallableExportDepr(_GX2DefaultAllocR_Alloc), PPCInterpreter_makeCallableExportDepr(_GX2DefaultAllocR_Free));
}
void GX2MemInit()
{
osLib_addFunction("gx2", "GX2SetDefaultAllocator", gx2Export_GX2SetDefaultAllocator);
}
};