summaryrefslogtreecommitdiff
path: root/libs/JSystem/JUtility/JUTXfb.cpp
blob: 04ebac0b48f51479870a4b229ec4b953806111fd (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
//
// Generated By: dol2asm
// Translation Unit: JUTXfb
//

#include "JSystem/JUtility/JUTXfb.h"
#include "JSystem/JKernel/JKRHeap.h"
#include "dolphin/gx.h"

//
// Forward References:
//

extern "C" void clearIndex__6JUTXfbFv();
extern "C" void common_init__6JUTXfbFi();
extern "C" void __ct__6JUTXfbFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumber();
extern "C" void __dt__6JUTXfbFv();
extern "C" void delXfb__6JUTXfbFi();
extern "C" void createManager__6JUTXfbFP7JKRHeapQ26JUTXfb10EXfbNumber();
extern "C" void destroyManager__6JUTXfbFv();
extern "C" void initiate__6JUTXfbFUsUsP7JKRHeapQ26JUTXfb10EXfbNumber();
extern "C" u8 sManager__6JUTXfb[4 + 4 /* padding */];

//
// External References:
//

extern "C" void* __nw__FUl();
extern "C" void* __nwa__FUlP7JKRHeapi();
extern "C" void __dl__FPv();
extern "C" void _savegpr_27();
extern "C" void _savegpr_28();
extern "C" void _savegpr_29();
extern "C" void _restgpr_27();
extern "C" void _restgpr_28();
extern "C" void _restgpr_29();
extern "C" u8 sSystemHeap__7JKRHeap[4];
extern "C" u8 sManager__8JUTVideo[4];

//
// Declarations:
//

void JUTXfb::clearIndex() {
    mDrawingXfbIndex = -1;
    mDrawnXfbIndex = -1;
    mDisplayingXfbIndex = -1;
}

void JUTXfb::common_init(int bufNum) {
    mBufferNum = bufNum;
    clearIndex();
    mSDrawingFlag = 99;
}

/* 802E5260-802E5308 2DFBA0 00A8+00 1/1 0/0 0/0 .text
 * __ct__6JUTXfbFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumber */
#ifdef NONMATCHING
JUTXfb::JUTXfb(_GXRenderModeObj const* pObj, JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) {
    common_init(xfbNum);

    if (pObj) {
        initiate(pObj->fb_width, pObj->xfb_height, pHeap, xfbNum);
    } else {
        //_GXRenderModeObj* renderObj = JUTVideo::getManager()->getRenderMode();
        u16 fb_width = JUTVideo::getManager()->getRenderMode()->fb_width;
        u16 efb_height = JUTVideo::getManager()->getRenderMode()->efb_height;
        u16 xfb_height = JUTVideo::getManager()->getRenderMode()->xfb_height;
        f32 scale_factor = GXGetYScaleFactor(efb_height, xfb_height);

        initiate(fb_width, GXGetNumXfbLines(efb_height, scale_factor), pHeap, xfbNum);
    }
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm JUTXfb::JUTXfb(_GXRenderModeObj const* param_0, JKRHeap* param_1,
                   JUTXfb::EXfbNumber param_2){nofralloc
#include "asm/JSystem/JUtility/JUTXfb/__ct__6JUTXfbFPC16_GXRenderModeObjP7JKRHeapQ26JUTXfb10EXfbNumber.s"
}
#pragma pop
#endif

JUTXfb* JUTXfb::sManager;

JUTXfb::~JUTXfb() {
    for (int i = 0; i < 3; i++) {
        delXfb(i);
    }
    sManager = NULL;
}

void JUTXfb::delXfb(int xfbIdx) {
    if (mXfbAllocated[xfbIdx] && mBuffer[xfbIdx]) {
        delete mBuffer[xfbIdx];
    }
}

JUTXfb* JUTXfb::createManager(JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) {
    if (sManager == NULL) {
        sManager = new JUTXfb(NULL, pHeap, xfbNum);
    }
    return sManager;
}

void JUTXfb::destroyManager() {
    delete sManager;
    sManager = NULL;
}

void JUTXfb::initiate(u16 width, u16 height, JKRHeap* pHeap, JUTXfb::EXfbNumber xfbNum) {
    if (pHeap == NULL) {
        pHeap = JKRHeap::getSystemHeap();
    }

    int size = ((u32)width + 0xf & 0xfff0) * (u32)height * 2;

    void* buf = ::operator new[](size, pHeap, 0x20);
    mBuffer[0] = buf;
    mXfbAllocated[0] = true;

    if (xfbNum >= 2) {
        buf = ::operator new[](size, pHeap, 0x20);
        mBuffer[1] = buf;
        mXfbAllocated[1] = true;
    } else {
        mBuffer[1] = NULL;
        mXfbAllocated[1] = false;
    }

    if (xfbNum >= 3) {
        buf = ::operator new[](size, pHeap, 0x20);
        mBuffer[2] = buf;
        mXfbAllocated[2] = true;
    } else {
        mBuffer[2] = NULL;
        mXfbAllocated[2] = false;
    }
}