Skip to content

Commit 6628fc3

Browse files
committed
pagemanager: mostly map out structs
1 parent 78917bd commit 6628fc3

File tree

3 files changed

+103
-54
lines changed

3 files changed

+103
-54
lines changed

game/overlord/jak3/iso_structs.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,17 @@ namespace jak3 {
99
enum class EFileComp { MODE0, MODE1, KNOWN_NOT_BLZO };
1010

1111
struct ISOBuffer {
12+
public:
13+
void AdjustDataLength(int);
14+
void AdvanceCurrentData(int);
15+
void SetDataLength(int length) { m_nDataLength = length; }
16+
int GetDataLength() { return m_nDataLength; }
17+
18+
private:
1219
CPageManager::CPageList* m_pActivePages;
1320
u8* decomp_buffer;
1421
int decompressed_size;
15-
16-
void AdjustDataLength(int);
17-
void AdvanceCurrentData(int);
22+
int m_nDataLength;
1823
};
1924

2025
struct VagDirEntryJak3 {

game/overlord/jak3/pagemanager.cpp

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
#include "pagemanager.h"
22

3+
#include <cstring>
4+
5+
#include "common/util/Assert.h"
6+
37
#include "game/sce/iop.h"
48

59
namespace jak3 {
@@ -8,32 +12,17 @@ using namespace iop;
812
static constexpr u32 PAGE_SIZE = 0x8010;
913
static constexpr u32 NUM_PAGES = 29;
1014

11-
static inline int ctz(u32 x) {
12-
// Isolate lowest bit and subtract 1
13-
x = (x & -x) - 1;
14-
15-
// popcount
16-
x -= (x >> 1) & 0x55555555;
17-
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
18-
x = (x + (x >> 4)) & 0x0f0f0f0f;
19-
x += (x >> 8);
20-
x += (x >> 16);
21-
x &= 0x3f;
22-
23-
return static_cast<int>(x);
24-
}
25-
2615
CPageManager::CPage::CPage(u8* start, u8* end, int page_id) {
2716
m_pNextPage = nullptr;
2817
m_uPageBit = 1 << (page_id & 0x1f);
29-
m_nUnk = 0;
18+
m_nPageState = 0;
3019
m_pData = start;
31-
m_pEnd = end;
32-
m_nRefCount = 0;
20+
m_pDataEnd = end;
21+
m_nPageRefCount = 0;
3322
m_nPageID = page_id;
34-
m_nDmaRefCount = 0;
23+
m_nPageDmaRefCount = 0;
3524
m_nAllocState = 0;
36-
m_nUnk2 = 0;
25+
m_nPageState = 0;
3726
}
3827

3928
int CPageManager::CPage::AddRef() {
@@ -42,9 +31,9 @@ int CPageManager::CPage::AddRef() {
4231
CpuSuspendIntr(&state);
4332

4433
if (m_nAllocState == 1 && m_pPageList != nullptr) {
45-
m_pPageList->m_nRefCount++;
46-
m_nRefCount++;
47-
ret = m_nRefCount;
34+
m_pPageList->m_nListRefCount++;
35+
m_nPageRefCount++;
36+
ret = m_nPageRefCount;
4837
}
4938

5039
CpuResumeIntr(state);
@@ -58,9 +47,9 @@ int CPageManager::CPage::ReleaseRef() {
5847
CpuSuspendIntr(&state);
5948

6049
if (m_nAllocState == 1 && m_pPageList != nullptr) {
61-
m_pPageList->m_nRefCount--;
62-
m_nRefCount--;
63-
ret = m_nRefCount;
50+
m_pPageList->m_nListRefCount--;
51+
m_nPageRefCount--;
52+
ret = m_nPageRefCount;
6453
}
6554

6655
CpuResumeIntr(state);
@@ -74,9 +63,9 @@ int CPageManager::CPage::AddDmaRef() {
7463
CpuSuspendIntr(&state);
7564

7665
if (m_nAllocState == 1 && m_pPageList != nullptr) {
77-
m_pPageList->m_nDmaRefCount++;
78-
m_nDmaRefCount++;
79-
ret = m_nDmaRefCount;
66+
m_pPageList->m_nListDmaRefCount++;
67+
m_nPageDmaRefCount++;
68+
ret = m_nPageDmaRefCount;
8069
}
8170

8271
CpuResumeIntr(state);
@@ -90,9 +79,9 @@ int CPageManager::CPage::ReleaseDmaRef() {
9079
CpuSuspendIntr(&state);
9180

9281
if (m_nAllocState == 1 && m_pPageList != nullptr) {
93-
m_pPageList->m_nDmaRefCount--;
94-
m_nDmaRefCount--;
95-
ret = m_nDmaRefCount;
82+
m_pPageList->m_nListDmaRefCount--;
83+
m_nPageDmaRefCount--;
84+
ret = m_nPageDmaRefCount;
9685
}
9786

9887
CpuResumeIntr(state);
@@ -101,20 +90,37 @@ int CPageManager::CPage::ReleaseDmaRef() {
10190
}
10291

10392
void CPageManager::CPage::FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes) {
93+
int nInputPageLengthLeft;
94+
CPage* page = this;
95+
10496
if (nNumBytes <= 0) {
10597
return;
10698
}
10799

108-
}
100+
for (;;) {
101+
nInputPageLengthLeft = (uintptr_t)page->m_pDataEnd + (1 - (uintptr_t)pInPageData);
102+
if (nInputPageLengthLeft <= nNumBytes) {
103+
break;
104+
}
109105

110-
void CPageManager::Initialize() {
111-
m_Cache.Initialize();
106+
if (nNumBytes <= 0) {
107+
nNumBytes -= nInputPageLengthLeft;
108+
return;
109+
}
110+
111+
ASSERT(m_pNextPage != nullptr);
112+
113+
page = page->m_pNextPage;
114+
pInPageData = page->m_pData;
115+
}
116+
117+
memcpy(pDest, pInPageData, nNumBytes);
112118
}
113119

114120
CPageManager::CCache::CCache() {
115121
m_paCache = nullptr;
116122
m_uAllocatedPageMap = 0;
117-
m_uFreePageMap = (1 << NUM_PAGES) - 1;
123+
m_Unk = (1 << NUM_PAGES) - 1;
118124
}
119125

120126
int CPageManager::CCache::Initialize() {
@@ -125,8 +131,8 @@ int CPageManager::CCache::Initialize() {
125131

126132
m_nNumFree = 29;
127133

128-
/* TODO FIXME */
129134
for (auto& pl : m_aPageLists) {
135+
pl = {};
130136
}
131137

132138
int page_idx = 0;
@@ -141,4 +147,12 @@ int CPageManager::CCache::Initialize() {
141147
return 0;
142148
}
143149

150+
void CPageManager::Initialize() {
151+
m_Cache.Initialize();
152+
}
153+
154+
int CPageManager::TryFreePages(int nPages) {
155+
return 0;
156+
}
157+
144158
} // namespace jak3

game/overlord/jak3/pagemanager.h

Lines changed: 44 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ class CPageManager {
77
public:
88
class CPageList;
99

10+
enum class AllocState {
11+
EPLAS_FREE,
12+
EPLAS_ALLOCATED,
13+
};
14+
1015
class CPage {
1116
public:
1217
CPage() = default;
@@ -16,19 +21,28 @@ class CPageManager {
1621
int AddDmaRef();
1722
int ReleaseDmaRef();
1823
void FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes);
24+
u8* GetStart() const;
25+
u8* GetEnd() const;
26+
bool IsReferenced() { return m_nPageRefCount != 0 || m_nPageDmaRefCount != 0; }
27+
bool IsFilled() const; // Exists as string in july version, not sure on impl
28+
bool IsAllocated() const;
29+
void SetPageInputState(int state); // enum
30+
int GetPageCacheIndex() const;
31+
CPage* GetNextPage() const;
32+
CPage* GetPrevPage() const;
1933

2034
private:
2135
CPage* m_pNextPage;
22-
u32 m_uPageBit;
23-
u32 m_nUnk;
36+
CPage* m_pPrevPage;
2437
CPageList* m_pPageList;
38+
int m_nPageRefCount;
39+
int m_nPageDmaRefCount;
40+
int m_nAllocState;
41+
u32 m_nPageState; // 3: filled otherwise unk?
2542
u8* m_pData;
26-
u8* m_pEnd; // maybe
27-
int m_nRefCount;
28-
int m_nDmaRefCount;
43+
u8* m_pDataEnd;
2944
int m_nPageID;
30-
int m_nAllocState;
31-
int m_nUnk2;
45+
u32 m_uPageBit;
3246
};
3347

3448
class CPageList {
@@ -39,18 +53,33 @@ class CPageManager {
3953
int CancelActivePages();
4054
CPage* StepActivePage();
4155
void GarbageCollect();
56+
CPage* GetCurrentActivePage() const;
57+
int GetNumRawPages() const;
58+
int GetFirstRawPage() const;
59+
int GetNumUnsteppedPages() const;
60+
bool IsReferenced() { return m_nListRefCount != 0 || m_nListDmaRefCount != 0; }
61+
int GetNumActivePages() const;
4262

4363
private:
44-
int m_nRefCount;
45-
int m_nDmaRefCount;
64+
CPage* m_pFirstPage;
65+
CPage* m_pLastPage;
66+
CPage* m_pFirstACtivePage;
67+
CPage* m_pLastActivePage;
68+
CPage* m_pCurrentActivePage;
69+
int m_nNumPages;
70+
int m_nNumActivePages;
71+
int m_nNumUnsteppedPages;
72+
int m_nListRefCount;
73+
int m_nListDmaRefCount;
74+
int m_nAllocState;
4675
};
4776

4877
void Initialize();
4978
CPageList* AllocPageListBytes(int nBytes, char unk);
5079
CPageList* AllocPageList(int nPages, char unk);
5180
CPageList* GrowPageList(CPageList* list, char nPages);
5281
int FreePageList(CPageList* list);
53-
int Unk(int nUnk);
82+
int TryFreePages(int nUnk);
5483
void GarbageCollect();
5584

5685
private:
@@ -59,15 +88,16 @@ class CPageManager {
5988
CCache();
6089
int Initialize();
6190

62-
private:
63-
int m_nEventFlag;
6491
void* m_paCache;
6592
CPageList m_aPageLists[29];
6693
CPage m_aPages[29];
67-
u32 m_uAllocatedPageMap;
68-
u32 m_uFreePageMap;
6994
int m_nNumFree;
95+
u32 m_uAllocatedPageMap;
96+
u32 m_uAllocatedListMap;
97+
int m_nEventFlag;
98+
u32 m_Unk;
7099
};
100+
71101
CCache m_Cache;
72102
};
73103

0 commit comments

Comments
 (0)