summaryrefslogtreecommitdiff
path: root/include/egg
diff options
context:
space:
mode:
authorSean Miller <seanmiller999@gmail.com>2026-04-06 16:50:38 +0100
committerSean Miller <seanmiller999@gmail.com>2026-04-06 16:50:38 +0100
commit97d808fe06b024aa79e17d23c744003085dad5f6 (patch)
tree272cbdf6822cc70023978980364fba8e326363fb /include/egg
parentf2aaeac6c68dc126286035db3e6da43bacdd01e1 (diff)
100% match for d_sys
Diffstat (limited to 'include/egg')
-rw-r--r--include/egg/core/eggController.h4
-rw-r--r--include/egg/core/eggDisplay.h4
-rw-r--r--include/egg/core/eggDvdFile.h2
-rw-r--r--include/egg/core/eggSystem.h448
-rw-r--r--include/egg/core/eggVideo.h4
-rw-r--r--include/egg/core/eggXfbManager.h1
6 files changed, 398 insertions, 65 deletions
diff --git a/include/egg/core/eggController.h b/include/egg/core/eggController.h
index a790b667..8dd447a4 100644
--- a/include/egg/core/eggController.h
+++ b/include/egg/core/eggController.h
@@ -346,6 +346,10 @@ public:
sConnectCallback = cb;
}
+ static void setWPADWorkSize(u32 size) {
+ sWPADWorkSize = size;
+ }
+
private:
CoreControllerMgr();
diff --git a/include/egg/core/eggDisplay.h b/include/egg/core/eggDisplay.h
index cdf2fe7a..986cfcda 100644
--- a/include/egg/core/eggDisplay.h
+++ b/include/egg/core/eggDisplay.h
@@ -58,6 +58,10 @@ public:
mClearColor = color;
}
+ u32 getClearZ() {
+ return mClearZ;
+ }
+
public:
static u32 sTickPeriod;
};
diff --git a/include/egg/core/eggDvdFile.h b/include/egg/core/eggDvdFile.h
index ac36ae4e..6b511e2a 100644
--- a/include/egg/core/eggDvdFile.h
+++ b/include/egg/core/eggDvdFile.h
@@ -39,7 +39,7 @@ public:
/* vt 0x24 */ virtual bool open(const char *path, void *);
public:
- void initialize();
+ static void initialize();
DvdFile();
void initiate();
s32 sync();
diff --git a/include/egg/core/eggSystem.h b/include/egg/core/eggSystem.h
index 97682fa3..c1686d2e 100644
--- a/include/egg/core/eggSystem.h
+++ b/include/egg/core/eggSystem.h
@@ -2,31 +2,336 @@
#define EGG_SYSTEM_H
#include "common.h"
+#include "egg/core/eggController.h"
+#include "egg/core/eggDisplay.h"
+#include "egg/core/eggDvdFile.h"
#include "egg/core/eggGraphicsFifo.h"
#include "egg/core/eggHeap.h"
+#include "egg/core/eggVideo.h"
+#include "egg/core/eggXfbManager.h"
+#include "rvl/WPAD.h"
+#include "toBeSorted/d_exception.h"
+
+namespace {
+
+// TODO Determine better names (+ location?) for this render mode set
+
+const GXRenderModeObj gRMO_Unk1 = {
+ 0, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 25, // viXOrigin
+ 12, // viYOrigin
+ 670, // viWidth
+ 456, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk2 = {
+ 2, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 25, // viXOrigin
+ 12, // viYOrigin
+ 670, // viWidth
+ 456, // viHeight
+ 0, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk3 = {
+ 4, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 542, // xfbHeight
+ 27, // viXOrigin
+ 16, // viYOrigin
+ 666, // viWidth
+ 542, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk4 = {
+ 20, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 25, // viXOrigin
+ 12, // viYOrigin
+ 670, // viWidth
+ 456, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk5 = {
+ 22, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 25, // viXOrigin
+ 12, // viYOrigin
+ 670, // viWidth
+ 456, // viHeight
+ 0, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk6 = {
+ 0, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 17, // viXOrigin
+ 12, // viYOrigin
+ 686, // viWidth
+ 456, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk7 = {
+ 2, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 17, // viXOrigin
+ 12, // viYOrigin
+ 686, // viWidth
+ 456, // viHeight
+ 0, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk8 = {
+ 4, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 542, // xfbHeight
+ 19, // viXOrigin
+ 16, // viYOrigin
+ 682, // viWidth
+ 542, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk9 = {
+ 20, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 17, // viXOrigin
+ 12, // viYOrigin
+ 686, // viWidth
+ 456, // viHeight
+ 1, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
+
+const GXRenderModeObj gRMO_Unk10 = {
+ 22, // tvInfo
+ 608, // fbWidth
+ 456, // efbHeight
+ 456, // xfbHeight
+ 17, // viXOrigin
+ 12, // viYOrigin
+ 686, // viWidth
+ 456, // viHeight
+ 0, // xfbMode
+ 0, // field_rendering
+ 0, // aa
+ {
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ {6, 6},
+ }, // sample_pattern
+ {0, 0, 21, 22, 21, 0, 0} // vFilter
+};
-#include "rvl/SC.h"
+const EGG::Video::RenderModeObjSet gUnkRenderModeObjSet = {
+ {&gRMO_Unk1, &gRMO_Unk2, &gRMO_Unk3,
+ &gRMO_Unk4, &gRMO_Unk5, &gRMO_Unk6,
+ &gRMO_Unk7, &gRMO_Unk8, &gRMO_Unk9,
+ &gRMO_Unk10}
+};
-// Ported from https://github.com/snailspeed3/mkw/blob/master/lib/egg/core/eggSystem.hpp
+}
namespace EGG {
-class Display;
-class Heap;
-class PerformanceView;
+// TODO Proper definition of PerformanceView
+class PerformanceView {
+public:
+ u8 placeholder[0x4c];
+ /* 0x4c */ u32 _4c;
+};
+
class SceneManager;
class SimpleAudioMgr;
-class Thread;
-class Video;
-class XfbManager;
-class BaseSystem {
+class ConfigurationData {
public:
- static BaseSystem *sSystem;
-
-public:
- inline BaseSystem() : mSysHeapSize(0x97000), mGraphicsFifoSize(0x80000), mRenderMode(nullptr) {}
+ inline ConfigurationData() : mSystemHeapSize(0x89000) {}
+ // vtable at 0x0
/* vt 0x08 */ virtual Video *getVideo() = 0;
/* vt 0x0C */ virtual Heap *getSysHeap() = 0;
/* vt 0x10 */ virtual Display *getDisplay() = 0;
@@ -42,34 +347,51 @@ public:
/* vt 0x38 */ virtual void initialize() = 0;
public:
- /* 0x04 */ void *mMEM1ArenaLo;
- /* 0x08 */ void *mMEM1ArenaHi;
- /* 0x0C */ void *mMEM2ArenaLo;
- /* 0x10 */ void *mMEM2ArenaHi;
- /* 0x14 */ u32 mMemorySize;
+ /* 0x04 */ u32 mRoot1HeapStart;
+ /* 0x08 */ u32 mRoot1HeapEnd;
+ /* 0x0C */ u32 mRoot2HeapStart;
+ /* 0x10 */ u32 mRoot2HeapEnd;
+ /* 0x14 */ u32 mMemSize;
/* 0x18 */ Heap *mRootHeapMem1;
/* 0x1C */ Heap *mRootHeapMem2;
/* 0x20 */ Heap *mRootHeapDebug;
- /* 0x24 */ Heap *mSysHeap;
- /* 0x28 */ Thread *mThread;
- /* 0x2C */ void *_2c;
- /* 0x30 */ void *_30;
- /* 0x34 */ u32 mSysHeapSize;
- /* 0x38 */ u32 mGraphicsFifoSize;
- /* 0x3C */ GXRenderModeObj *mRenderMode;
+ /* 0x24 */ Heap *mSystemHeap;
+ /* 0x28 */ Thread *mSystemThread;
+ /* 0x2C */ u32 field_0x2C;
+ /* 0x30 */ u32 mSystemHeapStart;
+ /* 0x34 */ u32 mSystemHeapSize;
+};
+class BaseSystem {
+public:
+ static ConfigurationData *mConfigData;
+
+ static XfbManager *getXfbMgr() {
+ return mConfigData->getXfbMgr();
+ }
+ static Display *getDisplay() {
+ return mConfigData->getDisplay();
+ }
+ static Video *getVideo() {
+ return mConfigData->getVideo();
+ }
};
-template <class tVideo, class tDisplay, class tXfbMgr, class tAudioMgr, class tSceneMgr, class tPerfView>
-class TSystem : public BaseSystem {
+template <class TVideo, class TDisplay, class TXfbManager, class TAudioManager, class TSceneManager, class TPerfView>
+class TSystem : public ConfigurationData {
public:
- inline TSystem() : BaseSystem() {}
+ inline TSystem() : mGraphicsFifoSize(0x80000), mRenderMode() {}
+
+ void onBeginFrame() override {}
+ void onEndFrame() override {}
+
+ void initRenderMode() override {}
Video *getVideo() override {
return static_cast<Video *>(mVideo);
}
Heap *getSysHeap() override {
- return mSysHeap;
+ return mSystemHeap;
}
Display *getDisplay() override {
@@ -81,7 +403,10 @@ public:
}
PerformanceView *getPerfView() override {
- return static_cast<PerformanceView *>(mPerfView);
+ if (!mPerfView)
+ return mPerfView;
+ // TODO remove cast hack if/when more is known about PerformanceView
+ return static_cast<PerformanceView *>((void *)&mPerfView->_4c);
}
SceneManager *getSceneMgr() override {
@@ -92,55 +417,52 @@ public:
return static_cast<SimpleAudioMgr *>(mAudioMgr);
}
- void onBeginFrame() override {}
- void onEndFrame() override {}
-
- void initRenderMode() override {}
-
void initialize() override {
- // DVDInit();
- // SCInit();
-
- // initMemory();
- // initRenderMode();
+ DVDInit();
+ SCInit();
- // GraphicsFifo::create(mGraphicsFifoSize, nullptr);
+ initMemory();
- // mVideo = new tVideo(mRenderMode, nullptr);
+ Heap *heap = Heap::sCurrentHeap;
- // mXfbMgr = new tXfbMgr(nullptr);
- // for (int i = 0; i < 2; ++i) {
- // mXfbMgr->attach(new Xfb(mRootHeapMem2));
- // }
+ GraphicsFifo::create(mGraphicsFifoSize, heap);
+ mHeap::createAssertHeap(mRootHeapMem1);
- // mDisplay = new tDisplay(1);
+ mVideo = new (heap) TVideo(&gUnkRenderModeObjSet);
- // Thread::initialize();
- // mThread = new Thread(OSGetCurrentThread(), 4);
+ mXfbMgr = new (heap) TXfbManager();
+ for (int i = 0; i < 2; ++i) {
+ mXfbMgr->attach(new (heap) Xfb(mRootHeapMem2));
+ }
- // mPerfView = new tPerfView(true);
+ mDisplay = new (heap) TDisplay(1);
+ mDisplay->setClearColor(nw4r::ut::Color::BLACK);
+ mDisplay->clearEFB();
- // DvdFile::initialize();
+ Thread::initialize();
+ mSystemThread = new (heap) Thread(OSGetCurrentThread(), 4);
- // CoreControllerMgr::createStaticInstance();
- // GCControllerMgr::createStaticInstance();
+ DvdFile::initialize();
- // Exception_create(0x40, 0x20, 4, nullptr, 1);
+ CoreControllerMgr::setWPADWorkSize(WPADGetWorkMemorySize() + 228);
+ CoreControllerMgr::createInstance();
- // mSceneMgr = new tSceneMgr(nullptr);
+ exceptionCreate(heap);
- // mRootHeapMem1->becomeCurrentHeap();
+ BaseSystem::mConfigData->getSysHeap()->mFlag.setBit(0);
- // mAudioMgr = new tAudioMgr();
+ mHeap::setCurrentHeap(mHeap::g_assertHeap);
}
public:
- /* 0x40 */ tAudioMgr *mAudioMgr;
- /* 0x44 */ tVideo *mVideo;
- /* 0x48 */ tXfbMgr *mXfbMgr;
- /* 0x4c */ tDisplay *mDisplay;
- /* 0x50 */ tPerfView *mPerfView;
- /* 0x54 */ tSceneMgr *mSceneMgr;
+ /* 0x38 */ u32 mGraphicsFifoSize;
+ /* 0x3C */ GXRenderModeObj *mRenderMode;
+ /* 0x40 */ TAudioManager *mAudioMgr;
+ /* 0x44 */ TVideo *mVideo;
+ /* 0x48 */ TXfbManager *mXfbMgr;
+ /* 0x4c */ TDisplay *mDisplay;
+ /* 0x50 */ TPerfView *mPerfView;
+ /* 0x54 */ TSceneManager *mSceneMgr;
};
} // namespace EGG
diff --git a/include/egg/core/eggVideo.h b/include/egg/core/eggVideo.h
index cfaf7336..87ebaea4 100644
--- a/include/egg/core/eggVideo.h
+++ b/include/egg/core/eggVideo.h
@@ -20,7 +20,9 @@ public:
/* 0x08 */ u32 mConfiguredTime;
public:
- Video() : pRenderMode(0), mFlag(), mConfiguredTime(){};
+ Video() : pRenderMode(0), mFlag(0), mConfiguredTime() {};
+ Video(const RenderModeObjSet *set) : pRenderMode(0), mFlag(0), mConfiguredTime() { initialize(nullptr, set); };
+
void initialize(GXRenderModeObj *, const RenderModeObjSet *);
GXRenderModeObj *configure(GXRenderModeObj *, const RenderModeObjSet *);
static u32 getTickPerVRetrace(u32 tvFormat);
diff --git a/include/egg/core/eggXfbManager.h b/include/egg/core/eggXfbManager.h
index 76ba56dc..6291864e 100644
--- a/include/egg/core/eggXfbManager.h
+++ b/include/egg/core/eggXfbManager.h
@@ -15,6 +15,7 @@ public:
/* 0xC */ u8 mNumXfbs; // Total number of Xfbs ever attached
/* 0xD */ u8 mNumXfbs_Copy; // Unsure of purpose yet, but showing wont proceed until its under 3
public:
+ XfbManager() : mNextXfb(), mToCopyXfb(), mToShowXfb(), mNumXfbs(), mNumXfbs_Copy() {}
bool isRegisterd(Xfb &xfb) const; // yes. this is correct spelling
bool attach(Xfb *xfb);
void copyEFB(bool);