ksys/res: Implement ResourceMgrTask::calc_ and fix MemoryTaskRequest

This commit is contained in:
Léo Lam 2020-10-10 13:30:21 +02:00
parent 78f64ca78c
commit 00b9296aa9
No known key found for this signature in database
GPG Key ID: 0DF30F9081000741
8 changed files with 57 additions and 23 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -6,6 +6,8 @@ namespace ksys::res {
class TextureHandleMgr {
public:
virtual ~TextureHandleMgr();
void clearAllCache();
};
} // namespace ksys::res

View File

@ -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() {

View File

@ -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);

View File

@ -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);