mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-12-12 10:37:02 +00:00
77 lines
2.4 KiB
C++
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);
|
|
}
|
|
};
|