summaryrefslogtreecommitdiff
path: root/src/d/d_heap.cpp
diff options
context:
space:
mode:
authorrobojumper <robojumper@gmail.com>2024-05-04 00:39:30 +0200
committerrobojumper <robojumper@gmail.com>2024-05-04 19:59:42 +0200
commitfa4b2862fd54925affe5ce9fa64dc6c37a71fb28 (patch)
tree832fea965092b5b492dcc0d96f738c8261da2ed2 /src/d/d_heap.cpp
parent1ecdfe9a4dfdd429c04424d77a9c0e6c148832a1 (diff)
dHeap(Allocator) work
Diffstat (limited to 'src/d/d_heap.cpp')
-rw-r--r--src/d/d_heap.cpp66
1 files changed, 57 insertions, 9 deletions
diff --git a/src/d/d_heap.cpp b/src/d/d_heap.cpp
index 4bfa5e52..2e9c3198 100644
--- a/src/d/d_heap.cpp
+++ b/src/d/d_heap.cpp
@@ -1,4 +1,5 @@
#include <d/d_heap.h>
+#include <d/d_heap_alloc.h>
dHeap dHeap::work1Heap;
dHeap dHeap::work2Heap;
@@ -9,6 +10,22 @@ dHeap dHeap::layoutEx2Heap;
dHeap dHeap::layoutResHeap;
dHeap dHeap::fontHeap;
dHeap dHeap::HBMHeap;
+dHeapAllocator dHeapAllocator::sAllocator;
+
+extern u8 lbl_80571C58;
+extern "C" void fn_802de710();
+
+// TODO TU splits?
+
+void dHeapAllocator::onAlloc(EGG::HeapAllocArg *arg) {
+ if (arg->heap != nullptr) {
+ return;
+ }
+ if (lbl_80571C58 == 0) {
+ return;
+ }
+ fn_802de710();
+}
EGG::ExpHeap *dHeap::init(const char *name, size_t size, EGG::Heap *parent) {
heap = EGG::ExpHeap::create(size, parent, 4);
@@ -18,30 +35,61 @@ EGG::ExpHeap *dHeap::init(const char *name, size_t size, EGG::Heap *parent) {
}
return heap;
}
+
void dHeap::createWork1Heap(size_t size, EGG::Heap *parent) {
- work1Heap.init("ゲーム用作業用ヒープ(dHeap::work1Heap)", size, parent);
+ static const char name[] = "ゲーム用作業用ヒープ(dHeap::work1Heap)";
+ work1Heap.init(name, size, parent);
}
void dHeap::createWork2Heap(size_t size, EGG::Heap *parent) {
- work2Heap.init("ゲーム用作業用ヒープ(dHeap::work2Heap)", size, parent);
+ static const char name[] = "ゲーム用作業用ヒープ(dHeap::work2Heap)";
+ work2Heap.init(name, size, parent);
}
void dHeap::createWorkExHeap(size_t size, EGG::Heap *parent) {
- workExHeap.init("ゲーム用拡張作業用ヒープ(dHeap::workExHeap)", size, parent);
+ static const char name[] = "ゲーム用拡張作業用ヒープ(dHeap::workExHeap)";
+ workExHeap.init(name, size, parent);
}
void dHeap::createLayoutHeap(size_t size, EGG::Heap *parent) {
- layoutHeap.init("レイアウト作業用ヒープ(dHeap::layoutHeap)", size, parent);
+ static const char name[] = "レイアウト作業用ヒープ(dHeap::layoutHeap)";
+ layoutHeap.init(name, size, parent);
}
void dHeap::createLayoutExHeap(size_t size, EGG::Heap *parent) {
- layoutExHeap.init("レイアウト拡張作業用ヒープ(dHeap::layoutExHeap)", size, parent);
+ static const char name[] = "レイアウト拡張作業用ヒープ(dHeap::layoutExHeap)";
+ layoutExHeap.init(name, size, parent);
}
void dHeap::createLayoutEx2Heap(size_t size, EGG::Heap *parent) {
- layoutEx2Heap.init("レイアウト拡張作業用ヒープ2(dHeap::layoutEx2Heap)", size, parent);
+ static const char name[] = "レイアウト拡張作業用ヒープ2(dHeap::layoutEx2Heap)";
+ layoutEx2Heap.init(name, size, parent);
}
void dHeap::createLayoutResHeap(size_t size, EGG::Heap *parent) {
- layoutResHeap.init("レイアウトリソース用ヒープ(dHeap::layoutResHeap)", size, parent);
+ static const char name[] = "レイアウトリソース用ヒープ(dHeap::layoutResHeap)";
+ layoutResHeap.init(name, size, parent);
}
void dHeap::createFontHeap(size_t size, EGG::Heap *parent) {
- fontHeap.init("フォント用ヒープ(dHeap::fontHeap)", size, parent);
+ static const char name[] = "フォント用ヒープ(dHeap::fontHeap)";
+ fontHeap.init(name, size, parent);
}
void dHeap::createHBMHeap(size_t size, EGG::Heap *parent) {
- HBMHeap.init("HBM用ヒープ(dHeap::HBMHeap)", size, parent);
+ static const char name[] = "HBM用ヒープ(dHeap::HBMHeap)";
+ HBMHeap.init(name, size, parent);
+}
+
+// TODO this doesn't match (many more stack stores)
+void dHeapAllocator::initCallbacks() {
+ sAllocator.doInitCallbacks();
+}
+
+void *operator new(size_t size) {
+ return EGG::Heap::alloc(size, 0x04, nullptr);
+}
+
+void *operator new[](size_t size) {
+ return EGG::Heap::alloc(size, 0x04, nullptr);
+}
+
+void operator delete(void *ptr) {
+ return EGG::Heap::free(ptr, nullptr);
+}
+
+void operator delete[](void *ptr) {
+ return EGG::Heap::free(ptr, nullptr);
}