From 00b9296aa9f9598cc483ba4598d9b84e4b732208 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Lam?= Date: Sat, 10 Oct 2020 13:30:21 +0200 Subject: [PATCH] ksys/res: Implement ResourceMgrTask::calc_ and fix MemoryTaskRequest --- data/uking_functions.csv | 10 ++++---- src/KingSystem/Resource/resMemoryTask.h | 2 +- .../Resource/resResourceMgrTask.cpp | 23 +++++++++++++++++++ src/KingSystem/Resource/resResourceMgrTask.h | 12 +++++++++- src/KingSystem/Resource/resTextureHandleMgr.h | 2 ++ src/KingSystem/Utils/Thread/Task.cpp | 4 ++-- src/KingSystem/Utils/Thread/Task.h | 21 ++++++++--------- src/KingSystem/Utils/Thread/TaskMgr.h | 6 ++--- 8 files changed, 57 insertions(+), 23 deletions(-) diff --git a/data/uking_functions.csv b/data/uking_functions.csv index 8e71f334..a8a940c9 100644 --- a/data/uking_functions.csv +++ b/data/uking_functions.csv @@ -90885,7 +90885,7 @@ 0x00000071012065b0,res::ResourceMgrTask::doLoadOnThread,152, 0x0000007101206648,sub_7101206648,80, 0x0000007101206698,sub_7101206698,72, -0x00000071012066e0,res::ResourceMgrTask::calc,256, +0x00000071012066e0,res::ResourceMgrTask::calc,256,_ZN4ksys3res15ResourceMgrTask5calc_EPv 0x00000071012067e0,res::ResourceMgrTask::calculateOverlayArenaHeapSizeStuff,260, 0x00000071012068e4,res::compactionThreadFunc,352, 0x0000007101206a44,res::ResourceMgrTask::m,72, @@ -90929,7 +90929,7 @@ 0x000000710120a0a8,res::ResourceMgrTask::clearCacheForSync,524, 0x000000710120a2b4,res::ResourceMgrTask::n,144, 0x000000710120a344,res::ResourceMgrTask::deleteUnit,400, -0x000000710120a4d4,nullsub_4699,4, +0x000000710120a4d4,nullsub_4699,4,_ZN4ksys3res17MemoryTaskRequestD2Ev 0x000000710120a4d8,res::ResourceMgrTask::load,1292, 0x000000710120a9e4,canUseSdCard,8, 0x000000710120a9ec,return_0_0,8, @@ -90968,9 +90968,9 @@ 0x000000710120c858,EventPlusString::RequestEx::rtti1,204, 0x000000710120c924,EventPlusString::RequestEx::rtti2,92, 0x000000710120c980,EventPlusString::RequestEx::dtorDelete,56, -0x000000710120c9b8,sub_710120C9B8,204, -0x000000710120ca84,sub_710120CA84,92, -0x000000710120cae0,j__ZdlPv_1239,4, +0x000000710120c9b8,sub_710120C9B8,204,_ZNK4ksys3res17MemoryTaskRequest27checkDerivedRuntimeTypeInfoEPKN4sead15RuntimeTypeInfo9InterfaceE +0x000000710120ca84,sub_710120CA84,92,_ZNK4ksys3res17MemoryTaskRequest18getRuntimeTypeInfoEv +0x000000710120cae0,j__ZdlPv_1239,4,_ZN4ksys3res17MemoryTaskRequestD0Ev 0x000000710120cae4,sub_710120CAE4,184, 0x000000710120cb9c,sub_710120CB9C,80, 0x000000710120cbec,j__ZdlPv_1240,4, diff --git a/src/KingSystem/Resource/resMemoryTask.h b/src/KingSystem/Resource/resMemoryTask.h index 874120a9..03329c0c 100644 --- a/src/KingSystem/Resource/resMemoryTask.h +++ b/src/KingSystem/Resource/resMemoryTask.h @@ -42,7 +42,7 @@ public: bool mData_8 = false; s32 mData_c = -1; - sead::FixedSafeString<128> mData_mStr; + sead::SafeString mData_mStr; }; } // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceMgrTask.cpp b/src/KingSystem/Resource/resResourceMgrTask.cpp index 46bf3320..2a7df32d 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.cpp +++ b/src/KingSystem/Resource/resResourceMgrTask.cpp @@ -4,6 +4,7 @@ #include #include "KingSystem/Resource/resCompactedHeap.h" #include "KingSystem/Resource/resEntryFactory.h" +#include "KingSystem/Resource/resMemoryTask.h" #include "KingSystem/Resource/resSystem.h" #include "KingSystem/Resource/resTextureHandleList.h" #include "KingSystem/Resource/resTextureHandleMgr.h" @@ -98,4 +99,26 @@ util::TaskThread* ResourceMgrTask::makeResourceLoadingThread(sead::Heap* heap, sead::MessageQueue::BlockType::Blocking, 0x7fffffff, 0xa000, 32); } +bool ResourceMgrTask::calc_(void*) { + if (mCacheControlFlags.testAndClear(CacheControlFlag::ClearAllCachesRequested)) { + MemoryTaskRequest req; + req.mLaneId = u8(LaneId::_9); + req.mHasHandle = true; + req.mSynchronous = true; + req.mThread = mResourceMemoryThread; + req.mDelegate = &mClearAllCachesFn; + req.mName = "ClearAllCaches"; + req.mData_8 = false; + req.mData_c = -1; + + util::TaskMgrRequest request; + request.request = &req; + mResourceMemoryTaskMgr->submitRequest(request); + mTexHandleMgr->clearAllCache(); + stubbedLogFunction(); + } + clearUnits_(); + return true; +} + } // namespace ksys::res diff --git a/src/KingSystem/Resource/resResourceMgrTask.h b/src/KingSystem/Resource/resResourceMgrTask.h index f2dada0c..7778090d 100644 --- a/src/KingSystem/Resource/resResourceMgrTask.h +++ b/src/KingSystem/Resource/resResourceMgrTask.h @@ -102,6 +102,14 @@ private: }; + enum class CacheControlFlag : u8 { + ClearAllCachesRequested = 1, + }; + + enum class LaneId { + _9 = 9, + }; + using ResourceUnitDelegate = sead::Delegate1RFunc; using TaskCallback = sead::Delegate2Func; @@ -115,7 +123,9 @@ private: explicit ResourceMgrTask(const sead::TaskConstructArg& arg); ~ResourceMgrTask(); + bool calc_(void* userdata); bool callSystemCalc_(void* userdata); + void clearUnits_(); static void setInstance(ResourceMgrTask* task); static ResourceMgrTask* sInstance; @@ -131,7 +141,7 @@ private: InstancePtrClearer mInstancePtrClearer; sead::TypedBitFlag mFlags; - bool mClearAllCachesRequested = false; + sead::TypedBitFlag mCacheControlFlags; u32 _17c = 0; sead::Heap* mResSystemHeap = nullptr; util::TaskThread* mResourceLoadingThread = nullptr; diff --git a/src/KingSystem/Resource/resTextureHandleMgr.h b/src/KingSystem/Resource/resTextureHandleMgr.h index 35e01999..7e90d537 100644 --- a/src/KingSystem/Resource/resTextureHandleMgr.h +++ b/src/KingSystem/Resource/resTextureHandleMgr.h @@ -6,6 +6,8 @@ namespace ksys::res { class TextureHandleMgr { public: virtual ~TextureHandleMgr(); + + void clearAllCache(); }; } // namespace ksys::res diff --git a/src/KingSystem/Utils/Thread/Task.cpp b/src/KingSystem/Utils/Thread/Task.cpp index 7a3c3cff..e2ba464f 100644 --- a/src/KingSystem/Utils/Thread/Task.cpp +++ b/src/KingSystem/Utils/Thread/Task.cpp @@ -29,7 +29,7 @@ Task::~Task() { void Task::deleteDelegate_() { if (mDelegate && mFlags.isOn(Flag::DeleteDelegate) && mFlags.isOff(Flag::DoNotDeleteDelegate)) { - delete mDelegate; + ::operator delete(mDelegate); mDelegate = nullptr; } } @@ -170,7 +170,7 @@ void Task::removeFromQueue2() { void Task::run_() { if (mDelegate) - mDelegateResult = (*mDelegate)(mUserData); + mDelegateResult = mDelegate->invoke(mUserData); } bool Task::wait() { diff --git a/src/KingSystem/Utils/Thread/Task.h b/src/KingSystem/Utils/Thread/Task.h index fa5a020c..57ff1f51 100644 --- a/src/KingSystem/Utils/Thread/Task.h +++ b/src/KingSystem/Utils/Thread/Task.h @@ -50,7 +50,7 @@ public: }; KSYS_CHECK_SIZE_NX150(TaskRemoveCallbackContext, 0x18); -using TaskDelegate = sead::AnyDelegate1R; +using TaskDelegate = sead::IDelegate1R; using TaskPostRunCallback = sead::IDelegate2; using TaskRemoveCallback = sead::IDelegate1; @@ -73,20 +73,19 @@ KSYS_CHECK_SIZE_NX150(TaskDelegateSetter, 0x10); class TaskRequest { SEAD_RTTI_BASE(TaskRequest) public: - // TODO: initialize the members TaskRequest() = default; virtual ~TaskRequest() = default; - bool mHasHandle; + bool mHasHandle = true; /// If true, request submissions will block until the request is processed. - bool mSynchronous; - u8 mLaneId; - TaskThread* mThread; - TaskQueueBase* mQueue; - TaskDelegate* mDelegate; - void* mUserData; - TaskRemoveCallback* mRemoveCallback; - TaskPostRunCallback* mPostRunCallback; + bool mSynchronous = true; + u8 mLaneId = 0; + TaskThread* mThread = nullptr; + TaskQueueBase* mQueue = nullptr; + TaskDelegate* mDelegate = nullptr; + void* mUserData = nullptr; + TaskRemoveCallback* mRemoveCallback = nullptr; + TaskPostRunCallback* mPostRunCallback = nullptr; sead::SafeString mName; }; KSYS_CHECK_SIZE_NX150(TaskRequest, 0x50); diff --git a/src/KingSystem/Utils/Thread/TaskMgr.h b/src/KingSystem/Utils/Thread/TaskMgr.h index f3b7e050..b200e5f1 100644 --- a/src/KingSystem/Utils/Thread/TaskMgr.h +++ b/src/KingSystem/Utils/Thread/TaskMgr.h @@ -25,11 +25,11 @@ using ManagedTaskFactory = sead::IDelegate1; struct TaskMgrRequest { /// Optional. If null, a task from the internal buffer will be used. - ManagedTask* task; + ManagedTask* task = nullptr; /// Must not be null. - TaskRequest* request; + TaskRequest* request = nullptr; /// Optional. - ManagedTaskHandle* handle; + ManagedTaskHandle* handle = nullptr; }; KSYS_CHECK_SIZE_NX150(TaskMgrRequest, 0x18);