From 83660921b64dfc37f4b6176d36656e26a9798285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Thu, 8 Oct 2020 00:13:12 +0200 Subject: [PATCH] ksys/res: Start adding ResourceMgrTask Adds data members and simple functions. --- data/uking_functions.csv | 42 ++-- lib/sead | 2 +- src/KingSystem/Resource/CMakeLists.txt | 6 + src/KingSystem/Resource/resCompactedHeap.cpp | 1 + src/KingSystem/Resource/resCompactedHeap.h | 21 ++ src/KingSystem/Resource/resCounter.cpp | 2 +- src/KingSystem/Resource/resCounter.h | 8 +- .../Resource/resResourceMgrTask.cpp | 71 +++++++ src/KingSystem/Resource/resResourceMgrTask.h | 192 +++++++++++++++++- .../Resource/resTextureHandleList.cpp | 1 + .../Resource/resTextureHandleList.h | 11 + .../Resource/resTextureHandleMgr.cpp | 1 + src/KingSystem/Resource/resTextureHandleMgr.h | 11 + src/KingSystem/System/OverlayArena.h | 2 + src/KingSystem/Utils/CMakeLists.txt | 1 + src/KingSystem/Utils/SafeDelete.h | 30 +++ 16 files changed, 376 insertions(+), 26 deletions(-) create mode 100644 src/KingSystem/Resource/resCompactedHeap.cpp create mode 100644 src/KingSystem/Resource/resCompactedHeap.h create mode 100644 src/KingSystem/Resource/resTextureHandleList.cpp create mode 100644 src/KingSystem/Resource/resTextureHandleList.h create mode 100644 src/KingSystem/Resource/resTextureHandleMgr.cpp create mode 100644 src/KingSystem/Resource/resTextureHandleMgr.h create mode 100644 src/KingSystem/Utils/SafeDelete.h diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 275c8b0a..3857db96 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -38901,7 +38901,7 @@ 0x000000710065a298,sub_710065A298,48, 0x000000710065a2c8,sub_710065A2C8,92, 0x000000710065a324,sub_710065A324,8, -0x000000710065a32c,sub_710065A32C,8, +0x000000710065a32c,sub_710065A32C,8,_ZNK4sead10IDelegate2IPNS_6ThreadElE5cloneEPNS_4HeapE 0x000000710065a334,sub_710065A334,48, 0x000000710065a364,sub_710065A364,92, 0x000000710065a3c0,sub_710065A3C0,8, @@ -47326,7 +47326,7 @@ 0x0000007100799d28,j__ZdlPv_323,4, 0x0000007100799d2c,sub_7100799D2C,52, 0x0000007100799d60,sub_7100799D60,92, -0x0000007100799dbc,sub_7100799DBC,8, +0x0000007100799dbc,sub_7100799DBC,8,_ZNK4sead11IDelegate1RIPvbE9isNoDummyEv 0x0000007100799dc4,sub_7100799DC4,8, 0x0000007100799dcc,sub_7100799DCC,404, 0x0000007100799f60,sub_7100799F60,252, @@ -56391,11 +56391,11 @@ 0x00000071009cce64,sub_71009CCE64,92, 0x00000071009ccec0,sub_71009CCEC0,48, 0x00000071009ccef0,sub_71009CCEF0,92, -0x00000071009ccf4c,sub_71009CCF4C,8, +0x00000071009ccf4c,sub_71009CCF4C,8,_ZNK4sead10IDelegate2IPN4ksys4util17TaskPostRunResultERKNS2_18TaskPostRunContextEE9isNoDummyEv 0x00000071009ccf54,sub_71009CCF54,8, 0x00000071009ccf5c,sub_71009CCF5C,48, 0x00000071009ccf8c,sub_71009CCF8C,92, -0x00000071009ccfe8,sub_71009CCFE8,8, +0x00000071009ccfe8,sub_71009CCFE8,8,_ZNK4sead10IDelegate1IRKN4ksys4util25TaskRemoveCallbackContextEE9isNoDummyEv 0x00000071009ccff0,sub_71009CCFF0,8, 0x00000071009ccff8,ResourceJpg::ctor,100, 0x00000071009cd05c,sub_71009CD05C,8, @@ -90855,11 +90855,11 @@ 0x00000071012038c4,sub_71012038C4,76,_GLOBAL__sub_I_resCacheCriticalSection.cpp 0x0000007101203910,nullsub_5571,4, 0x0000007101203914,sub_7101203914,228, -0x00000071012039f8,res::ResourceMgrTask::setInstance,32, -0x0000007101203a18,res::ResourceMgrTask::ctor,1572, +0x00000071012039f8,res::ResourceMgrTask::setInstance,32,_ZN4ksys3res15ResourceMgrTask11setInstanceEPS1_ +0x0000007101203a18,res::ResourceMgrTask::ctor,1572,_ZN4ksys3res15ResourceMgrTaskC1ERKN4sead16TaskConstructArgE 0x000000710120403c,res::System::calc,24, -0x0000007101204054,res::ResourceMgrTask::dtor,1492, -0x0000007101204628,res::ResourceMgrTask::dtorDelete,36, +0x0000007101204054,res::ResourceMgrTask::dtor,1492,_ZN4ksys3res15ResourceMgrTaskD1Ev +0x0000007101204628,res::ResourceMgrTask::dtorDelete,36,_ZN4ksys3res15ResourceMgrTaskD0Ev 0x000000710120464c,res::ResourceMgrTask::prepare,4876, 0x0000007101205958,res::ResourceMgrTask::insertOverlayArena,136, 0x00000071012059e0,sub_71012059E0,720, @@ -90974,20 +90974,20 @@ 0x000000710120cae4,sub_710120CAE4,184, 0x000000710120cb9c,sub_710120CB9C,80, 0x000000710120cbec,j__ZdlPv_1240,4, -0x000000710120cbf0,nullsub_4702,4, -0x000000710120cbf4,sub_710120CBF4,8, +0x000000710120cbf0,nullsub_4702,4,_ZN4sead12AnyDelegate2IPNS_6ThreadElE11UnbindDummy6invokeES2_l +0x000000710120cbf4,sub_710120CBF4,8,_ZNK4sead12AnyDelegate2IPNS_6ThreadElE11UnbindDummy9isNoDummyEv 0x000000710120cbfc,sub_710120CBFC,36,_ZN4ksys3res7CounterD0Ev? 0x000000710120cc20,sub_710120CC20,16,_ZN4ksys3res7Counter10doSetData_ERKNS0_11CounterBase4DataE -0x000000710120cc30,ResourceMgrInvoker::invoke,24, -0x000000710120cc48,ResourceMgrInvoker::clone,76, -0x000000710120cc94,ResourceMgrInvoker2::invoke,24, -0x000000710120ccac,ResourceMgrInvoker2::clone,76, -0x000000710120ccf8,sub_710120CCF8,52, -0x000000710120cd2c,sub_710120CD2C,92, -0x000000710120cd88,sub_710120CD88,48, -0x000000710120cdb8,sub_710120CDB8,92, -0x000000710120ce14,sub_710120CE14,48, -0x000000710120ce44,sub_710120CE44,92, +0x000000710120cc30,ResourceMgrInvoker::invoke,24,_ZN4sead14Delegate1RFuncIPvbE6invokeES1_ +0x000000710120cc48,ResourceMgrInvoker::clone,76,_ZNK4sead14Delegate1RFuncIPvbE5cloneEPNS_4HeapE +0x000000710120cc94,ResourceMgrInvoker2::invoke,24,_ZN4sead13Delegate2FuncIPN4ksys4util17TaskPostRunResultERKNS2_18TaskPostRunContextEE6invokeES4_S7_ +0x000000710120ccac,ResourceMgrInvoker2::clone,76,_ZNK4sead13Delegate2FuncIPN4ksys4util17TaskPostRunResultERKNS2_18TaskPostRunContextEE5cloneEPNS_4HeapE +0x000000710120ccf8,sub_710120CCF8,52,_ZN4sead10Delegate1RIN4ksys3res15ResourceMgrTaskEPvbE6invokeES4_ +0x000000710120cd2c,sub_710120CD2C,92,_ZNK4sead10Delegate1RIN4ksys3res15ResourceMgrTaskEPvbE5cloneEPNS_4HeapE +0x000000710120cd88,sub_710120CD88,48,_ZN4sead9Delegate2IN4ksys3res15ResourceMgrTaskEPNS1_4util17TaskPostRunResultERKNS4_18TaskPostRunContextEE6invokeES6_S9_ +0x000000710120cdb8,sub_710120CDB8,92,_ZNK4sead9Delegate2IN4ksys3res15ResourceMgrTaskEPNS1_4util17TaskPostRunResultERKNS4_18TaskPostRunContextEE5cloneEPNS_4HeapE +0x000000710120ce14,sub_710120CE14,48,_ZN4sead9Delegate1IN4ksys3res15ResourceMgrTaskERKNS1_4util25TaskRemoveCallbackContextEE6invokeES7_ +0x000000710120ce44,sub_710120CE44,92,_ZNK4sead9Delegate1IN4ksys3res15ResourceMgrTaskERKNS1_4util25TaskRemoveCallbackContextEE5cloneEPNS_4HeapE 0x000000710120cea0,makeEventResourceLoadArg,60, 0x000000710120cedc,sub_710120CEDC,60, 0x000000710120cf18,sub_710120CF18,48, @@ -93226,7 +93226,7 @@ 0x00000071012bc86c,sub_71012BC86C,76, 0x00000071012bc8b8,nullsub_4787,4, 0x00000071012bc8bc,sub_71012BC8BC,76, -0x00000071012bc908,sub_71012BC908,32,_ZN4ksys3res11CounterBaseC2Ev +0x00000071012bc908,sub_71012BC908,32,_ZN4ksys3res11CounterBaseC2EPN4sead4HeapE 0x00000071012bc928,nullsub_4788,4,_ZN4ksys3res11CounterBaseD1Ev 0x00000071012bc92c,j__ZdlPv_1297,4,_ZN4ksys3res11CounterBaseD0Ev 0x00000071012bc930,sub_71012BC930,12,_ZN4ksys3res11CounterBase7setDataERKNS1_4DataE diff --git a/lib/sead b/lib/sead index de2d5095..b19dff33 160000 --- a/lib/sead +++ b/lib/sead @@ -1 +1 @@ -Subproject commit de2d50951821f4b16e211a6f5042a3fe094e7b73 +Subproject commit b19dff3386d866b32f05d92bd1eb7ca93f1a398a diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index bd9b5c16..44f444ae 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -86,6 +86,8 @@ target_sources(uking PRIVATE resCache.h resCacheCriticalSection.cpp resCacheCriticalSection.h + resCompactedHeap.cpp + resCompactedHeap.h resControlTask.cpp resControlTask.h resCounter.cpp @@ -110,6 +112,10 @@ target_sources(uking PRIVATE resSystem.h resTaskRequest.cpp resTaskRequest.h + resTextureHandleList.cpp + resTextureHandleList.h + resTextureHandleMgr.cpp + resTextureHandleMgr.h resUnit.cpp resUnit.h resUnitPool.cpp diff --git a/src/KingSystem/Resource/resCompactedHeap.cpp b/src/KingSystem/Resource/resCompactedHeap.cpp new file mode 100644 index 00000000..a7af2dc7 --- /dev/null +++ b/src/KingSystem/Resource/resCompactedHeap.cpp @@ -0,0 +1 @@ +#include "KingSystem/Resource/resCompactedHeap.h" diff --git a/src/KingSystem/Resource/resCompactedHeap.h b/src/KingSystem/Resource/resCompactedHeap.h new file mode 100644 index 00000000..755ab5d7 --- /dev/null +++ b/src/KingSystem/Resource/resCompactedHeap.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +namespace ksys::res { + +// TODO: very incomplete +class CompactedHeap { +public: + static CompactedHeap* tryCreate(const sead::SafeString& name, void* buffer, size_t buffer_size, + u32 x); + static CompactedHeap* create(const sead::SafeString& name, void* buffer, size_t buffer_size, + u32 x); + + void destroy(); + +private: + virtual ~CompactedHeap(); +}; + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resCounter.cpp b/src/KingSystem/Resource/resCounter.cpp index 20fc787a..b85ff5e3 100644 --- a/src/KingSystem/Resource/resCounter.cpp +++ b/src/KingSystem/Resource/resCounter.cpp @@ -2,7 +2,7 @@ namespace ksys::res { -CounterBase::CounterBase() = default; +CounterBase::CounterBase(sead::Heap*) {} CounterBase::~CounterBase() = default; diff --git a/src/KingSystem/Resource/resCounter.h b/src/KingSystem/Resource/resCounter.h index 74b1913f..7666c042 100644 --- a/src/KingSystem/Resource/resCounter.h +++ b/src/KingSystem/Resource/resCounter.h @@ -5,6 +5,10 @@ #include #include "KingSystem/Utils/Types.h" +namespace sead { +class Heap; +} + namespace ksys::res { class CounterBase { @@ -21,7 +25,7 @@ public: void* mData; }; - CounterBase(); + explicit CounterBase(sead::Heap* heap); virtual ~CounterBase(); bool setData(const Data& data); @@ -42,7 +46,7 @@ private: class Counter : public CounterBase { public: - Counter() = default; + using CounterBase::CounterBase; ~Counter() override = default; private: diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp index 019a46de..2622e3e5 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.cpp +++ b/src/KingSystem/Resource/resResourceMgrTask.cpp @@ -1,10 +1,81 @@ #include "KingSystem/Resource/resResourceMgrTask.h" +#include +#include #include +#include "KingSystem/Resource/resCompactedHeap.h" +#include "KingSystem/Resource/resEntryFactory.h" +#include "KingSystem/Resource/resTextureHandleList.h" +#include "KingSystem/Resource/resTextureHandleMgr.h" +#include "KingSystem/Utils/SafeDelete.h" #include "KingSystem/Utils/Thread/GameTaskThread.h" +#include "KingSystem/Utils/Thread/TaskMgr.h" #include "KingSystem/Utils/Thread/TaskThread.h" namespace ksys::res { +void ResourceMgrTask::setInstance(ResourceMgrTask* task) { + if (!sInstance) { + sInstance = task; + task->mInstancePtrClearer.mClearOnDestruction = true; + } +} + +ResourceMgrTask::ResourceMgrTask(const sead::TaskConstructArg& arg) + : sead::CalculateTask(arg, "res::ResourceMgrTask"), + mSzsDecompressorCS(arg.heap_array->getPrimaryHeap()), + mCounter(arg.heap_array->getPrimaryHeap()), mTask(arg.heap_array->getPrimaryHeap()) { + mArenas.initOffset(OverlayArena::getListNodeOffset()); + mUnits.initOffset(ResourceUnit::getResMgrUnitListNodeOffset()); + mSomeList.initOffset(0x188); // TODO: replace this with a "get offset" call + mSystemCalcFn.bind(this, &ResourceMgrTask::callSystemCalc_); + mFileDevicePrefixes.initOffset(FileDevicePrefix::getListNodeOffset()); +} + +ResourceMgrTask::~ResourceMgrTask() { + util::safeDelete(mTexHandleList); + util::safeDelete(mTexHandleMgr); + util::safeDeleteThread(mCompactionThread); + + if (mCompactedHeapMip0) { + mCompactedHeapMip0->destroy(); + util::safeDeleteArray(mCompactedHeapMip0Buffer); + } + + if (mCompactedHeapMain) { + mCompactedHeapMain->destroy(); + util::safeDeleteArray(mCompactedHeapMainBuffer); + mCompactedHeapMainSeadHeap->destroy(); + } + + util::safeDeleteArray(mCompactedHeapMainBuffer2); + util::safeDeleteArray(mOffsetReadBuf); + mExtensions2.freeBuffer(); + mExtensions1.freeBuffer(); + + util::safeDeleteThread(mMovableMemoryThread); + util::safeDeleteThread(mResourceMemoryThread); + util::safeDeleteThread(mResourceControlThread); + util::safeDeleteThread(mResourceLoadingThread); + util::safeDelete(mTask3); + util::safeDelete(mTask2); + util::safeDelete(mTask1); + util::safeDelete(mControlTask); + + if (mResourceMemoryTaskMgr) { + mResourceMemoryTaskMgr->finalize(); + util::safeDelete(mResourceMemoryTaskMgr); + } + + if (mResourceControlTaskMgr) { + mResourceControlTaskMgr->finalize(); + util::safeDelete(mResourceControlTaskMgr); + } + + util::safeDelete(mEntryFactoryBase); + + mResSystemHeap->destroy(); +} + util::TaskThread* ResourceMgrTask::makeResourceLoadingThread(sead::Heap* heap, bool use_game_task_thread) { if (use_game_task_thread) { diff --git a/src/KingSystem/Resource/resResourceMgrTask.h b/src/KingSystem/Resource/resResourceMgrTask.h index 7a7524d9..f2dada0c 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.h +++ b/src/KingSystem/Resource/resResourceMgrTask.h @@ -1,8 +1,27 @@ #pragma once +#include +#include +#include +#include +#include +#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include