summaryrefslogtreecommitdiff
path: root/libs/JSystem/JUtility/JUTVideo.cpp
blob: cdb03f998b55ea93383eb0d23bc1f1571d0343b7 (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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
//
// Generated By: dol2asm
// Translation Unit: JUTVideo
//

#include "JSystem/JUtility/JUTVideo.h"
#include "JSystem/JUtility/JUTDirectPrint.h"
#include "JSystem/JUtility/JUTXfb.h"
#include "dolphin/gx.h"

/* 80451538-8045153C 000A38 0004+00 4/4 18/18 1/1 .sbss            sManager__8JUTVideo */
JUTVideo* JUTVideo::sManager;

/* 8045153C-80451540 000A3C 0004+00 2/2 1/1 0/0 .sbss            sVideoLastTick__8JUTVideo */
OSTick JUTVideo::sVideoLastTick;

/* 80451540-80451544 000A40 0004+00 2/2 1/1 0/0 .sbss            sVideoInterval__8JUTVideo */
OSTick JUTVideo::sVideoInterval;

/* 80451544-80451548 000A44 0004+00 4/4 0/0 0/0 .sbss            None */
static bool data_80451544;

/* 802E4C54-802E4CAC 2DF594 0058+00 0/0 1/1 0/0 .text
 * createManager__8JUTVideoFPC16_GXRenderModeObj                */
JUTVideo* JUTVideo::createManager(_GXRenderModeObj const* param_0) {
    if (sManager == NULL) {
        sManager = new JUTVideo(param_0);
    }
    return sManager;
}

/* 802E4CAC-802E4CF4 2DF5EC 0048+00 0/0 2/2 0/0 .text            destroyManager__8JUTVideoFv */
void JUTVideo::destroyManager() {
    if (sManager != NULL) {
        delete sManager;
        sManager = NULL;
    }
}

/* 802E4CF4-802E4DE8 2DF634 00F4+00 1/1 0/0 0/0 .text __ct__8JUTVideoFPC16_GXRenderModeObj */
JUTVideo::JUTVideo(GXRenderModeObj const* param_0) {
    mRenderObj = NULL;
    VIInit();
    mSetBlack = true;
    mSetBlackFrameCount = 2;
    setRenderMode(param_0);
    VISetBlack(1);
    VIFlush();
    field_0x8 = 0;
    mRetraceCount = VIGetRetraceCount();
    field_0x10 = 1;
    field_0x18 = 0;
    sVideoLastTick = OSGetTick();
    sVideoInterval = 670000;
    mPreRetraceCallback = VISetPreRetraceCallback(preRetraceProc);
    mPostRetraceCallback = VISetPostRetraceCallback(postRetraceProc);
    mPreCallback = NULL;
    mPostCallback = NULL;
    OSInitMessageQueue(&mMessageQueue, &mMessage, 1);
    GXSetDrawDoneCallback(drawDoneCallback);
}

/* 802E4DE8-802E4E50 2DF728 0068+00 1/0 0/0 0/0 .text            __dt__8JUTVideoFv */
JUTVideo::~JUTVideo() {
    VISetPreRetraceCallback(mPreRetraceCallback);
    VISetPostRetraceCallback(mPostRetraceCallback);
}

/* 802E4E50-802E5088 2DF790 0238+00 1/1 0/0 0/0 .text            preRetraceProc__8JUTVideoFUl */
void JUTVideo::preRetraceProc(u32 retrace_count) {
    if (!sManager) {
        return;
    }

    if (sManager->mPreCallback) {
        (*sManager->mPreCallback)(retrace_count);
    }

    OSTick tick = OSGetTick();
    sVideoInterval = tick - sVideoLastTick;
    sVideoLastTick = tick;

    JUTXfb* xfb = JUTXfb::getManager();
    if (!xfb) {
        VISetBlack(TRUE);
        VIFlush();
        return;
    }

    static void* frameBuffer = NULL;

    if (frameBuffer) {
        JUTVideo* videoManager = JUTGetVideoManager();
        const GXRenderModeObj* renderMode = videoManager->getRenderMode();
        JUTDirectPrint* directPrint = JUTDirectPrint::getManager();
        directPrint->changeFrameBuffer(frameBuffer, renderMode->fb_width, renderMode->efb_height);
    }

    if (sManager->mSetBlack == 1) {
        s32 frame_count = sManager->mSetBlackFrameCount;
        if (frame_count > 0) {
            frame_count--;
        }

        sManager->mSetBlackFrameCount = frame_count;
        sManager->mSetBlack = frame_count != 0;
        VISetBlack(TRUE);
        VIFlush();
        return;
    }

    if (!xfb) {
        VISetBlack(TRUE);
        VIFlush();
        return;
    }

    if (xfb->getBufferNum() == 3 || xfb->getBufferNum() == 2) {
        if (!data_80451544) {
            s16 index = xfb->getDrawnXfbIndex();
            xfb->setDisplayingXfbIndex(index);
            if (index < 0) {
                VISetBlack(1);
                VIFlush();
            } else {
                VISetNextFrameBuffer(xfb->getDisplayingXfb());
                VIFlush();
                VISetBlack(FALSE);
                frameBuffer = xfb->getDisplayingXfb();
            }
        }
    } else if (xfb->getBufferNum() == 1) {
        if (xfb->getSDrawingFlag() == 0) {
            s16 index = xfb->getDrawnXfbIndex();
            if (index >= 0) {
                xfb->setDisplayingXfbIndex(index);
                GXCopyDisp(xfb->getDisplayingXfb(), GX_TRUE);
                GXFlush();
                xfb->setSDrawingFlag(2);
                frameBuffer = xfb->getDisplayingXfb();
                if (VIGetNextFrameBuffer()) {
                    VISetBlack(FALSE);
                }
            } else {
                VISetBlack(TRUE);
            }
        }
        VIFlush();
    }
}

/* 802E5088-802E50B0 2DF9C8 0028+00 0/0 1/1 0/0 .text            drawDoneStart__8JUTVideoFv */
void JUTVideo::drawDoneStart() {
    data_80451544 = true;
    GXSetDrawDone();
}

/* 802E50B0-802E50BC 2DF9F0 000C+00 0/0 1/1 0/0 .text            dummyNoDrawWait__8JUTVideoFv */
void JUTVideo::dummyNoDrawWait() {
    data_80451544 = false;
}

/* 802E50BC-802E5144 2DF9FC 0088+00 1/1 0/0 0/0 .text            drawDoneCallback__8JUTVideoFv */
void JUTVideo::drawDoneCallback() {
    JUTXfb* xfb = JUTXfb::getManager();
    if (!xfb) {
        return;
    }

    data_80451544 = false;
    if (xfb->getBufferNum() == 1) {
        if (xfb->getSDrawingFlag() == 1) {
            xfb->setSDrawingFlag(0);

            void* frameBuffer = xfb->getDrawnXfb();
            if (frameBuffer) {
                VISetNextFrameBuffer(xfb->getDrawnXfb());
                VIFlush();
            }
        }
    }
}

/* 802E5144-802E5198 2DFA84 0054+00 1/1 0/0 0/0 .text            postRetraceProc__8JUTVideoFUl */
void JUTVideo::postRetraceProc(u32 retrace_count) {
    if (!sManager) {
        return;
    }

    if (sManager->mPostCallback != NULL) {
        sManager->mPostCallback(retrace_count);
    }

    OSMessage message = (OSMessage*)VIGetRetraceCount();
    OSSendMessage(&sManager->mMessageQueue, message, OS_MESSAGE_NOBLOCK);
}

/* 802E5198-802E5210 2DFAD8 0078+00 1/1 2/2 0/0 .text
 * setRenderMode__8JUTVideoFPC16_GXRenderModeObj                */
void JUTVideo::setRenderMode(GXRenderModeObj const* pObj) {
    if (mRenderObj != NULL && pObj->vi_tv_mode != mRenderObj->vi_tv_mode) {
        mSetBlack = true;
        mSetBlackFrameCount = 4;
    }
    mRenderObj = (GXRenderModeObj*)pObj;
    VIConfigure(mRenderObj);
    VIFlush();

    if (mSetBlack) {
        VIWaitForRetrace();
        VIWaitForRetrace();
    }
}

/* 802E5210-802E5214 2DFB50 0004+00 0/0 1/1 0/0 .text            waitRetraceIfNeed__8JUTVideoFv */
void JUTVideo::waitRetraceIfNeed() {}