mirror of https://github.com/zeldaret/botw.git
ksys/res: Implement ResourceMgrTask::calc_ and fix MemoryTaskRequest
This commit is contained in:
parent
78f64ca78c
commit
00b9296aa9
|
@ -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,
|
||||
|
|
Can't render this file because it is too large.
|
|
@ -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
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <thread/seadThreadUtil.h>
|
||||
#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
|
||||
|
|
|
@ -102,6 +102,14 @@ private:
|
|||
|
||||
};
|
||||
|
||||
enum class CacheControlFlag : u8 {
|
||||
ClearAllCachesRequested = 1,
|
||||
};
|
||||
|
||||
enum class LaneId {
|
||||
_9 = 9,
|
||||
};
|
||||
|
||||
using ResourceUnitDelegate = sead::Delegate1RFunc<void*, bool>;
|
||||
using TaskCallback =
|
||||
sead::Delegate2Func<util::TaskPostRunResult*, const util::TaskPostRunContext&>;
|
||||
|
@ -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<Flag> mFlags;
|
||||
bool mClearAllCachesRequested = false;
|
||||
sead::TypedBitFlag<CacheControlFlag> mCacheControlFlags;
|
||||
u32 _17c = 0;
|
||||
sead::Heap* mResSystemHeap = nullptr;
|
||||
util::TaskThread* mResourceLoadingThread = nullptr;
|
||||
|
|
|
@ -6,6 +6,8 @@ namespace ksys::res {
|
|||
class TextureHandleMgr {
|
||||
public:
|
||||
virtual ~TextureHandleMgr();
|
||||
|
||||
void clearAllCache();
|
||||
};
|
||||
|
||||
} // namespace ksys::res
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -50,7 +50,7 @@ public:
|
|||
};
|
||||
KSYS_CHECK_SIZE_NX150(TaskRemoveCallbackContext, 0x18);
|
||||
|
||||
using TaskDelegate = sead::AnyDelegate1R<void*, bool>;
|
||||
using TaskDelegate = sead::IDelegate1R<void*, bool>;
|
||||
using TaskPostRunCallback = sead::IDelegate2<TaskPostRunResult*, const TaskPostRunContext&>;
|
||||
using TaskRemoveCallback = sead::IDelegate1<const TaskRemoveCallbackContext&>;
|
||||
|
||||
|
@ -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);
|
||||
|
|
|
@ -25,11 +25,11 @@ using ManagedTaskFactory = sead::IDelegate1<ManagedTask**>;
|
|||
|
||||
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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue