mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 11:26:18 -04:00
pagemanager: mostly map out structs
This commit is contained in:
parent
78917bd96e
commit
6628fc3600
|
@ -9,12 +9,17 @@ namespace jak3 {
|
|||
enum class EFileComp { MODE0, MODE1, KNOWN_NOT_BLZO };
|
||||
|
||||
struct ISOBuffer {
|
||||
public:
|
||||
void AdjustDataLength(int);
|
||||
void AdvanceCurrentData(int);
|
||||
void SetDataLength(int length) { m_nDataLength = length; }
|
||||
int GetDataLength() { return m_nDataLength; }
|
||||
|
||||
private:
|
||||
CPageManager::CPageList* m_pActivePages;
|
||||
u8* decomp_buffer;
|
||||
int decompressed_size;
|
||||
|
||||
void AdjustDataLength(int);
|
||||
void AdvanceCurrentData(int);
|
||||
int m_nDataLength;
|
||||
};
|
||||
|
||||
struct VagDirEntryJak3 {
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
#include "pagemanager.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "common/util/Assert.h"
|
||||
|
||||
#include "game/sce/iop.h"
|
||||
|
||||
namespace jak3 {
|
||||
|
@ -8,32 +12,17 @@ using namespace iop;
|
|||
static constexpr u32 PAGE_SIZE = 0x8010;
|
||||
static constexpr u32 NUM_PAGES = 29;
|
||||
|
||||
static inline int ctz(u32 x) {
|
||||
// Isolate lowest bit and subtract 1
|
||||
x = (x & -x) - 1;
|
||||
|
||||
// popcount
|
||||
x -= (x >> 1) & 0x55555555;
|
||||
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
||||
x = (x + (x >> 4)) & 0x0f0f0f0f;
|
||||
x += (x >> 8);
|
||||
x += (x >> 16);
|
||||
x &= 0x3f;
|
||||
|
||||
return static_cast<int>(x);
|
||||
}
|
||||
|
||||
CPageManager::CPage::CPage(u8* start, u8* end, int page_id) {
|
||||
m_pNextPage = nullptr;
|
||||
m_uPageBit = 1 << (page_id & 0x1f);
|
||||
m_nUnk = 0;
|
||||
m_nPageState = 0;
|
||||
m_pData = start;
|
||||
m_pEnd = end;
|
||||
m_nRefCount = 0;
|
||||
m_pDataEnd = end;
|
||||
m_nPageRefCount = 0;
|
||||
m_nPageID = page_id;
|
||||
m_nDmaRefCount = 0;
|
||||
m_nPageDmaRefCount = 0;
|
||||
m_nAllocState = 0;
|
||||
m_nUnk2 = 0;
|
||||
m_nPageState = 0;
|
||||
}
|
||||
|
||||
int CPageManager::CPage::AddRef() {
|
||||
|
@ -42,9 +31,9 @@ int CPageManager::CPage::AddRef() {
|
|||
CpuSuspendIntr(&state);
|
||||
|
||||
if (m_nAllocState == 1 && m_pPageList != nullptr) {
|
||||
m_pPageList->m_nRefCount++;
|
||||
m_nRefCount++;
|
||||
ret = m_nRefCount;
|
||||
m_pPageList->m_nListRefCount++;
|
||||
m_nPageRefCount++;
|
||||
ret = m_nPageRefCount;
|
||||
}
|
||||
|
||||
CpuResumeIntr(state);
|
||||
|
@ -58,9 +47,9 @@ int CPageManager::CPage::ReleaseRef() {
|
|||
CpuSuspendIntr(&state);
|
||||
|
||||
if (m_nAllocState == 1 && m_pPageList != nullptr) {
|
||||
m_pPageList->m_nRefCount--;
|
||||
m_nRefCount--;
|
||||
ret = m_nRefCount;
|
||||
m_pPageList->m_nListRefCount--;
|
||||
m_nPageRefCount--;
|
||||
ret = m_nPageRefCount;
|
||||
}
|
||||
|
||||
CpuResumeIntr(state);
|
||||
|
@ -74,9 +63,9 @@ int CPageManager::CPage::AddDmaRef() {
|
|||
CpuSuspendIntr(&state);
|
||||
|
||||
if (m_nAllocState == 1 && m_pPageList != nullptr) {
|
||||
m_pPageList->m_nDmaRefCount++;
|
||||
m_nDmaRefCount++;
|
||||
ret = m_nDmaRefCount;
|
||||
m_pPageList->m_nListDmaRefCount++;
|
||||
m_nPageDmaRefCount++;
|
||||
ret = m_nPageDmaRefCount;
|
||||
}
|
||||
|
||||
CpuResumeIntr(state);
|
||||
|
@ -90,9 +79,9 @@ int CPageManager::CPage::ReleaseDmaRef() {
|
|||
CpuSuspendIntr(&state);
|
||||
|
||||
if (m_nAllocState == 1 && m_pPageList != nullptr) {
|
||||
m_pPageList->m_nDmaRefCount--;
|
||||
m_nDmaRefCount--;
|
||||
ret = m_nDmaRefCount;
|
||||
m_pPageList->m_nListDmaRefCount--;
|
||||
m_nPageDmaRefCount--;
|
||||
ret = m_nPageDmaRefCount;
|
||||
}
|
||||
|
||||
CpuResumeIntr(state);
|
||||
|
@ -101,20 +90,37 @@ int CPageManager::CPage::ReleaseDmaRef() {
|
|||
}
|
||||
|
||||
void CPageManager::CPage::FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes) {
|
||||
int nInputPageLengthLeft;
|
||||
CPage* page = this;
|
||||
|
||||
if (nNumBytes <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
for (;;) {
|
||||
nInputPageLengthLeft = (uintptr_t)page->m_pDataEnd + (1 - (uintptr_t)pInPageData);
|
||||
if (nInputPageLengthLeft <= nNumBytes) {
|
||||
break;
|
||||
}
|
||||
|
||||
void CPageManager::Initialize() {
|
||||
m_Cache.Initialize();
|
||||
if (nNumBytes <= 0) {
|
||||
nNumBytes -= nInputPageLengthLeft;
|
||||
return;
|
||||
}
|
||||
|
||||
ASSERT(m_pNextPage != nullptr);
|
||||
|
||||
page = page->m_pNextPage;
|
||||
pInPageData = page->m_pData;
|
||||
}
|
||||
|
||||
memcpy(pDest, pInPageData, nNumBytes);
|
||||
}
|
||||
|
||||
CPageManager::CCache::CCache() {
|
||||
m_paCache = nullptr;
|
||||
m_uAllocatedPageMap = 0;
|
||||
m_uFreePageMap = (1 << NUM_PAGES) - 1;
|
||||
m_Unk = (1 << NUM_PAGES) - 1;
|
||||
}
|
||||
|
||||
int CPageManager::CCache::Initialize() {
|
||||
|
@ -125,8 +131,8 @@ int CPageManager::CCache::Initialize() {
|
|||
|
||||
m_nNumFree = 29;
|
||||
|
||||
/* TODO FIXME */
|
||||
for (auto& pl : m_aPageLists) {
|
||||
pl = {};
|
||||
}
|
||||
|
||||
int page_idx = 0;
|
||||
|
@ -141,4 +147,12 @@ int CPageManager::CCache::Initialize() {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void CPageManager::Initialize() {
|
||||
m_Cache.Initialize();
|
||||
}
|
||||
|
||||
int CPageManager::TryFreePages(int nPages) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace jak3
|
||||
|
|
|
@ -7,6 +7,11 @@ class CPageManager {
|
|||
public:
|
||||
class CPageList;
|
||||
|
||||
enum class AllocState {
|
||||
EPLAS_FREE,
|
||||
EPLAS_ALLOCATED,
|
||||
};
|
||||
|
||||
class CPage {
|
||||
public:
|
||||
CPage() = default;
|
||||
|
@ -16,19 +21,28 @@ class CPageManager {
|
|||
int AddDmaRef();
|
||||
int ReleaseDmaRef();
|
||||
void FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes);
|
||||
u8* GetStart() const;
|
||||
u8* GetEnd() const;
|
||||
bool IsReferenced() { return m_nPageRefCount != 0 || m_nPageDmaRefCount != 0; }
|
||||
bool IsFilled() const; // Exists as string in july version, not sure on impl
|
||||
bool IsAllocated() const;
|
||||
void SetPageInputState(int state); // enum
|
||||
int GetPageCacheIndex() const;
|
||||
CPage* GetNextPage() const;
|
||||
CPage* GetPrevPage() const;
|
||||
|
||||
private:
|
||||
CPage* m_pNextPage;
|
||||
u32 m_uPageBit;
|
||||
u32 m_nUnk;
|
||||
CPage* m_pPrevPage;
|
||||
CPageList* m_pPageList;
|
||||
u8* m_pData;
|
||||
u8* m_pEnd; // maybe
|
||||
int m_nRefCount;
|
||||
int m_nDmaRefCount;
|
||||
int m_nPageID;
|
||||
int m_nPageRefCount;
|
||||
int m_nPageDmaRefCount;
|
||||
int m_nAllocState;
|
||||
int m_nUnk2;
|
||||
u32 m_nPageState; // 3: filled otherwise unk?
|
||||
u8* m_pData;
|
||||
u8* m_pDataEnd;
|
||||
int m_nPageID;
|
||||
u32 m_uPageBit;
|
||||
};
|
||||
|
||||
class CPageList {
|
||||
|
@ -39,10 +53,25 @@ class CPageManager {
|
|||
int CancelActivePages();
|
||||
CPage* StepActivePage();
|
||||
void GarbageCollect();
|
||||
CPage* GetCurrentActivePage() const;
|
||||
int GetNumRawPages() const;
|
||||
int GetFirstRawPage() const;
|
||||
int GetNumUnsteppedPages() const;
|
||||
bool IsReferenced() { return m_nListRefCount != 0 || m_nListDmaRefCount != 0; }
|
||||
int GetNumActivePages() const;
|
||||
|
||||
private:
|
||||
int m_nRefCount;
|
||||
int m_nDmaRefCount;
|
||||
CPage* m_pFirstPage;
|
||||
CPage* m_pLastPage;
|
||||
CPage* m_pFirstACtivePage;
|
||||
CPage* m_pLastActivePage;
|
||||
CPage* m_pCurrentActivePage;
|
||||
int m_nNumPages;
|
||||
int m_nNumActivePages;
|
||||
int m_nNumUnsteppedPages;
|
||||
int m_nListRefCount;
|
||||
int m_nListDmaRefCount;
|
||||
int m_nAllocState;
|
||||
};
|
||||
|
||||
void Initialize();
|
||||
|
@ -50,7 +79,7 @@ class CPageManager {
|
|||
CPageList* AllocPageList(int nPages, char unk);
|
||||
CPageList* GrowPageList(CPageList* list, char nPages);
|
||||
int FreePageList(CPageList* list);
|
||||
int Unk(int nUnk);
|
||||
int TryFreePages(int nUnk);
|
||||
void GarbageCollect();
|
||||
|
||||
private:
|
||||
|
@ -59,15 +88,16 @@ class CPageManager {
|
|||
CCache();
|
||||
int Initialize();
|
||||
|
||||
private:
|
||||
int m_nEventFlag;
|
||||
void* m_paCache;
|
||||
CPageList m_aPageLists[29];
|
||||
CPage m_aPages[29];
|
||||
u32 m_uAllocatedPageMap;
|
||||
u32 m_uFreePageMap;
|
||||
int m_nNumFree;
|
||||
u32 m_uAllocatedPageMap;
|
||||
u32 m_uAllocatedListMap;
|
||||
int m_nEventFlag;
|
||||
u32 m_Unk;
|
||||
};
|
||||
|
||||
CCache m_Cache;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue