11#include " pagemanager.h"
22
3+ #include < cstring>
4+
5+ #include " common/util/Assert.h"
6+
37#include " game/sce/iop.h"
48
59namespace jak3 {
@@ -8,32 +12,17 @@ using namespace iop;
812static constexpr u32 PAGE_SIZE = 0x8010 ;
913static 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-
2615CPageManager::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
3928int 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
10392void 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
114120CPageManager::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
120126int 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
0 commit comments