Merge branch 'main' into eggXfbManager

This commit is contained in:
Elijah Thomas
2024-05-12 13:00:28 -04:00
committed by GitHub
15 changed files with 504 additions and 66 deletions
+135
View File
@@ -0,0 +1,135 @@
#include <egg/core/eggExpHeap.h>
namespace EGG {
/* 80495ab0 */ ExpHeap::ExpHeap(MEMiHeapHead *heapHandle) : Heap(heapHandle) {}
/* 80495af0 */ ExpHeap::~ExpHeap() {
dispose();
MEMDestroyExpHeap(mHeapHandle);
}
/* 80495b70 */ ExpHeap *ExpHeap::create(void *heapStart, size_t size, u16 attr) {
ExpHeap *heap = nullptr;
void *startAddr = heapStart;
void *heapEnd = ROUND_DOWN_PTR((u8 *)heapStart + size, 0x04);
heapStart = ROUND_UP_PTR(heapStart, 0x04);
if (heapStart > heapEnd || ((u8 *)heapEnd - (u8 *)heapStart) < 0x38u) {
return nullptr;
}
MEMiHeapHead *head = MEMCreateExpHeapEx(((ExpHeap *)heapStart) + 1, ((u8 *)heapEnd - (u8 *)heapStart) - 0x34, attr);
if (head != nullptr) {
heap = new (heapStart) ExpHeap(head);
heap->mParentBlock = startAddr;
if (sCreateCallback != nullptr) {
(sCreateCallback)(heap);
}
}
return heap;
}
/* 80495c30 */ ExpHeap *ExpHeap::create(size_t size, Heap *heap, u16 attr) {
ExpHeap *newHeap = nullptr;
if (heap == nullptr) {
heap = sCurrentHeap;
}
if (size == -1) {
size = heap->getAllocatableSize(0x04);
}
void *block = heap->alloc(size, 0x04);
if (block != nullptr) {
newHeap = ExpHeap::create(block, size, attr);
if (newHeap == nullptr) {
heap->free(block);
}
}
return newHeap;
}
/* 80495d00 */ void ExpHeap::destroy() {
if (sDestroyCallback != nullptr) {
sDestroyCallback(this);
}
Heap *parentHeap = findParentHeap();
this->~ExpHeap();
if (parentHeap != nullptr) {
parentHeap->free(this);
}
}
/* 80495d90 */ void *ExpHeap::alloc(u32 size, s32 align) {
if (mFlag.onBit(0)) {
#line 182
OSError("DAME DAME\n");
}
void *ptr = MEMAllocFromExpHeapEx(mHeapHandle, size, align);
if (sAllocCallback != nullptr) {
HeapAllocArg arg;
arg.userArg = sAllocCallbackArg;
arg.ptr = ptr;
arg.size = size;
arg.align = align;
arg.heap = this;
(sAllocCallback)(&arg);
}
return ptr;
}
/* 80495e50 */ void ExpHeap::free(void *ptr) {
if (sFreeCallback != nullptr) {
HeapFreeArg arg;
arg.userArg = sFreeCallbackArg;
arg.ptr = ptr;
arg.heap = this;
(sFreeCallback)(&arg);
}
MEMFreeToExpHeap(mHeapHandle, ptr);
}
/* 80495ec0 */ u32 ExpHeap::resizeForMBlock(void *block, u32 size) {
return MEMResizeForMBlockExpHeap(mHeapHandle, block, size);
}
/* 80495ed0 */ u32 ExpHeap::getTotalFreeSize() {
return MEMGetAllocatableSizeForExpHeap(mHeapHandle);
}
/* 80495ee0 */ u32 ExpHeap::getAllocatableSize(s32 align) {
return MEMGetAllocatableSizeForExpHeapEx(mHeapHandle, align);
}
/* 80495d00 */ void ExpHeap::setGroupID(u16 groupId) {
MEMSetGroupIdForExpHeap(mHeapHandle, groupId);
}
/* 80495f00 */ u32 ExpHeap::adjust() {
u32 adjustedSize = MEMAdjustExpHeap(mHeapHandle);
u32 totalSize = adjustedSize + 0x34;
if (totalSize > 0x34) {
Heap *parent = findParentHeap();
if (parent != nullptr) {
parent->resizeForMBlock(mParentBlock, totalSize);
return totalSize;
}
}
return 0;
}
/* 80495f80 */ u32 ExpHeap::getSizeForMBlock(const void *block) {
return MEMGetSizeForMBlockExpHeap(block);
}
/* 80495f90 */ Heap::eHeapKind ExpHeap::getHeapKind() const {
return HEAP_KIND_EXPANDED;
}
} // namespace EGG
+35
View File
@@ -0,0 +1,35 @@
#include <rvl/GX.h>
#include <egg/core/eggGraphicsFifo.h>
#include <egg/core/eggHeap.h>
extern "C" void *GXInit(void *buf, u32 bufSize);
extern "C" void GXGetGPStatus(GXBool *overhi, GXBool *underlow, GXBool *readIdle, GXBool *cmdIdle, GXBool *brkpt);
namespace EGG {
GraphicsFifo *GraphicsFifo::sGraphicsFifo;
u8 GraphicsFifo::sGpStatus[];
void GraphicsFifo::create(u32 size, Heap *heap) {
if (heap == nullptr) {
heap = Heap::sCurrentHeap;
}
sGraphicsFifo = new(heap, 0x04) GraphicsFifo(size, heap);
}
GraphicsFifo::~GraphicsFifo() {
do {
GXGetGPStatus(&sGpStatus[0], &sGpStatus[1], &sGpStatus[2], &sGpStatus[3], &sGpStatus[4]);
} while (sGpStatus[2] == false);
Heap::free(mBuffBase, nullptr);
}
GraphicsFifo::GraphicsFifo(u32 size, Heap *heap) {
mBufSize = ROUND_UP(size, 0x20);
mBuffBase = Heap::alloc(mBufSize, 0x20, heap);
mGxInitData = GXInit(mBuffBase, mBufSize);
}
} // namespace EGG
+202
View File
@@ -0,0 +1,202 @@
#include <Runtime.PPCEABI.H/__va_arg.h>
#include <egg/core/eggSystem.h>
#include <egg/core/eggXfbManager.h>
#include <egg/prim/eggAssert.h>
#include <nw4r/db/db_directPrint.h>
#include <rvl/OS.h>
#include <rvl/VI.h>
#include <MSL_C/string.h>
namespace nw4r {
namespace db {
// TODO
extern s32 MapFile_QuerySymbol(void *arg, char *buf, u32 buf_size);
} // namespace db
} // namespace nw4r
namespace EGG {
namespace Assert {
AssertCallback sAssertCallback;
AssertCallback sAssertCallback2;
u32 sPtrOverride;
bool sInstantHalt;
bool sAssertOccurred;
/* 8049bf90 */ void wait(u32 time) {
u32 tick = OSGetTick();
u32 tick2;
do {
tick2 = OSGetTick();
} while ((tick2 - tick) / (OS_BUS_CLOCK_SPEED / 4 / 1000) < time);
}
// extern "C" void OSVReport(const char *str, va_list list);
/* 8049c010 */ void system_vreport(const char *str, va_list list) {
OSVReport(str, list);
}
/* 8049c010 */ void system_report(const char *str, ...) {
va_list l;
va_start(l, str);
system_vreport(str, l);
va_end(l);
}
/* 8049c0a0 */ s32 getPeriodPos(const char *str) {
char *b = strchr(str, '.');
s32 len;
if (b == nullptr) {
len = strlen(str);
} else {
len = b - str;
}
if (len > 0xff) {
return 0xff;
}
return len;
}
/* 80674c60 */ char buf[260];
/* 8049c100 */ const char *getMapSymbol(void *arg) {
u32 success = nw4r::db::MapFile_QuerySymbol(arg, buf, sizeof(buf));
return success ? buf : nullptr;
}
/* 8049c150 */ bool isOutsideMEM1(u32 addr) {
if (!(0x80000000 <= addr) || !(addr <= 0x83000000 - 1)) {
return true;
}
return false;
}
/* 8049c180 */ AssertCallback setAssertCallback(AssertCallback cb) {
AssertCallback old = sAssertCallback;
sAssertCallback = cb;
return old;
}
/* 8049c190 */ void system_halt(const char *file, u32 line, const char *msg, va_list list) {
if (sAssertOccurred) {
#line 152
OSError("Recursive assertioned");
}
sAssertOccurred = true;
if (sAssertCallback != nullptr) {
sAssertCallback();
}
VISetPreRetraceCallback(nullptr);
VISetPostRetraceCallback(nullptr);
system_report("\n---------- HALT -------------\n");
s32 pos = getPeriodPos(file);
system_report("%.*s(%d):", pos, file, line);
va_list args;
va_copy(args, list);
system_vreport(msg, args);
system_report("\n");
u32 *stackp = (u32 *)OSGetStackPointer();
if (sPtrOverride != 0) {
stackp = (u32*)((u32*)sPtrOverride)[1];
}
u32 *stack = stackp;
s32 num = 0;
for (s32 num = 0; num < 0x1e; num++) {
if (isOutsideMEM1((u32)stack)) {
break;
}
const char *sym = getMapSymbol((void *)stack[1]);
if (sym != nullptr) {
system_report("%d: %s\n", num, sym);
} else {
system_report("%d: %p\n", num, stack[1]);
}
stack = (u32*)stack[0];
if (isOutsideMEM1((u32)stack)) {
break;
}
}
if (sInstantHalt == 0) {
VISetBlack(false);
VIFlush();
nw4r::db::DirectPrint_Init();
nw4r::db::detail::DirectPrint_SetupFB(0);
Xfb *fb = BaseSystem::mConfigData->getXfbMgr()->mToShowXfb;
if (fb == nullptr) {
fb = BaseSystem::mConfigData->getXfbMgr()->mNextXfb;
}
if (fb == nullptr) {
#line 239
OSError("Program Halt");
}
// Random float conversion here for no reason
f32 wid = fb->mWidth;
nw4r::db::DirectPrint_EraseXfb(0, 0, fb->mWidth, fb->mHeight);
nw4r::db::DirectPrint_StoreCache();
OSDisableInterrupts();
OSDisableScheduler();
OSEnableInterrupts();
while (true) {
nw4r::db::DirectPrint_EraseXfb(0, 0, fb->mWidth, fb->mHeight);
nw4r::db::DirectPrint_StoreCache();
nw4r::db::DirectPrint_Printf(2, 2, "%.*s:%d", pos, file, line);
va_list args;
va_copy(args, list);
nw4r::db::DirectPrint_printfsub(2, 0xe, msg, args);
nw4r::db::DirectPrint_StoreCache();
s32 line;
u32 *stack = stackp;
s32 counter;
for (counter = 0, line = 0x1a; counter < 0x10; counter++) {
if (isOutsideMEM1((u32)stack)) {
break;
}
const char *sym = getMapSymbol((void*)stack[1]);
if (sym != nullptr) {
nw4r::db::DirectPrint_Printf(2, line, "%d:%s\n", counter, sym);
} else {
nw4r::db::DirectPrint_Printf(2, line, "LR Save[%d]:%p\n", counter, (void*)stack[1]);
}
nw4r::db::DirectPrint_StoreCache();
stack = (u32*)*stack;
if (isOutsideMEM1((u32)stack)) {
break;
}
line += 0xc;
}
nw4r::db::DirectPrint_StoreCache();
wait(4000);
if (sAssertCallback2 == nullptr) {
goto end;
}
nw4r::db::DirectPrint_EraseXfb(0, 0, fb->mWidth, fb->mHeight);
(sAssertCallback2)();
nw4r::db::DirectPrint_StoreCache();
wait(4000);
}
}
end:
#line 315
OSError("Program Halt");
return;
}
/* 8049c530 */ void assert(const char *file, u32 line, const char *msg, ...) {
va_list l;
va_start(l, msg);
system_halt(file, line, msg, l);
va_end(l);
}
} // namespace Assert
} // namespace EGG
+30
View File
@@ -0,0 +1,30 @@
#include <m/m_angle.h>
/** 80575c08 */
mAng3_c mAng3_c::Zero = mAng3_c::mAng3_c(0, 0, 0);
/** 802ee5f0 */
s32 mAng::step(s16 target, s32 steps, s16 max, s16 min) {
if (mVal != target) {
int stepSize;
int diff = target - mVal;
stepSize = diff / steps;
if (stepSize > min || stepSize < -min) {
mVal += stepSize < -max ? -max : stepSize > max ? max : stepSize;
} else if (diff >= 0) {
if (mVal + min >= target) {
mVal = target;
} else {
mVal += min;
}
} else {
if (mVal - min <= target) {
mVal = target;
} else {
mVal -= min;
}
}
}
return target - mVal;
}