diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 823d5b32..56688b27 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -100,7 +100,7 @@ 0x0000007100000c20,sub_7100000C20,140, 0x0000007100000cac,sub_7100000CAC,140, 0x0000007100000d38,sub_7100000D38,140, -0x0000007100000dc4,sub_7100000DC4,12, +0x0000007100000dc4,sub_7100000DC4,12,_ZNK4sead15RuntimeTypeInfo4Root9isDerivedEPKNS0_9InterfaceE 0x0000007100000f44,sub_7100000F44,140, 0x0000007100001028,nullsub_25,4, 0x000000710000103c,sub_710000103C,20, @@ -56386,7 +56386,7 @@ 0x00000071009ccbf0,sub_71009CCBF0,204, 0x00000071009cccbc,sub_71009CCCBC,92, 0x00000071009ccd18,sub_71009CCD18,140, -0x00000071009ccda4,sub_71009CCDA4,140, +0x00000071009ccda4,sub_71009CCDA4,140,_ZNK4sead15RuntimeTypeInfo6DeriveIN4ksys4util8TaskDataEE9isDerivedEPKNS0_9InterfaceE 0x00000071009cce30,sub_71009CCE30,52, 0x00000071009cce64,sub_71009CCE64,92, 0x00000071009ccec0,sub_71009CCEC0,48, @@ -90862,7 +90862,7 @@ 0x000000710120464c,res::ResourceMgrTask::prepare,4876, 0x0000007101205958,res::ResourceMgrTask::insertOverlayArena,136, 0x00000071012059e0,sub_71012059E0,720, -0x0000007101205cb0,startResourceLoadingThread,236, +0x0000007101205cb0,startResourceLoadingThread,236,_ZN4ksys3res15ResourceMgrTask25makeResourceLoadingThreadEPN4sead4HeapEb 0x0000007101205d9c,WorkerThread1::init,224, 0x0000007101205e7c,WorkerThread2::init,224, 0x0000007101205f5c,ResourceBinder::callReadFilePathAndMakeHeapAndMaybePrepareLoad,8, @@ -93175,13 +93175,13 @@ 0x00000071012badd4,sub_71012BADD4,8, 0x00000071012baddc,sub_71012BADDC,92, 0x00000071012bae38,sub_71012BAE38,8, -0x00000071012bafb4,EventResourceLoadArg::ctor,156, -0x00000071012bb050,EventResourceLoadArg::dtor,72, -0x00000071012bb098,sub_71012BB098,20, -0x00000071012bb0ac,EventResourceLoadArg::dtorDelete,80, -0x00000071012bb0fc,EventResourceLoadArg::b,368, -0x00000071012bb26c,EventResourceLoadArg::null1,4, -0x00000071012bb270,EventResourceLoadArg::c,32, +0x00000071012bafb4,EventResourceLoadArg::ctor,156,_ZN4ksys3res11ControlTaskC1EPN4sead4HeapE +0x00000071012bb050,EventResourceLoadArg::dtor,72,_ZN4ksys3res11ControlTaskD2Ev +0x00000071012bb098,sub_71012BB098,20,_ZN4ksys3res15ControlTaskDataD2Ev +0x00000071012bb0ac,EventResourceLoadArg::dtorDelete,80,_ZN4ksys3res11ControlTaskD0Ev +0x00000071012bb0fc,EventResourceLoadArg::b,368,_ZN4ksys3res11ControlTask12prepareImpl_EPNS_4util11TaskRequestE +0x00000071012bb26c,EventResourceLoadArg::null1,4,_ZN4ksys3res11ControlTask6onRun_Ev +0x00000071012bb270,EventResourceLoadArg::c,32,_ZN4ksys3res11ControlTask14preRemoveImpl_Ev 0x00000071012bb290,sub_71012BB290,156, 0x00000071012bb32c,sub_71012BB32C,20, 0x00000071012bb340,nullsub_4782,4, @@ -93189,13 +93189,13 @@ 0x00000071012bb378,sub_71012BB378,260, 0x00000071012bb47c,nullsub_4783,4, 0x00000071012bb480,sub_71012BB480,32, -0x00000071012bb4a0,EventResourceLoadArg::rtti1,288, -0x00000071012bb5c0,EventResourceLoadArg::rtti2,92, +0x00000071012bb4a0,EventResourceLoadArg::rtti1,288,_ZNK4ksys3res11ControlTask27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012bb5c0,EventResourceLoadArg::rtti2,92,_ZNK4ksys3res11ControlTask18getRuntimeTypeInfoEv 0x00000071012bb61c,sub_71012BB61C,288, 0x00000071012bb73c,sub_71012BB73C,92, -0x00000071012bb798,sub_71012BB798,204, -0x00000071012bb864,sub_71012BB864,92, -0x00000071012bb8c0,sub_71012BB8C0,52, +0x00000071012bb798,sub_71012BB798,204,_ZNK4ksys3res15ControlTaskData27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x00000071012bb864,sub_71012BB864,92,_ZNK4ksys3res15ControlTaskData18getRuntimeTypeInfoEv +0x00000071012bb8c0,sub_71012BB8C0,52,_ZN4ksys3res15ControlTaskDataD0Ev 0x00000071012bb8f4,sub_71012BB8F4,204, 0x00000071012bb9c0,sub_71012BB9C0,92, 0x00000071012bba1c,j__ZdlPv_1295,4, diff --git a/src/KingSystem/Resource/CMakeLists.txt b/src/KingSystem/Resource/CMakeLists.txt index 46218270..87918287 100644 --- a/src/KingSystem/Resource/CMakeLists.txt +++ b/src/KingSystem/Resource/CMakeLists.txt @@ -94,9 +94,15 @@ target_sources(uking PRIVATE resHandle.h resLoadRequest.cpp resLoadRequest.h + resControlTask.cpp + resControlTask.h resOffsetReadFileDevice.cpp resOffsetReadFileDevice.h + resResourceMgrTask.cpp + resResourceMgrTask.h resSystem.h + resTaskRequest.cpp + resTaskRequest.h resUnit.cpp resUnit.h diff --git a/src/KingSystem/Resource/resControlTask.cpp b/src/KingSystem/Resource/resControlTask.cpp new file mode 100644 index 00000000..bdade971 --- /dev/null +++ b/src/KingSystem/Resource/resControlTask.cpp @@ -0,0 +1,30 @@ +#include "KingSystem/Resource/resControlTask.h" +#include "KingSystem/Resource/resSystem.h" +#include "KingSystem/Resource/resTaskRequest.h" + +namespace ksys::res { + +ControlTask::ControlTask(sead::Heap* heap) : util::ManagedTask(heap) {} + +void ControlTask::onRun_() {} + +void ControlTask::prepareImpl_(util::TaskRequest* req_) { + auto* req = static_cast(req_); + + mData.mHasResLoadReq = req->mHasResLoadReq; + mData.mPackResUnit = req->mPackResUnit; + mData.mResHandle = req->mResHandle; + mData.mResPath = req->mResPath; + mData.mResLoadReq = req->mResLoadReq; + mData.mResLoadReq.mPath = mData.mResPath; + + if (getUserData() == nullptr) + setUserData(&mData); +} + +void ControlTask::preRemoveImpl_() { + if (returnFalse()) + stubbedLogFunction(); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resControlTask.h b/src/KingSystem/Resource/resControlTask.h new file mode 100644 index 00000000..8bebc1fd --- /dev/null +++ b/src/KingSystem/Resource/resControlTask.h @@ -0,0 +1,41 @@ +#pragma once + +#include +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Utils/Thread/ManagedTask.h" +#include "KingSystem/Utils/Thread/TaskData.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +class Handle; +class ResourceUnit; + +class ControlTaskData : public util::TaskData { + SEAD_RTTI_OVERRIDE(ControlTaskData, util::TaskData) +public: + virtual ~ControlTaskData() = default; + + bool mHasResLoadReq = false; + ResourceUnit* mPackResUnit = nullptr; + Handle* mResHandle = nullptr; + sead::FixedSafeString<128> mResPath; + LoadRequest mResLoadReq; +}; +KSYS_CHECK_SIZE_NX150(ControlTaskData, 0x138); + +class ControlTask : public util::ManagedTask { + SEAD_RTTI_OVERRIDE(ControlTask, util::ManagedTask) +public: + explicit ControlTask(sead::Heap* heap); + +private: + void onRun_() override; + void prepareImpl_(util::TaskRequest* req) override; + void preRemoveImpl_() override; + + ControlTaskData mData; +}; +KSYS_CHECK_SIZE_NX150(ControlTask, 0x1f8); + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp index c5b53de1..019a46de 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.cpp +++ b/src/KingSystem/Resource/resResourceMgrTask.cpp @@ -1 +1,21 @@ #include "KingSystem/Resource/resResourceMgrTask.h" +#include +#include "KingSystem/Utils/Thread/GameTaskThread.h" +#include "KingSystem/Utils/Thread/TaskThread.h" + +namespace ksys::res { + +util::TaskThread* ResourceMgrTask::makeResourceLoadingThread(sead::Heap* heap, + bool use_game_task_thread) { + if (use_game_task_thread) { + return new (heap) util::GameTaskThread( + "Resource Loading", heap, sead::ThreadUtil::ConvertPrioritySeadToPlatform(19), + sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0xfa000, 32); + } + + return new (heap) util::TaskThread( + "Resource Loading", heap, sead::ThreadUtil::ConvertPrioritySeadToPlatform(19), + sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0xa000, 32); +} + +} // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceMgrTask.h b/src/KingSystem/Resource/resResourceMgrTask.h index e9bdd2db..18ea07f0 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.h +++ b/src/KingSystem/Resource/resResourceMgrTask.h @@ -1,8 +1,16 @@ #pragma once +namespace sead { +class Heap; +} + namespace ksys { class OverlayArena; + +namespace util { +class TaskThread; } +} // namespace ksys namespace ksys::res { @@ -14,6 +22,8 @@ public: void insertOverlayArena(OverlayArena* arena); OverlayArena* getSomeArena() const; + util::TaskThread* makeResourceLoadingThread(sead::Heap* heap, bool use_game_task_thread); + private: static ResourceMgrTask* sInstance; }; diff --git a/src/KingSystem/Resource/resTaskRequest.cpp b/src/KingSystem/Resource/resTaskRequest.cpp new file mode 100644 index 00000000..85d649d1 --- /dev/null +++ b/src/KingSystem/Resource/resTaskRequest.cpp @@ -0,0 +1 @@ +#include "resTaskRequest.h" diff --git a/src/KingSystem/Resource/resTaskRequest.h b/src/KingSystem/Resource/resTaskRequest.h new file mode 100644 index 00000000..f9925417 --- /dev/null +++ b/src/KingSystem/Resource/resTaskRequest.h @@ -0,0 +1,25 @@ +#pragma once + +#include "KingSystem/Resource/resLoadRequest.h" +#include "KingSystem/Utils/Thread/Task.h" +#include "KingSystem/Utils/Types.h" + +namespace ksys::res { + +class Handle; +class ResourceUnit; + +class TaskRequest : public util::TaskRequest { + SEAD_RTTI_OVERRIDE(TaskRequest, util::TaskRequest) +public: + TaskRequest() = default; + + bool mHasResLoadReq = false; + ResourceUnit* mPackResUnit = nullptr; + Handle* mResHandle = nullptr; + sead::FixedSafeString<128> mResPath; + LoadRequest mResLoadReq; +}; +KSYS_CHECK_SIZE_NX150(TaskRequest, 0x180); + +} // namespace ksys::res diff --git a/src/KingSystem/Utils/CMakeLists.txt b/src/KingSystem/Utils/CMakeLists.txt index 544422c5..34aa8ef6 100644 --- a/src/KingSystem/Utils/CMakeLists.txt +++ b/src/KingSystem/Utils/CMakeLists.txt @@ -9,6 +9,7 @@ target_sources(uking PRIVATE Thread/ManagedTaskHandle.h Thread/Task.cpp Thread/Task.h + Thread/TaskData.h Thread/TaskMgr.cpp Thread/TaskMgr.h Thread/TaskQueueBase.cpp diff --git a/src/KingSystem/Utils/Thread/Task.h b/src/KingSystem/Utils/Thread/Task.h index 4b86abe6..fa5a020c 100644 --- a/src/KingSystem/Utils/Thread/Task.h +++ b/src/KingSystem/Utils/Thread/Task.h @@ -73,6 +73,8 @@ KSYS_CHECK_SIZE_NX150(TaskDelegateSetter, 0x10); class TaskRequest { SEAD_RTTI_BASE(TaskRequest) public: + // TODO: initialize the members + TaskRequest() = default; virtual ~TaskRequest() = default; bool mHasHandle; diff --git a/src/KingSystem/Utils/Thread/TaskData.h b/src/KingSystem/Utils/Thread/TaskData.h new file mode 100644 index 00000000..68db7ce0 --- /dev/null +++ b/src/KingSystem/Utils/Thread/TaskData.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +namespace ksys::util { + +class TaskData { + SEAD_RTTI_BASE(TaskData) +}; + +} // namespace ksys::util