Schedule level pool to be freed at a later time

This commit is contained in:
MysterD 2023-05-15 12:03:57 -07:00
parent 2eb2b8c18f
commit ef9f323b9c
4 changed files with 28 additions and 3 deletions

View file

@ -966,6 +966,7 @@ void DynOS_MovtexQC_ModShutdown();
struct GraphNode* DynOS_Model_LoadGeo(enum ModelPool aModelPool, void* aAsset); struct GraphNode* DynOS_Model_LoadGeo(enum ModelPool aModelPool, void* aAsset);
struct GraphNode* DynOS_Model_LoadDl(enum ModelPool aModelPool, u8 aLayer, void* aAsset); struct GraphNode* DynOS_Model_LoadDl(enum ModelPool aModelPool, u8 aLayer, void* aAsset);
void DynOS_Model_ClearPool(enum ModelPool aModelPool); void DynOS_Model_ClearPool(enum ModelPool aModelPool);
void DynOS_Model_Update();
// //
// Bin // Bin

View file

@ -14,6 +14,7 @@ void *dynos_update_cmd(void *cmd) {
} }
void dynos_update_gfx() { void dynos_update_gfx() {
DynOS_Model_Update();
return DynOS_UpdateGfx(); return DynOS_UpdateGfx();
} }

View file

@ -1,4 +1,5 @@
#include <map> #include <map>
#include <vector>
#include "dynos.cpp.h" #include "dynos.cpp.h"
extern "C" { extern "C" {
@ -6,8 +7,14 @@ extern "C" {
#include "engine/graph_node.h" #include "engine/graph_node.h"
} }
struct ScheduledFreePool {
struct DynamicPool* pool;
u32 timeout;
};
static struct DynamicPool* sModelPools[MODEL_POOL_MAX] = { 0 }; static struct DynamicPool* sModelPools[MODEL_POOL_MAX] = { 0 };
static std::map<void*, struct GraphNode*> sModelMap[MODEL_POOL_MAX]; static std::map<void*, struct GraphNode*> sModelMap[MODEL_POOL_MAX];
static std::vector<struct ScheduledFreePool> sPoolsToFree;
struct GraphNode* DynOS_Model_LoadGeo(enum ModelPool aModelPool, void* aAsset) { struct GraphNode* DynOS_Model_LoadGeo(enum ModelPool aModelPool, void* aAsset) {
// sanity check pool // sanity check pool
@ -58,11 +65,27 @@ struct GraphNode* DynOS_Model_LoadDl(enum ModelPool aModelPool, u8 aLayer, void*
void DynOS_Model_ClearPool(enum ModelPool aModelPool) { void DynOS_Model_ClearPool(enum ModelPool aModelPool) {
if (!sModelPools[aModelPool]) { return; } if (!sModelPools[aModelPool]) { return; }
// free and realloc pool // schedule pool to be freed
dynamic_pool_free_pool(sModelPools[aModelPool]); sPoolsToFree.push_back({
.pool = sModelPools[aModelPool],
.timeout = 30
});
// clear pointer
sModelPools[aModelPool] = NULL; sModelPools[aModelPool] = NULL;
// clear map // clear map
auto& map = sModelMap[aModelPool]; auto& map = sModelMap[aModelPool];
map.clear(); map.clear();
} }
void DynOS_Model_Update() {
for (auto it = sPoolsToFree.begin(); it != sPoolsToFree.end(); ) {
if (--it->timeout <= 0) {
dynamic_pool_free_pool(it->pool);
it = sPoolsToFree.erase(it);
} else {
it++;
}
}
}

View file

@ -185,7 +185,7 @@ void DynOS_Warp_SetParam(s32 aLevel, s32 aIndex) {
break; break;
case LEVEL_WDW: case LEVEL_WDW:
if (gEnvironmentRegions) { if (gEnvironmentRegions && gEnvironmentRegionsLength > 6) {
switch (aIndex) { switch (aIndex) {
case 1: gEnvironmentRegions[6] = *gEnvironmentLevels = 31; gWdwWaterLevelSet = 1; break; case 1: gEnvironmentRegions[6] = *gEnvironmentLevels = 31; gWdwWaterLevelSet = 1; break;
case 2: gEnvironmentRegions[6] = *gEnvironmentLevels = 1024; gWdwWaterLevelSet = 1; break; case 2: gEnvironmentRegions[6] = *gEnvironmentLevels = 1024; gWdwWaterLevelSet = 1; break;