blob: d1c60c73ee883028cc132c683c5efa2b54802e12 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
#include "egg/core/eggXfbManager.h"
#include "common.h"
#include "egg/core/eggXfb.h"
#include "nw4r/db/db_directPrint.h"
#include "rvl/VI.h" // IWYU pragma: export
namespace EGG {
bool XfbManager::isRegisterd(Xfb &xfb) const {
Xfb *x = mNextXfb;
Xfb *iter = x;
if (mNextXfb != nullptr) {
do {
if (iter == &xfb) {
return true;
}
iter = iter->mNext;
} while (iter != x);
}
return false;
}
bool XfbManager::attach(Xfb *xfb) {
int interrupts = OSDisableInterrupts();
bool u3 = 0;
if (xfb != nullptr && !isRegisterd(*xfb)) {
xfb->mState = Xfb::XFB_UNPROCESSED;
if (mNextXfb == nullptr) {
mNextXfb = xfb;
mToCopyXfb = xfb;
xfb->mNext = xfb;
xfb->mPrev = xfb;
} else {
mNextXfb->mPrev->mNext = xfb;
xfb->mPrev = mNextXfb->mPrev;
mNextXfb->mPrev = xfb;
xfb->mNext = mNextXfb;
}
u3 = 1;
mNumXfbs += 1;
mNumXfbs_Copy += 1;
}
OSRestoreInterrupts(interrupts);
return u3;
}
void XfbManager::copyEFB(bool bUpdate) {
if (mNumXfbs == 1 && mToCopyXfb == nullptr) {
mToCopyXfb = mNextXfb;
}
if (mToCopyXfb != nullptr) {
if (bUpdate) {
GXSetZMode(true, GX_ALWAYS, true);
GXSetAlphaUpdate(true);
GXSetColorUpdate(true);
}
GXCopyDisp(mToCopyXfb->mBuffer, bUpdate);
GXFlush();
GXDrawDone();
u32 interrupts = OSDisableInterrupts();
mToCopyXfb->mState = Xfb::XFB_COPIED;
if (mToShowXfb == nullptr) {
mToShowXfb = mToCopyXfb;
}
Xfb *next = mToCopyXfb->mNext->mState == Xfb::XFB_UNPROCESSED ? mToCopyXfb->mNext : nullptr;
mToCopyXfb = next;
OSRestoreInterrupts(interrupts);
}
}
void XfbManager::setNextFrameBuffer() {
if (mToShowXfb != nullptr) {
if (mNumXfbs_Copy > 2) {
mNumXfbs_Copy -= 1;
} else {
VISetNextFrameBuffer(mToShowXfb->mBuffer);
VIFlush();
nw4r::db::DirectPrint_ChangeXfb(mToShowXfb->mBuffer, mToShowXfb->mWidth, mToShowXfb->mHeight);
if (mNumXfbs > 1) {
mNextXfb->mState = Xfb::XFB_UNPROCESSED;
if (mToCopyXfb == nullptr) {
mToCopyXfb = mNextXfb;
}
mToShowXfb->mState = Xfb::XFB_SHOWN;
mNextXfb = mToShowXfb;
mToShowXfb = mToShowXfb->mNext->mState == Xfb::XFB_COPIED ? mToShowXfb->mNext : nullptr;
} else {
mToShowXfb->mState = Xfb::XFB_UNPROCESSED;
if (mToCopyXfb == nullptr) {
mToCopyXfb = mToShowXfb;
}
mToShowXfb = nullptr;
}
}
} else {
if (mNumXfbs == 1 && mNextXfb != nullptr) {
mNextXfb->mState = Xfb::XFB_UNPROCESSED;
mToCopyXfb = mNextXfb;
}
}
}
} // namespace EGG
|