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
13namespace sead
14{
15GameFramework::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
26GameFramework::~GameFramework()
27{
28 // required for RTTI functions to generate
29}
30
31void GameFramework::startDisplay()
32{
33 if (!mDisplayStarted)
34 mDisplayStarted = true;
35}
36
37void 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
51void GameFramework::createHostIOMgr([[maybe_unused]] TaskBase* base,
52 [[maybe_unused]] HostIOMgr::Parameter* param,
53 [[maybe_unused]] Heap* heap)
54{
55}
56
57void GameFramework::createProcessMeter(TaskBase* base)
58{
59 ProcessMeter::createInstance(heap: base->mHeapArray.getPrimaryHeap());
60}
61
62void GameFramework::createSeadMenuMgr([[maybe_unused]] TaskBase* base) {}
63
64void GameFramework::createInfLoopChecker([[maybe_unused]] TaskBase* base, const TickSpan&, int) {}
65
66void GameFramework::createCuckooClock([[maybe_unused]] TaskBase* base) {}
67
68void 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
99void 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
123void GameFramework::quitRun_([[maybe_unused]] Heap* heap) {}
124
125void GameFramework::lockFrameDrawContext()
126{
127 if (mUnk5)
128 mUnk5(true);
129}
130
131void GameFramework::unlockFrameDrawContext()
132{
133 if (mUnk5)
134 mUnk5(false);
135}
136
137void GameFramework::initHostIO_() {}
138
139void GameFramework::saveScreenShot(const SafeString&) {}
140
141bool GameFramework::isScreenShotBusy() const
142{
143 return false;
144}
145
146} // namespace sead
147