| 1 | #include <filedevice/seadFileDeviceMgr.h> |
| 2 | #include <framework/seadFramework.h> |
| 3 | #include <framework/seadGameFramework.h> |
| 4 | #include <framework/seadMethodTreeMgr.h> |
| 5 | #include <framework/seadProcessMeter.h> |
| 6 | #include <framework/seadTaskMgr.h> |
| 7 | #include <gfx/seadGraphics.h> |
| 8 | #include <heap/seadExpHeap.h> |
| 9 | #include <heap/seadHeapMgr.h> |
| 10 | #include <resource/seadResourceMgr.h> |
| 11 | #include <time/seadTickSpan.h> |
| 12 | |
| 13 | namespace sead |
| 14 | { |
| 15 | GameFramework::GameFramework() |
| 16 | { |
| 17 | mUnk6 = [](bool lock) { |
| 18 | if (lock) |
| 19 | Graphics::instance()->lockDrawContext(); |
| 20 | else |
| 21 | Graphics::instance()->unlockDrawContext(); |
| 22 | }; |
| 23 | } |
| 24 | |
| 25 | // NON_MATCHING: missing body |
| 26 | GameFramework::~GameFramework() |
| 27 | { |
| 28 | // required for RTTI functions to generate |
| 29 | } |
| 30 | |
| 31 | void GameFramework::startDisplay() |
| 32 | { |
| 33 | if (!mDisplayStarted) |
| 34 | mDisplayStarted = true; |
| 35 | } |
| 36 | |
| 37 | void GameFramework::createSystemTasks(TaskBase* base, |
| 38 | const Framework::CreateSystemTaskArg& createArg) |
| 39 | { |
| 40 | CreateSystemTaskArg parentArg; |
| 41 | Framework::createSystemTasks(base, parentArg); |
| 42 | |
| 43 | createControllerMgr(base); |
| 44 | createProcessMeter(base); |
| 45 | createSeadMenuMgr(base); |
| 46 | createHostIOMgr(base, hostioParam: createArg.hostio_parameter, heap: createArg.heap); |
| 47 | createInfLoopChecker(base, createArg.infloop_detection_span, createArg.infloop_unk); |
| 48 | createCuckooClock(base); |
| 49 | } |
| 50 | |
| 51 | void GameFramework::createHostIOMgr([[maybe_unused]] TaskBase* base, |
| 52 | [[maybe_unused]] HostIOMgr::Parameter* param, |
| 53 | [[maybe_unused]] Heap* heap) |
| 54 | { |
| 55 | } |
| 56 | |
| 57 | void GameFramework::createProcessMeter(TaskBase* base) |
| 58 | { |
| 59 | ProcessMeter::createInstance(heap: base->mHeapArray.getPrimaryHeap()); |
| 60 | } |
| 61 | |
| 62 | void GameFramework::([[maybe_unused]] TaskBase* base) {} |
| 63 | |
| 64 | void GameFramework::createInfLoopChecker([[maybe_unused]] TaskBase* base, const TickSpan&, int) {} |
| 65 | |
| 66 | void GameFramework::createCuckooClock([[maybe_unused]] TaskBase* base) {} |
| 67 | |
| 68 | void GameFramework::initialize(const Framework::InitializeArg& initArg) |
| 69 | { |
| 70 | Framework::initialize(initArg); |
| 71 | |
| 72 | Heap* firstHeap = HeapMgr::getRootHeap(index: 0); |
| 73 | ExpHeap* systemManagersHeap = |
| 74 | ExpHeap::create(size: firstHeap->getMaxAllocatableSize(alignment: 8), name: "sead::SystemManagers" , parent: firstHeap, alignment: 8, |
| 75 | direction: Heap::cHeapDirection_Forward, false); |
| 76 | |
| 77 | { |
| 78 | ExpHeap* resourceMgrHeap = |
| 79 | ExpHeap::create(size: systemManagersHeap->getMaxAllocatableSize(alignment: 8), name: "sead::ResourceMgr" , |
| 80 | parent: systemManagersHeap, alignment: 8, direction: Heap::cHeapDirection_Forward, false); |
| 81 | ScopedCurrentHeapSetter scopedHeap(resourceMgrHeap); |
| 82 | |
| 83 | ResourceMgr::createInstance(heap: resourceMgrHeap); |
| 84 | resourceMgrHeap->adjust(); |
| 85 | } |
| 86 | { |
| 87 | ExpHeap* fileDeviceMgrHeap = |
| 88 | ExpHeap::create(size: systemManagersHeap->getMaxAllocatableSize(alignment: 8), name: "sead::FileDeviceMgr" , |
| 89 | parent: systemManagersHeap, alignment: 8, direction: Heap::cHeapDirection_Forward, false); |
| 90 | ScopedCurrentHeapSetter scopedHeap(fileDeviceMgrHeap); |
| 91 | |
| 92 | FileDeviceMgr::createInstance(heap: fileDeviceMgrHeap); |
| 93 | fileDeviceMgrHeap->adjust(); |
| 94 | } |
| 95 | |
| 96 | systemManagersHeap->adjust(); |
| 97 | } |
| 98 | |
| 99 | void GameFramework::waitStartDisplayLoop_() |
| 100 | { |
| 101 | Graphics::instance()->lockDrawContext(); |
| 102 | mTaskMgr->beforeCalc(); |
| 103 | mTaskMgr->afterCalc(); |
| 104 | Graphics::instance()->unlockDrawContext(); |
| 105 | |
| 106 | while (mTaskMgr->mRootTaskCreateArg.factory.mType == TaskClassID::cInvalid) |
| 107 | { |
| 108 | if (mDisplayStarted) |
| 109 | break; |
| 110 | |
| 111 | Thread::sleep(howLong: TickSpan::makeFromMilliSeconds(msec: 10)); |
| 112 | Graphics::instance()->lockDrawContext(); |
| 113 | mTaskMgr->beforeCalc(); |
| 114 | mTaskMgr->afterCalc(); |
| 115 | Graphics::instance()->unlockDrawContext(); |
| 116 | } |
| 117 | |
| 118 | mMethodTreeMgr->pauseAll(false); |
| 119 | if (!mDisplayStarted) |
| 120 | mDisplayStarted = 1; |
| 121 | } |
| 122 | |
| 123 | void GameFramework::quitRun_([[maybe_unused]] Heap* heap) {} |
| 124 | |
| 125 | void GameFramework::lockFrameDrawContext() |
| 126 | { |
| 127 | if (mUnk5) |
| 128 | mUnk5(true); |
| 129 | } |
| 130 | |
| 131 | void GameFramework::unlockFrameDrawContext() |
| 132 | { |
| 133 | if (mUnk5) |
| 134 | mUnk5(false); |
| 135 | } |
| 136 | |
| 137 | void GameFramework::initHostIO_() {} |
| 138 | |
| 139 | void GameFramework::saveScreenShot(const SafeString&) {} |
| 140 | |
| 141 | bool GameFramework::isScreenShotBusy() const |
| 142 | { |
| 143 | return false; |
| 144 | } |
| 145 | |
| 146 | } // namespace sead |
| 147 | |