Skip to content

Commit e4faa56

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

File tree

3 files changed

+99
-52
lines changed

3 files changed

+99
-52
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: 47 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,8 @@ int CPageManager::CCache::Initialize() {
141147
return 0;
142148
}
143149

150+
void CPageManager::Initialize() {
151+
m_Cache.Initialize();
152+
}
153+
144154
} // namespace jak3

game/overlord/jak3/pagemanager.h

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

10+
enum class AllocState {
11+
EPLAS_FREE,
12+
EPLAS_ALLOCATED,
13+
EPLAS_FILLED,
14+
};
15+
1016
class CPage {
1117
public:
1218
CPage() = default;
@@ -16,19 +22,28 @@ class CPageManager {
1622
int AddDmaRef();
1723
int ReleaseDmaRef();
1824
void FromPagesCopy(u8* pInPageData, u8* pDest, int nNumBytes);
25+
u8* GetStart() const;
26+
u8* GetEnd() const;
27+
bool IsReferenced() { return m_nPageRefCount != 0 || m_nPageDmaRefCount != 0; }
28+
bool IsFilled() const; // Exists as string in july version, not sure on impl
29+
bool IsAllocated() const;
30+
void SetPageInputState(int state); // enum
31+
int GetPageCacheIndex() const;
32+
CPage* GetNextPage() const;
33+
CPage* GetPrevPage() const;
1934

2035
private:
2136
CPage* m_pNextPage;
22-
u32 m_uPageBit;
23-
u32 m_nUnk;
37+
CPage* m_pPrevPage;
2438
CPageList* m_pPageList;
39+
int m_nPageRefCount;
40+
int m_nPageDmaRefCount;
41+
int m_nAllocState;
42+
u32 m_nPageState; // 3: filled otherwise unk?
2543
u8* m_pData;
26-
u8* m_pEnd; // maybe
27-
int m_nRefCount;
28-
int m_nDmaRefCount;
44+
u8* m_pDataEnd;
2945
int m_nPageID;
30-
int m_nAllocState;
31-
int m_nUnk2;
46+
u32 m_uPageBit;
3247
};
3348

3449
class CPageList {
@@ -39,10 +54,25 @@ class CPageManager {
3954
int CancelActivePages();
4055
CPage* StepActivePage();
4156
void GarbageCollect();
57+
CPage* GetCurrentActivePage() const;
58+
int GetNumRawPages() const;
59+
int GetFirstRawPage() const;
60+
int GetNumUnsteppedPages() const;
61+
bool IsReferenced() { return m_nListRefCount != 0 || m_nListDmaRefCount != 0; }
62+
int GetNumActivePages() const;
4263

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

4878
void Initialize();
@@ -60,14 +90,16 @@ class CPageManager {
6090
int Initialize();
6191

6292
private:
63-
int m_nEventFlag;
6493
void* m_paCache;
6594
CPageList m_aPageLists[29];
6695
CPage m_aPages[29];
67-
u32 m_uAllocatedPageMap;
68-
u32 m_uFreePageMap;
6996
int m_nNumFree;
97+
u32 m_uAllocatedPageMap;
98+
u32 m_uAllocatedListMap;
99+
int m_nEventFlag;
100+
u32 m_Unk;
70101
};
102+
71103
CCache m_Cache;
72104
};
73105

0 commit comments

Comments
 (0)